ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   Реверсинг ASM KEYGENME#1 (https://forum.antichat.xyz/showthread.php?t=212511)

FairHawk 19.06.2010 12:54

Реверсинг ASM KEYGENME#1

Данный keygenme довольно простой, но тем не мнение, рассмотрим именно его, думаю новичкам будет интересно. В качестве отладчика будем использовать всеми любимый OllyDbg)) Скачать ASM KEYGENME#1 можно тут:тут

Из названия подопытного, ясно чем нам придется заняться.

Перед тем как его перейти к реверсингу, запускаем его, и смотрим как он работает. После чего открываем его в отладчике.

Видим что то непонятное вместо обычного нам вида, дизассемблированного кода.

Не трудно догадаться, что файл зашифрован, причем не очень хорошо. В самом начале видим прыжок на 004011AE, ПКМ – Follow. Попадаем на фрагмент кода дескриптора. Так как, сейчас нам это мало интересно, пропустим этот фрагмент, нажимаем F9. Запускается программа..

Дальше в отладчике, нажимаем Ctrl + A или ПКМ – Analysis – Analysis code;

После чего в окне отладчика появляется основной код, нашего keygenme :

http://s43.radikal.ru/i102/1006/c5/722c4cad8204.jpg

Начнем пожалуй с того, что посмотрим WinAPi функции, используемые тут, нажимаем

Ctrl + N или Search for – Name(Label) in current module. Видим следующие:

http://s51.radikal.ru/i133/1006/08/a0c9e4363b5f.gif

Там интересны только, GetDlgItemTexaA ( получение текста, например из поля ввода..), MessageBoxA ( вывод сообщения) и на последок wsprintfA( сравнение строк), что уже на данном этапе дает нам понять, что кейгенми довольно простой.

Остановимся на GetDlgItemTexaA .

Выбираем его, после чего ПКМ – Toggle Breakpoint on Import. Теперь при вызове этой функции программой, произойдет ее остановка, дабы дать нам возможность “осмотреться”.

Переходим к нашей запущенной программе, вводим любое имя, с серийником, в моем случаи Fairhawk;123456, нажимаем «ОК».

После чего программа останавливается, т.к срабатывает наша точка останова, что бы убедиться в этом смотрим в нижний левый угол отладчика на строку состояния, и видим там: «Breakpoint at user32.GetDlgItemTexaA.

Смотрим что у нас находиться в стеке:

http://s50.radikal.ru/i130/1006/3f/ddaa39536cc2.gif

Давайте обратим внимание на выделенную зеленным цветом строчку. Тут указывается на некий буфер, куда по идеи должно занестись выполнение нашей функции. Выделяем данную строчку, и нажимаем ПКМ – Follow in Dump.

http://s39.radikal.ru/i086/1006/98/b704cd8a37f8.gif

Видим что тут пока не чего нет, т.к мы остановили нашу программу только на начале функции, и она еще не успела выполниться. Нужно это исправить.

Выделяем строку где произошла наша остановка, и нажимаем F2, что снимет от туда Breakpoint.

После чего ставим новый, на конце этой функции:

http://s001.radikal.ru/i193/1006/a0/da7469620cb2.gif

Опять же нажатием F2 ( хотя если ты читаешь этот материал, то ты наверняка знаком с этим ) ставим новую точку останова.

Нажимаем F9, и наш keygenme снова останавливается, но только уже на другом месте )

Снова смотрим на наш адрес в дампе..

http://s56.radikal.ru/i152/1006/f0/962c846616ab.gif

Видим что, наша функция выполнилась, и теперь по адресу находиться то, что мы ввели в поле ввода «Name» !) Запоминаем адрес, думаю он нам пригодиться )

Убираем Breakpoint, и нажимаем F7 что бы выйти из функции.

Останавливаемся на строчке:

MOV DWORD PTR DS:[403100],EAX

Которая заносит результат выполнения функции ( в данном случаи количество строк), в «ячейку» по адресу 403100. После чего EAX обнуляется, командой :

XOR EAX,EAX.

Нажимаем ПКМ на MOV DWORD PTR DS:[403100],EAX– Follow Dump – Memory address. И видим что там тоже пусто. Но стоит нам выполнить данную команду нажатием F7, как видим там:

http://s50.radikal.ru/i129/1006/3c/8fe826f7e1a8.gif

Число 8, в моем случаи количество символов в слове «Fairhawk») Также «запоминаем» адрес.)

Чуть ниже, видите еще один вызов GetDlgItemTexaA, в точности похожею на первый:

http://s001.radikal.ru/i195/1006/4f/fbd01a407b86.gif

Красным цветом выделен, первый, нами разборный, вызов этой функции. Заметим так же, что тут в строчке :

PUSH ASM_KEYG.004030C0

И указывается, тот адрес, куда и заноситься наше имя, в моем случаи «Fairhawk»)

Во втором, вызове видим подобное:

PUSH ASM_KEYG.004030E0

Следовательно туда наверняка будет заноситься наш серийник . Давайте это проверим, ставим точку останова сюда:

http://s52.radikal.ru/i136/1006/7c/ce3f18c4f4da.gif

Нажимаем F9. После чего ПКМ на PUSH ASM_KEYG.004030E0– Follow Dump –Immediate constant.

Как видите, наши предположения оправдались:

http://s58.radikal.ru/i162/1006/91/2c6725be3f31.gif

Там действительно находиться наш серийный номер).

Убираем, точку останова, нажимаем ПКМ на MOV DWORD PTR DS:[403128],EAX– Follow Dump – Memory address, после чего F7,и видим что 403128 находиться число 6 ) длина нашего серийника).

