Кейген своими руками 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 |