----------------------------------- Как написать keygen для Cool label ----------------------------------- Автор : stealthFIGHTER Перевод : Fujitzu\TEAM C-16 Цель : Cool label v2.0 build 111 Инструменты : OllyDbg, IDA, VC++ Защита : MD5 --------------- ---[ Шаг 1 ]--- --------------- ======================================================================= Загрузите вашу цель в OllyDbg. Используйте api GetWindowTextLength api, чтобы прерваться на проверке name/serial check. Потрейсите немного , пройдите несколько RET-ов и первый полезный код вот такой: ======================================================================= :00409521 call ?MakeUpper@CString@@QAEXXZ ;Знаки в верхний регистр :00409526 mov ecx, offset unk_0_525414 ;ECX = введённое имя :0040952B call sub_0_4022E0 ;Получаем длину имени :00409530 mov [ebp+var_320], eax ;var_320 = eax (длина) :00409536 cmp [ebp+var_320], 5 ;If var320 < 5, то :0040953D jle loc_0_409850 ;jump отсюдова =) ======================================================================= Тут мы видим, что длина нашего имени должна быть > 5 и все знаки в нашем имени переведены в верхний регистр. Потрейсите немного (или переключитесь в IDA и посмотрите код там): ======================================================================= :00409577 lea ecx, [ebp+MD5_CTX] ;ECX = MD5 context :0040957D call MD5_Init ;MD5 Init function ======================================================================= Ух ты! нициализация хэша MD5. Откуда я знаю это? В IDA дважды кликните по CALL (заметьте, Я переименовал 44D190 в MD5_Init) и вы увидите это: ======================================================================= :0044D1AE mov dword ptr [edx], 67452301h ;1-ая константа :0044D1B4 mov eax, [ebp+var_4] :0044D1B7 mov dword ptr [eax+4], 0EFCDAB89h ;2-ая константа :0044D1BE mov ecx, [ebp+var_4] :0044D1C1 mov dword ptr [ecx+8], 98BADCFEh ;3-я константа :0044D1C8 mov edx, [ebp+var_4] :0044D1CB mov dword ptr [edx+0Ch], 10325476h ;4-ая константа ======================================================================= Итак, программа инициализирует это 4 константы. В OllyDbg потрейсим до: ======================================================================= :004095A9 mov [ebp+var_25C], 17h ;1-ое значение :004095B0 mov [ebp+var_25A], 22h ;3-е значение :004095B7 mov [ebp+var_259], 43h ;4-ое значение :004095BE mov [ebp+var_258], 38h ;5-ое значение :004095C5 mov [ebp+var_298], 0 :004095CC mov cl, [ebp+var_298] :004095D2 mov [ebp+var_299], cl :004095D8 mov dl, [ebp+var_299] :004095DE mov [ebp+var_29A], dl :004095E4 mov al, [ebp+var_29A] :004095EA mov [ebp+var_29B], al :004095F0 mov cl, [ebp+var_29B] :004095F6 mov [ebp+var_29C], cl : : :00409624 mov [ebp+var_25B], 2Dh ;2-ое значение : ======================================================================= Тут мы видим, что 5 значений "задвинуты" в массив. В OllyDbg вы можете видеть, что в начале этого массива содержится 36 шестёрок. после того, как вы прошли 00409624 массив должен выглядеть так (dump из OllyDbg): ======================================================================= 17 2D 22 43 38 36 36 36 36 36 36 36 36 36 36 36 -"C866666666666 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 6666666666666666 ======================================================================= Теперь в IDA поскролим до: ======================================================================= :00409637 @@loop: :00409637 mov ecx, [ebp+var_230] :0040963D add ecx, 1 ;увеличиваем счётчик :00409640 mov [ebp+var_230], ecx :00409646 :00409646 loc_0_409646: :00409646 cmp [ebp+var_230], 20h ;длина массива = 32 chars. :0040964D jge short @@away :0040964F mov edx, [ebp+var_230] :00409655 mov eax, [ebp+var_230] :0040965B mov cl, [ebp+eax+var_29C] :00409662 mov [ebp+edx+var_257], cl :00409669 jmp short @@loop ======================================================================= В этом цикле наше имя помещается в массив а остальное заполняется нулями. Так что после того, как вы пройдёте это место массив должен выглядеть так: ======================================================================= 17 2D 22 43 38 53 54 45 41 4C 54 48 46 49 47 48 -"C8STEALTHFIGHT 54 45 52 00 00 00 00 00 00 00 00 00 00 00 00 00 ER.............. ======================================================================= :0040966B push offset aCoollabel_0 ;const char "CoolLabel" :00409670 call _strlen ;возвращает длину "CoolLabel" :00409675 add esp, 4 :00409678 push eax ;eax = strlen("CoolLabel)" :00409679 push offset aCoollabel_1 ;push string "CoolLabel" :0040967E lea ecx, [ebp+MD5_CTX] ;ecx = MD5 context :00409684 call MD5_Update ;MD5 update function ======================================================================= Первая. MD5 update function: MD5Update(&md,"CoolLabel",9); ======================================================================= В IDA ниже вы должны увидеть вот это: ======================================================================= :00409689 push 25h ;длина входных данных = 37 :0040968B lea edx, [ebp+var_25C] ;edx = нам массив :00409691 push edx ;push array :00409692 lea ecx, [ebp+MD5_CTX] ;ecx = MD5 context :00409698 call MD5_Update ;MD5 update function ======================================================================= Вторая. MD5 update function: MD5Update(&md,szArray,0x25); ======================================================================= В IDA ниже вы можете увидеть: ======================================================================= :0040969D lea eax, [ebp+szSerial] ;eax = szSerial :004096A3 push eax ; push eax (szSerial) :004096A4 lea ecx, [ebp+MD5_CTX] ; ecx = MD5 context :004096AA call MD5_Final ======================================================================= MD5 final function: MD5Final(&md,szSerial); ======================================================================= Итак, вы видите, что финальный результат у нас форматируется (from MD5Final function) и формат серийного номера такой '%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x'. ======================================================================= Время кейгенить: 1. Имя пользователя нужно перевести в верхний регист. 2. Поместите пять значений (0x17, 0x2D, 0x22, 0x43, 0x38) в начале массива 3. Поместите все значи имени в массив, а остальное заполните нулями 4. инициализируйте хэш MD5 5. Обновите MD5 сторокой "CoolLabel" (без ковычек) и длиной 9 6. Обновите MD5 нашим массивом и длиной 37 7. Финализируйте хэш MD5 8. Отформатируйте результат (xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx) 9. Переведите результат в нижний регистр ======================================================================= А вот мой исходник на VC++: ======================================================================= //**********_Begin_algorithm_here_************ nameLength = strlen(szName); ;get length of name szArray[0] = 0x017; ;put szArray[1] = 0x02D; ;these szArray[2] = 0x022; ;values szArray[3] = 0x043; ;into szArray[4] = 0x038; ;array for (i=0; i