Теперь осталось выяснить, где используется наши числа (6 и 8)…

Cделаем так, найдем в дампе первое (8), после чего выполняем следующие:

http://s47.radikal.ru/i115/1006/d1/60e69c0d51da.gif

Это тот же Breakpoint, только ставиться он на определенный участок в дампе, который срабатывает при любом вызове к этому адресу. И так, убираем наш предыдущую точку останова, и нажимаем F9.

Останавливаемся тут:

http://s54.radikal.ru/i145/1006/5e/eb3cc8c0b9ff.gif

Тут и видим CMP DWORD PTR DS:[403100],0 обращение к нашему адресу(где у нас находиться длина нашего имени – 8 ), в данном случаи, происходит проверка, «если по адресу 403100 находиться 0, то вывести пользователю не приятное сообщение).

Чуть выше тоже самое, но уже с адресом 403128 (длина поля для серийника – 6).

После того как программа убеждается, что поля не пустые, выполняется выделенный красным цветом код..

Перед тем как разбирать его, уберем наш Breakpoint , который расположен в дампе. Делается это так, ПКМ – Breakpoint- Remove memory Breakpoint, все )

Первые 4 строчки в выделенной рамки, Обнуляют ESI, ECX, а в EDX заноситься 0A (10);

Ну а после чего, собственно идет генерация гуд серийника ) . Весь его разбирать смысла я не вижу, так что расскажу только основные моменты.

MOVSX EAX,BYTE PTR DS:[ECX+4030C0] – Начало цикла, где берется первый символ нашего имени, после чего выполняется, сам алгоритм генерации ключа, до момента:

CMP ECX,DWORD PTR DS:[403100]

JNZ SHORT ASM_KEYG.00401137

Где проверяется, всели буквы были «пройдены» . После чего результат заноситься в стек, из регистров EDI и ESI.

Затем вызваться функция wsprintfA для преобразования, всего этого в нужный нам формат:

"LOD-%lu-%lX". Затем проверка на правильность нашего, и сгенерированного недавно ключа тут:

http://s40.radikal.ru/i087/1006/14/8563fded42d0.gif

Поставим Breakpoint там, где это сделал я.

Нажмем F9.

И видим что нам приходиться сравнивать))

http://i058.radikal.ru/1006/09/50181ca9e939.gif

В String1 находиться нужный нам серийник).

CMP EAX,0

Если наш серийник правильный, то в EAX должен оказаться 0.

Давайте проверим это. Убираем точку останова, нажимаем F8(тоже самое что и F7, только не заходит внутрь функций).

http://s53.radikal.ru/i141/1006/b3/efe08ce8781f.gif

Как видите зеленым выделено подтверждение того, что наш серийник не правильный, иначе бы там было 0 )). И флаг Z будет содержать 0, после чего выполниться переход выделенный синим цветом, к плохому сообщению, затем программа закроется.

Перед тем как писать не посредственно keygen давайте проверим то, что я сейчас сказал).

Нажимаем 2 раза F7, пока наш курсор не окажется на:

JNZ SHORT ASM_KEYG.00401191

Как видите, красная линия показывает что он выполниться, смотрим куда.. и видим что к не очень хорошему для нас сообщению.

Кликаем 2 раза на флаг Z, в правой части отладчика.

И видим что переход стал тусклым, что означает, что «прыжка» не будет, а вместо этого выполниться строчка под ним. Давайте посмотрим, нажимаем F9!!!

И как нашей радости видим что программа говорит нам, о том что серийник правельный)

Осталось только написать keygen. Все что нам для этого нужно, так это взять кусок кода генерации, а именно :

XOR ESI,ESI

XOR ECX,ECX

XOR EDX,EDX

MOV ECX,0

MOV EDX,0A

MOVSX EAX,BYTE PTR DS:[ECX+4030C0]

INC EAX

ADD EAX,EDX

ADD ESI,EAX

INC ECX

IMUL EDX,ECX

MOV EDI,EDX

IMUL EDI,ESI

CMP ECX,DWORD PTR DS:[403100]

JNZ SHORTASM_KEYG.00401137

И переделать под свои нужды.

Скачать написанный мной keygen на masm32 ты можешь скачать ТУТ . Он слегка сыроват, но зато исправно работает))

Из итог наверное то, что кто то укрепил свои знания в реверсинге, ну или дал лишний повод убедиться какой он крутой, сказав себе «Та, я это и так знаю»))))

В любом случаи удачи!)

Kabare 19.06.2010 13:08

Отличная статья

slashd 19.06.2010 13:59

Хорошая статья

Из замечаний лишь одно - команды слиплись, например:

Код:

MOVDWORDPTRDS:[403100],EAX
Сперва даже не сообразил, а потом дошло, что это

Код:

MOV DWORD PTR DS:[403100], EAX
Сам увлекаюсь reversing'ом, но в основном под *nix.

Респект за статью

s0l_ir0n 19.06.2010 14:18

уг. пеар.

desTiny 19.06.2010 15:50

>>фрагмент дескриптора.

=\

FairHawk 19.06.2010 16:10

s0l_ir0n ?

desTiny ну по крайней мере я так понял. исправил, может опять не на true вариант, но все же

Getty, slashd спс

desTiny 19.06.2010 18:59

Я к тому, что есть разница между словами descriptor (описатель) и decryptor (расшифровыватель).

PS не исправляй, а то так хотя бы что-то забавное в статье есть

FairHawk 19.06.2010 19:13

desTiny

ок )

zeppe1in 20.06.2010 15:17

Та, я это и так знаю

MaZaHaKer 20.06.2010 15:54

Цитата:

Сообщение от zeppe1in
Та, я это и так знаю



Время: 15:03