Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Кейген своими руками

GL#0M (gl00m-crk@yandex.ru)

Спецвыпуск: Хакер, номер #057, стр. 057-044-4


00409B7F . BF 48B94200mov edi, _KEY ; edi = "A02DD91A-C700-47b7-82D8-10E68082B4C0"

00409B84 . 8BCE mov ecx, esi

00409B86 . 33C0 xor eax, eax

00409B88 . F2:AErepne scas byte ptr es:[edi]

00409B8A . F7D1 not ecx

00409B8C . 49 dec ecx ; длина строки = 36 ;)

00409B8D . 895C24 28mov dword ptr [esp+28h], ebx; 1 dword вспомогательного буфера = ebx = 0

00409B91 . 51 pushecx ; 2 параметр

00409B92 . 68 48B94200push_KEY; 1 параметр

00409B97 . 8BCA mov ecx, edx; ecx = указатель на выделенную память

00409B99 . 895C24 34mov dword ptr [esp+34h], ebx; 2 dword вспомогательного буфера = ebx = 0

00409B9D . E8 5E74FFFFcallBlowfish_SetKey

00409BA2 . 8BF8 mov edi, eax; edi = указатель на развернутый ключ

1. A02DD91A-C700-47b7-82D8-10E68082B4C0 - это не что иное, как ключ шифрования ;).

2. Вспомогательный буфер используется в качестве счетчика циклов в данной реализации Blowfish.

3. Blowfish_SetKey - функция развертывание ключа.

Почему я решил, что это именно Blowfish_SetKey? Естественно, не с потолка взял =). Пришлось пройти ее всю под отладчиком и понять, что она делает. А иначе никак... Хотя в данном случае есть некоторые моменты, которые мне хотелось бы выделить:

.text:0040100B mov ebx, [esp+54h+keylength]; EBX = длина ключа

..............

.text:00401011 cmp ebx, 1

..............

.text:00401028 jnb short loc_40104F

.text:0040102A lea eax, [esp+54h+zerobuf]

.text:0040102E lea ecx, [esp+54h+var_44]

.text:00401032 pusheax

.text:00401033 mov [esp+58h+zerobuf], offset aIncorrectKeyLe ; "Incorrect key length"

.text:0040103B call??0exception@@QAE@ABQBD@Z ; exception::exception(char const * const &)

Текст ошибки ("Incorrect key length") сразу же выдает назначение данной функции. Наши догадки подтверждает следующий код:

0040104F . 83FB 38cmp ebx, 38h<= сравнение длины ключа с 56

00401052 . 76 05jbe short 00401059h

00401054 . BB 38000000mov ebx, 38h

Вспоминаем фразу "Преобразует ключ длиной до 56-ти байт" ;).

В недрах функции мы можем увидеть работу с массивами, до боли напоминающими PBox и SBox =).

.text:00401078 mov ecx, 12h ; "PBox состоит из 18 подключей"

.text:0040107D mov esi, offset PBox

.text:00401082 mov edi, edx

.text:00401084 mov [esp+5Ch+keylength], 12h

.text:0040108C rep movsd

.text:0040108E lea edi, [ebp+58h]

.text:00401091 mov ecx, 400h; "Каждый из четырех массивов SBox содержит 256 подключей"

.text:00401096 mov esi, offset SBox

.text:0040109B rep movsd

Также можно заметить внутри функции два цикла с участием довольно объемной функции - это Blowfish_Encrypt. Наличие этих циклов также обязательно для Blowfish_SetKey.

Одним словом, нет сомнений, что это именно функция развертывание ключа.

Что дальше? А дальше, как уже все догадались, идет Blowfish_Encrypt... Или Blowfish_Decrypt? Хех, смотрим:

00409BBF . 53 pushebx ; 4 параметр (ebx = 0, флаг режима)

00409BC0 . 8D8C24 2C020000lea ecx, dword ptr [esp+22Ch] ; ecx = указатель на лицензионный код (бинарный вид)

00409BC7 . 8B42 F8mov eax, dword ptr [edx-8h] ; eax = 16 (длина лицензионного кода)

00409BCA . 99 cdq

00409BCB . 2BC2 sub eax, edx

00409BCD . D1F8 sar eax, 1h

Назад на стр. 057-044-3  Содержание  Вперед на стр. 057-044-5