Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Original Entry Point Finding

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.
 Subject: "Educational Purpose"
Target: Any Delphi programm
Author: aSL!

Before starting!
Все ниже изложенное предназначено только для образовательных целей.

Вступление

Здравствуйте мои маленькие любители прекрасного! :) Вы, наверное, помните то домашнее задание в статье про Inec Investor? Да, да про OEP. Помните? Вот и ладненько... И как успехи? Ну ладно, давайте же займемся этим вплотную...

Постановка задачи

Необходимо найти OEP у программы, написанной на Delphi.
 Инструменты: W32Dasm 8.9x,
                    VCL Source, неважно от каких делфей.. У меня будет от 4.3.
                     Итак, приступим...
 

Взлом

Что мы имеем? Да, вот, дамп из памяти проги, сделанной на делфях... Нам ведь не помешает узнать OEP, не роясь в отладчике, верно? Загружаем и дизассемблируем сегмент кода. Для дальнейших действий мы должны будем взять VCL Source. Как известно, в делфях system.pas прикомпиливается в любом случае, поэтому, очевидно, что код из нее будет выполнятся где-то в самом начале .exe. Далее, смотрим в нее, что-то я тут малость не втыкаю... Всего-то наворочено. Но что это? Хех:

uses SysInit;

Весьма и весьма интересно, скажу я вам. Смотрим sysinit.pas.

А там... Меня заинтересовали следующие строки:

procedure _GetTls;
function _InitPkg(Hinst: Integer; Reason: Integer; Resvd: Pointer): LongBool; stdcall;
procedure _InitLib;
procedure _InitExe;

А в особенности процедура _InitExe. Смотрим и ее:

 procedure _InitExe;
 asm
 { -> EAX Inittable }
 
 { MOV ModuleIsLib,0 ; zero initialized anyway }
 
 PUSH EAX
 PUSH 0
 CALL GetModuleHandle
 MOV EDX,offset Module
 PUSH EDX
 MOV HInstance,EAX
 MOV [EDX].TLibModule.Instance,EAX
 MOV [EDX].TLibModule.CodeInstance,0
 MOV [EDX].TLibModule.DataInstance,0
 CALL InitializeModule
 POP EDX
 POP EAX
 
 CALL _StartExe
 end;
 
Чуете, чем пахнет? Этот код нигде больше в .pas не вызывается. Имя этой процедуры вложено в компилятор и он ее компилирует первой!. Это можно легко проверить, вставив в нее что-нить. Пример (консольное Delphi приложение -- {$APPTYPE CONSOLE}):

 //******************** Program Entry Point *******************//
 :0041A1FC 55
 :0041A1FD 8BEC
 :0041A1FF 81C4F0FEFFFF
 :0041A205 53
 :0041A206 56
 :0041A207 57
 :0041A208 33C0
 :0041A20A 8945F0
 :0041A20D A154B94100
 :0041A212 C60001
 :0041A215 B8FCA04100
 :0041A21A E8A5B6FEFF  push ebp
 mov ebp, esp
 add esp, FFFFFEF0
 push ebx
 push esi
 push edi
 xor eax, eax
 mov dword ptr [ebp-10], eax
 mov eax, dword ptr [0041B954]
 mov byte ptr [eax], 01
 mov eax, 0041A0FC
 call 004058C4
 
Залезем-ка мы в call:

 :004058C4 50
 :004058C5 6A00  push eax
 push 00000000
 * Reference To: kernel32.GetModuleHandleA, Ord:0000h
 :004058C7 E8F8FEFFFF
 :004058CC BA9CB04100
 :004058D1 52
 :004058D2 8905D4C44100
 :004058D8 894204
 :004058DB C7420800000000
 :004058E2 C7420C00000000
 :004058E9 E88AFFFFFF
 :004058EE 5A
 :004058EF 58
 :004058F0 E8E3D7FFFF
 :004058F5 C3  Call 004057C4
 mov edx, 0041B09C
 push edx
 mov dword ptr [0041C4D4], eax
 mov dword ptr [edx+04], eax
 mov [edx+08], 00000000
 mov [edx+0C], 00000000
 call 00405878
 pop edx
 pop eax
 call 004030D8
 ret
 
Узнаете? Да, да, да это та самая _InitExe, код которой не менялся аж со вторых делфей и до пятых. (Сорри, шестые еще не видел, не знаю...). Стало понятно как искать OEP? Примерно. Вот полное решение. Очевидно, что надо искать следующую последовательность байтов (для этого используйте достаточно продвинутый hex редактор с масками в поиске):

 556A00E8????????BA????????5289??????????89????C7420800000000C7420C00000000E8
 ????????5A58E8????????C3.
 
Достаточно длинная последовательность, чтобы она была единственной??? :))) К сожалению, я не знаю ни одного редактора, работающего с битовыми масками, иначе строка была бы подробнее. На худой конец, эту строку можно икать в отладчике и поставить бряк на память. (Естественно, уже после того, как распакуется код). Так, наверное, будет даже надежнее... После всего этого, грузим наш сегмент кода в W32Dasm, дизассемблируем и после этого ищем ту гадость, что вызывает _InitExe.. А там уже легко. Не секрет, что большинство (если даже не все) .exe начинаются с 558BEC (push ebp/ mov ebp,esp). Вот и все!

Подводим итоги

Мне действительно нечего сказать, поскольку OEP мы нашли. Единственное, что хочу отметить, что этот код не меняли НИ В ОДНОМ мне известном билде делфей (кто может меня поправить - пишите). Также хочу добавить, что этим туториалом я открываю целую серию туториалов посвященных нахождению OEP у прог, компилированными разными компилерами. Так что ждемс...

Вот собственно и все! :)

© 2001

Автор: aSL! asl@aslsoft.com


Перепечатано с разрешения www.uofg.com.ua




Обсуждение статьи: Original Entry Point Finding >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS