RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Исследование "Leader-2001".


Subject: Reversing.
Target: Получение алгоритма генерации рег-кода
Author: DeuS
Date: 14.10.2001
Before starting!
Все ниже изложенное предназначено только для образовательных целей.
FOR EDUCATION USE ONLY!!!

I. Вступление
Писано сие на Кларионе, что представляет особый интерес для исследования.. Запасаемся терпением..

II. Постановка задачи
Изучить защиту и написать генератор регистрационных номеров.

III. Исследование
Используемые инструменты:

SoftIce v4.05
Hiew v6.76
IDA v4.04
Far

Итак, приступим.. Как было сказано, прога написана на Кларионе, а значит попытки отловить 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 -- рег код для проги =]
Сдампим эти два массивчика.
Теперь сам алгоритм вычисления рег-кода:

  • берём первую часть номера проги. вторая для генерации рег-кода вообще не нужна. есть предположение, что это дата регистрации..
  • переводим её в Hex. получаем 4 байта, последовательность из которых и ищем в первом массивчике.. смещение, по которому нашли, запоминаем.
  • берем последовательность из 4-х байт по запомненному смещению из второго массивчика и переводим в 10-ю систему счисления. Это рег-код и есть =]
Подробнее расписывать смысла не вижу.. Кому надо - поймёт и так, да и кейген написать теперь уже ничего не стоит..

Greets to: everyone in UOFG, TDS (SIA, where r u?), and all crackers in da world

(q) DeuS
14/10/2001


<= Вернуться к статьям


Rambler's Top100