Сегодня мы будем изучать алгоритм и писать генератор ключей для программы
Datzibao версии 2.6. 

Datzibao v2.6 представляет из себя программу "напоминалку" , работающую с прозрачными
графикой и текстами. Включает в себя прозрачный календарь , помещаемый на рабочий 
стол, десять вариантов прозрачного текста, свободно
перемещаемого по экрану, стрелки-указатели, и возможность вывода на desktop, опять-таки прозрачной картинки.
Особенно мне понравился календарик с возможностью приклеивания к рабочему столу.

Приступим к первоначальному знакомству. Запустим программу, при запуске проявляется
одна очень неприятная особенность, все активные окна на рабочем столе
сворачиваются и программа создает себе иконку в трее. Щелкнем по иконке правой клавишей мыши
и выберем меню "настройка". Появляется окно с немногочисленными настройками
и строкой ввода пароля, представляющей из себя компонент - калькулятор, наверняка
на нем то и будут производится вычисления нашего ключа. Слева от него имеется кнопка
"ID #", как можно прочитать из readme, это своеобразная привязка к компьютеру,
нажав на эту кнопку нам выдадут уникальный ключ, который мы должны послать автору
вместе с квитанцией об оплате и по этому ключу он выдаст нам регистрационный ключ.
Нажмем на эту кнопку и получим число, в моем случае оказалось 853316.077424, число
дробное, вероятно из-за этого автор не захотел затеваться с вычислениями и решил
это с помощью готового компонента - калькулятора. Посмотрим, как ведет себя проверка:
введем в качестве регистрационного ключа, любое число в строку ввода и нажмем кнопку 
"ввести код", никаких сообщения не появляется, а нам "вежливо" отказывают путем вывода
анимации. Все что хотели узнали. Теперь проверим упакована ли программа. Сделаем это 
с помощью, нам хорошо знакомого PEID, загрузим в него нашу программу и получим: 

ASProtect 1.1b MTE -> Alexey Solodovnikov

Это старая версия известного всем протектора
asprotect, соответственно при его снятии у нас
не должно возникнуть каких-либо проблем. Делаем следующее. Первым делом запускаем
SuperBPM, чтобы не сбрасывались наши отладочные регистры. Теперь запускаем PEEditor, выбираем наш файл
и смотрим значения полей EntryPoint и ImageSize, они таковы:

EntryPoint = 0017C001
ImageSize = 00400000

Складываем эти два значения 0017C001+00400000=57C001, теперь запустим программу,
откроем SoftIce и введем "addr Datzibao" и затем bpm 57c001 x, закроем SoftIce и выйдем из программы.
Снова запускаем программу и попадаем в SoftIce:

017F:0057C001 60 PUSHAD ; мы здесь 
017F:0057C002 E9D9040000 JMP 0057C4E0 
017F:0057C007 CF IRETD 
017F:0057C008 E8E7E7E777 CALL 783FA7F4 

Мы находимся по адресу 0057C001, теперь нажимаем F10 и вводим "bpm esp" и отпускаем
SoftIce. Когда отладчик всплывет мы будем здесь:

017F:0172F850 61 POPAD 
017F:0172F851 50 PUSH EAX ; мы здесь 
017F:0172F852 6863F87201 PUSH 0172F863 
017F:0172F857 687BF87201 PUSH 0172F87B 
017F:0172F85C E8F7FEFFFF CALL 0172F758 
017F:0172F861 50 PUSH EAX 
017F:0172F862 C3 RET 
017F:0172F863 5B POP EBX 
017F:0172F864 6A10 PUSH 10 
017F:0172F866 E8DDFEFFFF CALL 0172F748 
017F:0172F86B 50 PUSH EAX 
017F:0172F86C E8CFFEFFFF CALL 0172F740 
017F:0172F871 50 PUSH EAX 
017F:0172F872 6A00 PUSH 00 
017F:0172F874 E8D7FEFFFF CALL 0172F750 
017F:0172F879 53 PUSH EBX 
017F:0172F87A 50 PUSH EAX ;
помещается в стек адрес OEP=004F8770 
017F:0172F87B C3 RET ;
и возвращаемся на нее 
017F:0172F87C 90 NOP 
017F:0172F87D 6845F87201 PUSH 0172F845 
017F:0172F882 C3 RET 

Протрассируем по F8 до адреса 0172F87A, как мы видим прыжок на настоящую точку входа
в этой версии asprotect выглядит иначе, по адресу
0172F87A в стек помещается адрес OEP и
возвращается с помощью инструкции ret на только что помещенный в стек адрес
OEP, выполняем инструкцию ret и мы на точке входа в программу. Теперь все как обычно:
зацикливаем программу, вводим "e eip", затем EBFE, выходим из SoftIce, снимаем
дамп с зацикленного процесса с помощью того же PEEditor и восстанавливаем импорт с
помощью ImportReconstructor, вводим в поле OEP ImpRec'а "000F8770", затем "IAT
AutoSearch", "Get Import" и находим нераспознанные
функции с помощью "Trace Level 3 (Trap Flag)". Патчим наш дамп "Fix Dump" и в любом hex-редакторе исправляем байты по адресу OEP
с EBFE на 558B. Теперь у нас распакованная программа и мы можем изучать ее код в
дизассемблере.

Т.к. это приложение Delphi будем исследовать ее с
помощью DEDE. Запускаем DEDE, выбираем наш распакованный файл и жмем "process", после выполнения этого процесса нам предложат
провести дополнительный анализ для нахождения
нераспознанных процедур, согласимся с этим и немного подождем. После того как DEDE завершит анализ,
нажимем "OK" перейдем во вкладку "Procedures",
там присутствует много форм, нам же нужна форма "настройка", как мы помним там присутствует калькулятор,
поэтому просмотрим каждую форму в поисках компонента калькулятора, находим ее, это оказалась форма
"Dat11". Смотрим на ее события, нас интересуют клики мышкой по меткам,
дизассемблируем "abcMouseLabel3Click" и начинаем изучать.

004E9C34 55 push ebp
004E9C35 8BEC mov ebp, esp
004E9C37 83C4F4 add esp, -$0C
004E9C3A 53 push ebx
004E9C3B 56 push esi
004E9C3C 33C9 xor ecx, ecx
004E9C3E 894DFC mov [ebp-$04], ecx
004E9C41 8BD8 mov ebx, eax
004E9C43 33C0 xor eax, eax
004E9C45 55 push ebp

* Possible String Reference to: 'й5™сялр^[‹е]Г'
|
004E9C46 68E29C4E00 push $004E9CE2

***** TRY
|
004E9C4B 64FF30 push dword ptr fs:[eax]
004E9C4E 648920 mov fs:[eax], esp

* Reference to : TForm11.Proc_004E92DC()
|
004E9C51 E886F6FFFF call 004E92DC ; вызов интересной нам процедуры

Заходим в этот вызов и смотрим, что там происходит:

Исходник

Выше представленная процедура получает серийный
номер тома "c:\" и переводит в asсii. Изучаем дальше.

Исходник

Подведем итоги. Полученный серийный номер тома, назовем его N, умножается на 2 и
к результату прибавляется 00506001h. D=(N*2)+00506001h. Затем из строки
N вырезаются 3 первых цифры. После этого у числа D сдвигается запятая на три
знака влево, к примеру число 12345678 будет выглядеть
как 12345,678 и затем добавляются вырезанные 3 цифры, к примеру
123. Таким образом получаем 12345,678123. А это ни что
иное, как наш уникальный идентификатор, о котором мы говорили вначале. Т.о. мы знаем,
как формируется идентификатор.

Оставить мнение