Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Побитовые операции в Perl, Проблема с результатом 
:(
    Опции темы
Ky6uk
Дата 8.7.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Необходимо реализовать C++-функцию для снятия XOR-шифрования с данных (в частности с пакета, прочитанного из сокета). Для примера возьмем статический пакет, полученный в этой теме:
Код

BA 00 00 68 70 B9 73 B9 AA 1B 2E 78 ED 27 6E B6
D1 BA 52 6A 69 B2 2C 44 04 11 CE BE 60 A0 DA 5D
5F 31 EE C0 BF 3C 8C D5 FD 52 60 EF 81 C1 9F 7D
C8 40 3D 98 C7 30 36 44 AA 09 0C 5B 26 D2 AE 5C
56 29 A8 EA A3 B7 87 B4 AB 39 6B 63 3B 4A F1 B0
02 B3 BA AA 06 55 E3 3F 8F 5E 95 71 E8 66 78 1B
F3 4C 69 0D 9A 5E B0 17 B4 BA E1 E5 C5 28 2C 82
8D 38 FB 4C 0D F8 28 28 3A 5D 7C B3 B5 79 87 D2
9B 9E 62 89 6E 8E DA 7E 2E D4 45 A1 3D FD 96 17
D9 27 41 2C 4A 3C 5A F4 3D F2 D3 05 27 50 5C 85
FA 77 BE F7 4D 2E 0C 6B 08 61 CF E6 61 E5 CA 6F
CD 8D 6F 3B 07 A1 E0 1F 1A 96

После дешифрования должен получиться пакет вида:
Код

BA 00 00 68 70 B9 5D 21 C6 00 00 F6 42 4E 20 5C
B7 28 8E 51 95 5C EA 3E 24 71 14 63 AC AE 00 E2
E9 D5 9A 94 44 ED EC 40 83 EC 07 BD C9 01 BC 15
73 6F 0F 5C AE C6 C2 70 B4 3B AE 17 8C F4 06 89
F6 43 D7 9E C5 6E 2C E8 62 F0 64 13 39 C5 7B 26
04 1E 59 4A 78 74 88 AF A8 BF BD 76 E7 DA 2F EE
76 7A 19 1E 2E 34 2F 0A 09 6D 3D 64 B6 3F 79 41
8F 90 D3 54 17 AD 54 59 51 04 01 61 2D 14 65 A4
81 18 C8 4B BB 25 19 DE 3D 97 D3 4E 95 DD 29 FC
9C C3 77 20 B6 AD 97 F7 E0 BD 07 79 AD 03 E6 2C
38 9A 42 AF 45 71 C9 8D D7 83 05 00 5D 91 A5 54
CA 2C 6F 3B 07 A1 E0 1F 1A 96

Известно, что последние 8 и первые 2 байта не шифруются.  XOR-ключом являются 4 предпоследних байта в обратном порядке (A1 6F 07 3B).
Рабочая функция на С++:
Код

bool Packet::decodeXOR()
{
    unsigned int   blen   = getPacketSize();
    unsigned char *packet = b.getBytesPtr();
    unsigned int xor_offset = 8;
    unsigned int xor_key = 0;
    unsigned char b = 0;
    b = packet[ blen - xor_offset ];
    xor_key |= (unsigned int)b;
    b = packet[ blen - xor_offset + 1 ];
    xor_key |= ( (unsigned int)b << 8 );
    b = packet[ blen - xor_offset + 2 ];
    xor_key |= ( (unsigned int)b << 16 );
    b = packet[ blen - xor_offset + 3 ];
    xor_key |= ( (unsigned int)b << 24 );
    
    unsigned int offset = 2;
    unsigned int edx = 0;
    unsigned int ecx = xor_key;
    
    offset = blen - xor_offset - 4;
    while( offset > 2 )
    {
        edx  = (packet[offset+0] & 0xFF);
        edx |= (packet[offset+1] & 0xFF) << 8;
        edx |= (packet[offset+2] & 0xFF) << 16;
        edx |= (packet[offset+3] & 0xFF) << 24;

        edx ^= ecx;
        ecx -= edx;

        packet[offset+0] = (unsigned char)((edx)       & 0xFF);
        packet[offset+1] = (unsigned char)((edx >>  8) & 0xFF);
        packet[offset+2] = (unsigned char)((edx >> 16) & 0xFF);
        packet[offset+3] = (unsigned char)((edx >> 24) & 0xFF);
        offset -= 4;
    }
    return true;
}


Хотелось бы реализовать данный алгоритм на Perl, без использования inline.
Написанный мной код работает не совсем верно. Верно получается только XOR-ключ, но конечный результат неверен. В чем проблема понять не могу. Буду благодарен за подсказку.

Мой алгоритм дешифрования:
Код

#!/usr/bin/perl -w

use strict;
use Data::Dumper;

my @dec_bytes = split //, pack("H*", "BA00006870B973B9AA1B2E78ED276EB6D1BA526A69B22C440411CEBE60A0DA5D5F31EEC0BF3C8CD5FD5260EF81C19F7DC8403D98C7303644AA090C5B26D2AE5C5629A8EAA3B787B4AB396B633B4AF1B002B3BAAA0655E33F8F5E9571E866781BF34C690D9A5EB017B4BAE1E5C5282C828D38FB4C0DF828283A5D7CB3B57987D29B9E62896E8EDA7E2ED445A13DFD9617D927412C4A3C5AF43DF2D30527505C85FA77BEF74D2E0C6B0861CFE661E5CA6FCD8D6F3B07A1E01F1A96");

print "------------ Снимаем XOR ------------\n";
my $blen = scalar @dec_bytes;
my ($xor_offset, $xor_key) = (8, 0);

$xor_key |= ( ord($dec_bytes[ $blen - $xor_offset + 0 ]) <<  0 );
$xor_key |= ( ord($dec_bytes[ $blen - $xor_offset + 1 ]) <<  8 );
$xor_key |= ( ord($dec_bytes[ $blen - $xor_offset + 2 ]) << 16 );
$xor_key |= ( ord($dec_bytes[ $blen - $xor_offset + 3 ]) << 24 );

print "Ключ XOR: ".&dec2hex($xor_key)."\n";

my $edx = 0;
my $ecx = $xor_key;
my $offset = $blen - $xor_offset - 4;

while ( $offset > 2 ) {
    $edx  = (ord($dec_bytes[ $offset + 0 ]) & 0xFF) <<  0;
    $edx |= (ord($dec_bytes[ $offset + 1 ]) & 0xFF) <<  8;
    $edx |= (ord($dec_bytes[ $offset + 2 ]) & 0xFF) << 16;
    $edx |= (ord($dec_bytes[ $offset + 3 ]) & 0xFF) << 24;

    $edx ^= $ecx;
    $ecx -= $edx;

    $dec_bytes[ $offset + 0 ] = chr (($edx >>  0)    & 0xFF);
    $dec_bytes[ $offset + 1 ] = chr (($edx >>  8)    & 0xFF);
    $dec_bytes[ $offset + 2 ] = chr (($edx >> 16)    & 0xFF);
    $dec_bytes[ $offset + 3 ] = chr (($edx >> 24)    & 0xFF);
    $offset -= 4;
}

print map { &dec2hex( ord $_ ), " " } @dec_bytes;

PM MAIL ICQ Jabber   Вверх
ginnie
Дата 8.7.2008, 21:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Ky6uk, предлагаю свой вариант

Код

use strict;
use warnings;

my $source_packet = 'BA00006870B973B9AA1B2E78ED276EB6D1BA526A69B22C440411CEBE60A0DA5D5F31EEC0BF3C8CD5FD5260EF81C19F7DC8403D98C7303644AA090C5B26D2AE5C5629A8EAA3B787B4AB396B633B4AF1B002B3BAAA0655E33F8F5E9571E866781BF34C690D9A5EB017B4BAE1E5C5282C828D38FB4C0DF828283A5D7CB3B57987D29B9E62896E8EDA7E2ED445A13DFD9617D927412C4A3C5AF43DF2D30527505C85FA77BEF74D2E0C6B0861CFE661E5CA6FCD8D6F3B07A1E01F1A96';
my $start_part = substr($source_packet, 0, 4, '');
my $end_part = substr($source_packet, -16, 16, '');
my $key = pack('H*', substr($end_part, 0, 8));
my @decoded_parts;
while (my $part = substr($source_packet, -8, 8, '') ) {
    my $hex_part = pack('H*', $part);
    my $decoded_part = $key ^ $hex_part;
    push(@decoded_parts, sprintf('%02X' x 4, unpack('C*', $decoded_part)));
    $key = pack('i', unpack('I', $key) - unpack('I', $decoded_part));
}
my $decoded_packet = join('*', $start_part, reverse(@decoded_parts), $end_part);
print $decoded_packet;


результат работы отличается от того, что должно получится тем, что у Вас байты 3, 4, 5, 6 не расшифрованы, хотя должны бы судя по исходнику.


Это сообщение отредактировал(а) ginnie - 8.7.2008, 21:57


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ky6uk
Дата 8.7.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Благодарю за вариант, но он опять же не ведет к желаемому результату.
Для начала ключ должен идти в обратном порядке. В первом посте указан ключ, который должен получиться.
Так же выше указан ожидаемый результат декодирования (получившийся с помощью функции декодирования написанной на С++). Может я сам не совсем понял алгоритм расшифровки, приведенный на С++, но он верный (нужный мне для правильного декодирования пакета). По этому старался сделать аналогию.
PM MAIL ICQ Jabber   Вверх
Ky6uk
Дата 8.7.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



После анализа еще нескольких расшифрованых пакетов заметил закономерность:
1. Первые 2 байта BA 00 не шифруются и означают длину пакета (об этом написано выше).
2. Третий байт всегда 00.
3. 8, 9, 10 и 11 байты всегда постоянны и равны 21 C6 00 00
4. Последние восемь байт остаются нетронутыми до и после дешифрования.
5. предпоследние четыре байта в обратном порядке составляют XOR-ключ.

Мой алгоритм, написаный по аналогии с сишным выполняет все пункты, кроме п.3. Почему пока не понял. 

Это сообщение отредактировал(а) Ky6uk - 8.7.2008, 23:45
PM MAIL ICQ Jabber   Вверх
ginnie
Дата 9.7.2008, 11:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Ky6uk, мой исправленый вариант

Код

use strict;
use warnings;

my $source_packet = 'BA00006870B973B9AA1B2E78ED276EB6D1BA526A69B22C440411CEBE60A0DA5D5F31EEC0BF3C8CD5FD5260EF81C19F7DC8403D98C7303644AA090C5B26D2AE5C5629A8EAA3B787B4AB396B633B4AF1B002B3BAAA0655E33F8F5E9571E866781BF34C690D9A5EB017B4BAE1E5C5282C828D38FB4C0DF828283A5D7CB3B57987D29B9E62896E8EDA7E2ED445A13DFD9617D927412C4A3C5AF43DF2D30527505C85FA77BEF74D2E0C6B0861CFE661E5CA6FCD8D6F3B07A1E01F1A96';
my $end_part = substr($source_packet, -16, 16, '');
my $key = pack('H*', substr($end_part, 0, 8));
my @decoded_parts;
while ( length($source_packet) - 8 > 4 ) {
    my $hex_part = pack('H*', substr($source_packet, -8, 8, ''));
    my $decoded_part = $key ^ $hex_part;
    push(@decoded_parts, sprintf('%02X' x 4, unpack('C*', $decoded_part)));
    $key = pack('i', unpack('I', $key) - unpack('I', $decoded_part));
}
my $decoded_packet = join('', $source_packet, reverse(@decoded_parts), $end_part);
print $decoded_packet;


в результате расшифровки получаем код, который Вы привели. В предыдущем варианте я неверно определил момент окончания расшифровки, кроме того, забыл убрать отладочный вывод символами "*".
С ключом в моем варианте все нормально, просто у Вас используется целочисленное представление значения, а у меня побитовое. Для перевода в целочисленное надо использовать unpack('I', $key).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ky6uk
Дата 9.7.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Хм. У меня получается не тот результат.

Для примера выладываю еще один декодированый пакет программой на С++.
До:
Код

BA 00 00 0D 1A 3A B7 15 69 A0 08 DC B0 60 08 08
D6 AD 46 37 B8 54 BB 7C 5E 91 6E 04 69 4B 5C 2A
B9 C7 6C 47 16 1C 65 30 23 0C FF FB 20 AE 0E F0
3F DE FF 18 67 3D AF FD 6C DC BB 40 FC C4 C8 D4
6F E4 0F 7A A8 52 4D 3D 8B 68 53 32 F5 49 7C 5C
9B 09 24 F9 4D D8 34 36 24 9A 2A 91 43 20 79 38
55 61 C0 0C 42 31 39 A0 F7 22 C7 D1 71 B1 2F A5
E0 46 97 A9 30 3C 45 E4 1B F2 B2 BD D5 B2 52 05
6A 66 99 38 E8 9B 1C 25 E7 7E 5D C1 7A 56 ED 77
10 8C 4C 8C F4 50 45 54 C3 06 DE 63 24 4B 6F 88
DF 83 E4 72 85 B4 13 5F A3 AF 59 08 2B 39 6D 3F
00 D8 B6 A4 F8 F6 E2 8A 90 4B

После:
Код

BA 00 00 0D 1A 3A BF 21 C6 00 00 D4 06 FA B2 C6
B1 99 DF BC 69 3A 91 78 C7 5B 32 22 FE 74 00 13
57 D4 09 B7 F4 E7 98 6B FC 69 01 D4 22 64 B9 E7
5E 2B A4 64 83 66 FA 42 D7 E0 F3 EB 23 67 C3 1E
C8 A9 C2 58 D3 8A 60 0F 58 DE 9F 81 93 4F 58 F5
DE A1 C8 2C 96 BD EE B8 65 7A 2D 49 91 7E B9 34
EB 91 09 93 D7 EC FE 0F B9 73 28 B3 11 F0 A0 33
D0 A2 AC 0D C8 2D 37 A8 D1 7C E0 B8 0F 17 25 F2
4D F1 95 E3 74 46 C9 65 BD D0 C6 4E 95 DD 29 FC
9C C3 77 20 B6 AD 97 F7 E0 BD 07 E4 01 C8 4B 65
5D F0 EB C3 DB E9 4A 57 76 79 82 00 2B F1 DB 9B
F8 2E B6 A4 F8 F6 E2 8A 90 4B


Не могу понять где запарка в алгоритме...

Добавлено через 4 минуты и 54 секунды
Байты под номерами 8, 9, 10 и 11 во всех случаях должны быть постоянны и равны 21 C6 00 00. Байт номер 3 так же постоянен и равен 00.
PM MAIL ICQ Jabber   Вверх
ginnie
Дата 9.7.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Ky6uk, у меня программа выдает 

Код

BA00000D1A3ABF21C60000D406FAB2C6B199DFBC693A9178C75B3222FE74001357D409B7F4E7986BFC6901D42264B9E75E2BA4648366FA42D7E0F3EB2367C31EC8A9C258D38A600F58DE9F81934F58F5DEA1C82C96BDEEB8657A2D49917EB934EB910993D7ECFE0FB97328B311F0A033D0A2AC0DC82D37A8D17CE0B80F1725F24DF195E37446C965BDD0C64E95DD29FC9CC37720B6AD97F7E0BD07E401C84B655DF0EBC3DBE94A57767982002BF1DB9BF82EB6A4F8F6E28A904B


а у Вас что?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ky6uk
Дата 9.7.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Код

BA00000D1A3ABF21C6C000D40604B2C6B166DFBCE9C5917807A432220E8B0013AB2B09B70A1880AB03960D34D10B0F17A71CFF1867BDFA42D7E0F3EB2367C31EC8A9C258D38A600F58DE9F81934F58F5DEA1C82C96BDEEB8657A2D49917EB934EB9107534AEC39A0F7A2284D6EF0A0CCEF9A2CB2D43145E41B72E0B80FEB25F24D0E95E3F479C9657DCFC64E75DA29FC632377A0C9510737DF434F1404376F88DF03EBC3DBE94A57767982002BF1DB9BF82EB6A4F8F6E28A904B

Видите? в десятом байте например С0 вметсо 00.

Вроде сделал даже копипаст кода в новый файл. Ничего не понимаю...

Это сообщение отредактировал(а) Ky6uk - 9.7.2008, 13:28
PM MAIL ICQ Jabber   Вверх
shamber
Дата 9.7.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Код

BA00006870B9A5AEC1F9BC31C3626EB6D13A8E5195A2EA3EE48E1463525100E2162A9A14BB12EC807C12075DC67EBCE5F3700F245EC9C27E4CB86E107035F68A08A32B9EF69E12286F8C6B633BCA7B2604E0594A780B88AF6880BD7607DD2FEE8679191ED6342F0A776D3D64B93F79C18890D394D4AC54797104017D3D1465AA89184408BFA5DA7E2E54D34E95DD29FC9CC37720B6AD97F7E0BD0779AD03E62C389A42AF4571C98DD78305005D91A554CA2C6F3B07A1E01F1A96

вот так у меня
PM MAIL Jabber   Вверх
ginnie
Дата 9.7.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Ky6uk, удалось воспроизвести Ваш результат на Windows (я тестировал на FreeBSD). Попробую разобраться в чем дело.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ky6uk
Дата 9.7.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Если важно, то у меня Debian.
PM MAIL ICQ Jabber   Вверх
shamber
Дата 9.7.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



У Меня WINXP
PM MAIL Jabber   Вверх
ginnie
Дата 9.7.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



В ходе исследования выяснилось, что в perl 5.8.8 от Activestate (Windows)

Код

perl -e "printf('%X', -2357007068)";


возвращается 80000000 вместо 7382ED24. Напрямую к текущей проблеме не относится, но все-же странно.

Добавлено через 4 минуты и 42 секунды
Еще странно следующее

Код

perl -e "print unpack('I', pack('i', -2357007068))";


должен возвращать 1937960228 (это беззнаковое представление числа -2357007068, именно так его возвращает perl во FreeBSD), а под Windows возвращается 2147483648.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ky6uk
Дата 9.7.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Код

~$ perl --version

This is perl, v5.10.0 built for i486-linux-gnu-thread-multi


Код

~$ perl -e "printf('%X', -2357007068)";
80000000


Я так полагаю будет необходимостью провести дополнительные операции для получения желаемого результата? Есть идеи?
PM MAIL ICQ Jabber   Вверх
ginnie
Дата 9.7.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Ky6uk, получается, что неверно упаковываются некоторые отрицательные числа, при этом их беззнаковые эквиваленты обрабатываются нормально. Для нормальной работы надо перевести знаковые значения в беззнаковые.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.