Взлом кейгенми "s3rh47s KeygenMe 4"
Взлом кейгенми "s3rh47's KeygenMe 4"
Скачать можно отсюда: http://crackmes.de/users/s3rh47/keygenme_4_by_s3rh47/
Файл самого кейгенми размером в 126 килобайт, что подтолкнуло к мысле о дельфи или большом количестве кода. Благо нет ни того ни другого.
Открыв в Олли стало видно хороший, чистый код, без ВМ и прочего. Пролистав чуточку вниз видно вызов GetDlgItemTextA:
0040120B |. 68 90010000 PUSH 190 ; /Count = 190 (400.)
00401210 |. 68 D8304000 PUSH KeygenMe.004030D8 ; |Buffer = KeygenMe.004030D8
00401215 |. 68 EB030000 PUSH 3EB ; |ControlID = 3EB (1003.)
0040121A |. FF75 08 PUSH [ARG.1] ; |hWnd
0040121D |. E8 70010000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
Поставив брэкпоинт на все вызовы GetDlgItemTextA, бросается в глаза то, что правильный псевдосерийник(ПС) генерируется при каждом вводе символа имени.
Далее генерируется какое-то подобие ключа:
00401238 |> \8BC8 MOV ECX,EAX
0040123A |. 33DB XOR EBX,EBX
0040123C |. 8D35 D8304000 LEA ESI,DWORD PTR DS:[4030D8]
00401242 |> 33C0 /XOR EAX,EAX
00401244 |. AC |LODS BYTE PTR DS:[ESI]
00401245 |. F7E9 |IMUL ECX
00401247 |. 03D8 |ADD EBX,EAX
00401249 |.^ E2 F7 \LOOPD SHORT KeygenMe.00401242
Как видим, перед циклом в ECX копируется длина имени, в ESI - указатель на строку с именем. На выходе имеем ключ в EBX. Далее идет генерация правильного ПС.
Длина его будет 18h:
0040124B |. B9 18000000 MOV ECX,18
В EDI указатель на участок памяти, в который сгенерируется ПС:
00401250 |. 8D3D 68324000 LEA EDI,DWORD PTR DS:[403268]
В ESI указатель на строку с данными для генерации ПС. По адресу лежит строка "Q1WE2RT3ZU4IO5PA6SD7FG8HJ9KL0YXCVBNMQ1WE2RT3ZU4IO5PA6SD7FG8HJ9KL0YXCVBNM":
00401256 |> 8D35 00304000 /LEA ESI,DWORD PTR DS:[403000]
Передаем через стэк ключ в EBX процедуре KeygenMe.0040128D, которая генерирует число, участвующее в генерации символа ПС:
0040125C |. 51 |PUSH ECX
0040125D |. 53 |PUSH EBX
0040125E |. E8 2A000000 |CALL KeygenMe.0040128D
00401263 |. 59 |POP ECX
К указателю строки "Q1WE2RT3ZU4..." добавляется результат выполнения KeygenMe.0040128D, таким образом символ ПС окончательно формируется и сохраняется по адресу в EDI:
00401264 |. 03F0 |ADD ESI,EAX
00401266 |. AC |LODS BYTE PTR DS:[ESI]
00401267 |. AA |STOS BYTE PTR ES:[EDI]
00401268 |.^ E2 EC \LOOPD SHORT KeygenMe.00401256
Вставляем 4 символа "-" в ПС:
0040126A |. B0 00 MOV AL,0
0040126C |. AA STOS BYTE PTR ES:[EDI]
0040126D |. C605 6C324000 2D MOV BYTE PTR DS:[40326C],2D
00401274 |. C605 71324000 2D MOV BYTE PTR DS:[403271],2D
0040127B |. C605 76324000 2D MOV BYTE PTR DS:[403276],2D
00401282 |. C605 7B324000 2D MOV BYTE PTR DS:[40327B],2D
Процедура генерации ПС KeygenMe.0040128D выглядит таким образом.
Инициализация, копирование в EAX переданного через стэк ключа:
0040128D /$ 55 PUSH EBP
0040128E |. 8BEC MOV EBP,ESP
00401290 |. 8B45 08 MOV EAX,[ARG.1]
00401293 |. A9 00000080 TEST EAX,80000000
00401298 |. 74 05 JE SHORT KeygenMe.0040129F
0040129A |. 05 FFFFFF7F ADD EAX,7FFFFFFF
Далее идет преобразование ключа и выделение из него нужного числа получением остатка от деления на 24h:
0040129F |> 33D2 XOR EDX,EDX
004012A1 |. B9 1DF30100 MOV ECX,1F31D
004012A6 |. F7F1 DIV ECX
004012A8 |. 8BC8 MOV ECX,EAX
004012AA |. B8 A7410000 MOV EAX,41A7
004012AF |. F7E2 MUL EDX
004012B1 |. 8BD1 MOV EDX,ECX
004012B3 |. 8BC8 MOV ECX,EAX
004012B5 |. B8 140B0000 MOV EAX,0B14
004012BA |. F7E2 MUL EDX
004012BC |. 2BC8 SUB ECX,EAX
004012BE |. 33D2 XOR EDX,EDX
004012C0 |. 8BC1 MOV EAX,ECX
004012C2 |. 8BD9 MOV EBX,ECX
004012C4 |. B9 24000000 MOV ECX,24
004012C9 |. F7F1 DIV ECX
004012CB |. 8BC2 MOV EAX,EDX
004012CD |. C9 LEAVE
004012CE \. C2 0400 RETN 4
В результате функция возвращает в EAX конечное число - указатель на символ строки "Q1WE2RT3ZU4..." относительно её начала.
После исполнения вышеописанного кода получаем псевдосерийник, который при вводе кода сравнивается с введенным кодом(ВК), обработанным по другому алгоритму:
00401115 |> \8BC8 MOV ECX,EAX
00401117 |. 8D35 88354000 LEA ESI,DWORD PTR DS:[403588]
0040111D |. 8D3D 18374000 LEA EDI,DWORD PTR DS:[403718]
00401123 |> AC /LODS BYTE PTR DS:[ESI]
00401124 |. 83F8 2D |CMP EAX,2D
00401127 |. 75 02 |JNZ SHORT KeygenMe.0040112B
00401129 |.^ E2 F8 |LOOPD SHORT KeygenMe.00401123
0040112B |> AA |STOS BYTE PTR ES:[EDI]
0040112C |.^ E2 F5 \LOOPD SHORT KeygenMe.00401123
0040112E |. B0 00 MOV AL,0
00401130 |. AA STOS BYTE PTR ES:[EDI]
В ECX и EAX - длина ВК (18h). В цикле происходит выбрасываение символов "-", в результате чего получаем строку длиной 14h. В ESI - указатель на строку, в EDI - на участок памяти под строку без "-".
Далее полученная выше строка реверсируется:
00401140 |. B9 14000000 MOV ECX,14
00401145 |. 8D3D 88354000 LEA EDI,DWORD PTR DS:[403588]
0040114B |> 0FB681 17374000 /MOVZX EAX,BYTE PTR DS:[ECX+403717]
00401152 |. AA |STOS BYTE PTR ES:[EDI]
00401153 |.^ E2 F6 \LOOPD SHORT KeygenMe.0040114B
В регистры загружается полученная выше строка и применяется операция "byte swap" с перемещением элементов:
00401164 |. A1 88354000 MOV EAX,DWORD PTR DS:[403588]
00401169 |. 8B0D 8C354000 MOV ECX,DWORD PTR DS:[40358C]
0040116F |. 8B15 90354000 MOV EDX,DWORD PTR DS:[403590]
00401175 |. 8B1D 94354000 MOV EBX,DWORD PTR DS:[403594]
0040117B |. 8B35 98354000 MOV ESI,DWORD PTR DS:[403598]
00401181 |. 0FC8 BSWAP EAX
00401183 |. 0FC9 BSWAP ECX
00401185 |. 0FCA BSWAP EDX
00401187 |. 0FCB BSWAP EBX
00401189 |. 0FCE BSWAP ESI
0040118B |. 8915 18374000 MOV DWORD PTR DS:[403718],EDX
00401191 |. A3 1C374000 MOV DWORD PTR DS:[40371C],EAX
00401196 |. 8935 20374000 MOV DWORD PTR DS:[403720],ESI
0040119C |. 891D 24374000 MOV DWORD PTR DS:[403724],EBX
004011A2 |. 890D 28374000 MOV DWORD PTR DS:[403728],ECX
Ниже происходит вызов KeygenMe.004012D1, которой передается строка, полученная выше:
004011A8 |. 68 18374000 PUSH KeygenMe.00403718
004011AD |. E8 1F010000 CALL KeygenMe.004012D1
Сама процедура генерации окончательного серийника, полученного из введенного, который и сравнивается со сгенерированным:
004012D1 /$ 55 PUSH EBP
004012D2 |. 8BEC MOV EBP,ESP
В ESI - указатель на строку:
004012D4 |. 8B75 08 MOV ESI,[ARG.1]
004012D7 |. B9 14000000 MOV ECX,14
004012DC |. 33D2 XOR EDX,EDX
004012DE |> 33C0 /XOR EAX,EAX
Загрузка в AL первого символа строки:
004012E0 |. AC |LODS BYTE PTR DS:[ESI]
Поиск в цикле местанахождения прочитанного из строки AL в уникальной строке "Q1WE2RT3ZU4..." и помещение его в EBX:
004012E1 |. 33DB |XOR EBX,EBX
004012E3 |> 0FB6BB 00304000 |MOVZX EDI,BYTE PTR DS:[EBX+403000]
004012EA |. 43 |INC EBX
004012EB |. 3BC7 |CMP EAX,EDI
004012ED |.^ 75 F4 |JNZ SHORT KeygenMe.004012E3
Загрузка в EAX байта уникальной строки по смещению [ уник_строка + 11h + EBX ], уник_строка находится по адресу 403000h:
004012EF |. 0FB683 11304000 |MOVZX EAX,BYTE PTR DS:[EBX+403011]
Сохранение символа настоящего серийника(НС):
004012F6 |. 8882 F8334000 |MOV BYTE PTR DS:[EDX+4033F8],AL
004012FC |. 42 |INC EDX
004012FD |.^ E2 DF \LOOPD SHORT KeygenMe.004012DE
Вставка символов "-" в полученный НС и завершение работы процедуры:
0040130E |. A1 F8334000 MOV EAX,DWORD PTR DS:[4033F8]
00401313 |. 8B0D FC334000 MOV ECX,DWORD PTR DS:[4033FC]
00401319 |. 8B15 00344000 MOV EDX,DWORD PTR DS:[403400]
0040131F |. 8B1D 04344000 MOV EBX,DWORD PTR DS:[403404]
00401325 |. 8B35 08344000 MOV ESI,DWORD PTR DS:[403408]
0040132B |. A3 88354000 MOV DWORD PTR DS:[403588],EAX
00401330 |. C705 8C354000 2D000000 MOV DWORD PTR DS:[40358C],2D
0040133A |. 890D 8D354000 MOV DWORD PTR DS:[40358D],ECX
00401340 |. C705 91354000 2D000000 MOV DWORD PTR DS:[403591],2D
0040134A |. 8915 92354000 MOV DWORD PTR DS:[403592],EDX
00401350 |. C705 96354000 2D000000 MOV DWORD PTR DS:[403596],2D
0040135A |. 891D 97354000 MOV DWORD PTR DS:[403597],EBX
00401360 |. C705 9B354000 2D000000 MOV DWORD PTR DS:[40359B],2D
0040136A |. 8935 9C354000 MOV DWORD PTR DS:[40359C],ESI
00401370 |. C9 LEAVE
00401371 \. C2 0400 RETN 4
Кейген с исходником лежит тут:
/downloads/blozhek/keygen_src.rar : vazonez

Оставьте комментарий!