Взлом кейгенми "s3rh47s KeygenMe 4"

Рубрика: СтатьиПросмотров: 4042

Взлом кейгенми "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

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com Google Buzz technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Подписаться на новые записи по RSS

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

Используйте нормальные имена.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)

Последние сообщения форума:

Связь: admin@vazonez.com