Исследование "Leader-2001".Subject: Reversing. Target: Получение алгоритма генерации рег-кода Author: DeuS Date: 14.10.2001 Before starting! Все ниже изложенное предназначено только для образовательных целей. FOR EDUCATION USE ONLY!!!
I. Вступление
II. Постановка задачи
III. Исследование
Итак, приступим.. Как было сказано, прога написана на Кларионе, а значит попытки отловить GetWindowText, DialogBox* и т.д. не приводят ни к чему. С чего я начал пытаться отловить, откуда вызывается оконце для ввода рег-кода, уже точно не помню. Помню, что случайно мне это удалось, поставив бряк на hmemcpy. далее -- "Информация" => "Регистрация программы". и вот, мы вывалились в sIce. но этот вариант, хотя и приведёт к желаемому результату (см. Subject и Target =] ), не является самым оптимальным. Если просмотреть Leader.exe под кодировкой Windows, то увидим, что все текстовые ресурсы программы как на ладони. Этим и воспользуемся. Меня больше всего заинтересовала строка "Ваша программа уже зарегистрирована", за которой следуют строчки "Код программы", "Код регистрации".. =] Очень интересно.. Находим строчку "Ваша программа..." (не забываем про кодировку). Находим, откуда имели её адрес: .00451C07: FF1524C44700 call Cla$DPushLong .00451C0D: B850574700 mov eax,000475750 .00451C12: FF1598C54700 call Cla$PushPictDec .00451C18: B858574700 mov eax,000475758 ; "Ваша программа уже.." .00451C1D: BB36000000 mov ebx,000000036 ; видимо, длина строки .00451C22: FF15A4C54700 call Cla$PushString ; передаём как параметр ; функции Cla$MessageBox ................................................ .00451D0D: BA00000000 mov edx,000000000 .00451D12: E8E1F4FAFF call Cla$MessageBox .00451D17: E9AE030000 jmp .0004520CAАха.. Видно, что участок кода .451C07-.451D17 формирует оконце, в котором прога должна выводить номер программы, дату регистрации и (самое главное) регистрационный код. Наша цель сейчас -- это добиться того, чтобы это заватное оконце показалось :) Прогоним программу ИДой и поднимемся по jmp-ам вверх по коду, чтобы посмотреть, где что сравнивается и куда производятся переходы. Под SIce-ом изменим условия переходов "не туда" на нужные нам и вот оно, оконце.. С регистрационным кодом программы!! Т.е. теперь у нас есть алгоритм получения рег-кода для конкретной установки (при каждой новой установке проги её номер изменяется и рег-код требуется уже другой). Но нам нужно бОльшее -- кейген. Внимательно посмотрим, откуда прога берет свой номер и рег-код: 00451BEC movzx eax, ds:byte_46758C ; какое-то число 00451BF3 mov [ebp+var_10], eax 00451BF6 mov eax, [ebp+var_10] ; глупо, правда? =] 00451BF9 dec eax ; уменьшаем на 1 00451BFA mov eax, ds:dword_46738C[eax*4] ; !!!!!!!!!!!! 00451C01 mov [ebp+var_18], eax 00451C04 mov eax, [ebp+var_18] ; ну вот, ещё один маразм.. ;] 00451C07 call ds:Cla$DPushLong ; в Cla$-стекстрока, отмеченная !!! очень важна.. в eax заносится 4 байта из памяти по адресу 46738C+EAX*4. Как в дальнейшем выяснилось, по этому адресу распологается бинарный массив, размером 100h. При первом запуске прога берёт какую-то randomную константу и четыре байта по адресу 46738C+эта константа*4 и есть номер программы.. =] Не хитро, правда??
Но за массивом 46738C идёт ещё один массив с длиной 100h. и тут та же
история .46748C+(та же константа)*4 -- рег код для проги =]
Greets to: everyone in UOFG, TDS (SIA, where r u?), and all crackers in da world
(q) DeuS
14/10/2001 |