Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Новые шуточки от дяди Солодовникова... в Actual Startup Pro 2.3

Автор: Hex

В последнее время начали попадаться мне проги с аспротектом, да какие-то не понятные. OEP и импорт все как обычно, а дамп зависает на перевом же от OEP call... Хрень прям какая-то...

Чтоб не долбаться OEP: 48F2FC IATRVA: 00093164 IATSize: 00000708 Думал импорт кривой - вроде правильный. Начал рассматривать где ж виснет. Виснет в глубинах инициализации при обращении к памяти типа вот так mov ecx,[edx+eax*2] Посмотрел как оно в проге упакованой обращается - обращается туда же но память там уже забита какими-то данными. Я уж начал думать что аспротект инициализацию памяти на себя забирает... Но не в этом то дело :)

Все проги, которые я смотрел с таким глюком, были на делфи и решил посмотреть, а как выглядят секции у обычных делфийских прог... И вот что сразу бросилось в глаза: третья секция(BBS) имеет Physical Size = 0! А в полученых дампах секция BBS уже существовала физически(т.е. Physical Size>0) и была заполнена всяким бредом от аспротекта! Вот вам и Rebuild PE... Как же дампить чтоб на такие грабли не наступать? В принципе можно каждый раз тупо менять размер этой секции, но это чо-то не то... Дампить надо сразу после создания импорта, не доходя к OEP. Как это место найти? bpx mapviewoffile после его срабатывания в протекторе bpx getprocaddress. Есть мазохисты которые делают сразу bpx getprocaddress и жмут F5 раз 20-30... не знаю к чему так извращаться если проще отловить аспротект через mapviewoffile, т.к. внутри протектора оно сработает только 1 раз, ну и еще максимум 2 раза перед этим, если какие-нить извратные DLL догрузит из импорта. Тем более первое срабатываение bpx getprocaddress после bpx mapviewoffile - это начало создания импорта. В общем после срабатывания bpx getprocaddress жмем F12 пока не увидим вот такое:


Call HZ - мы выйдем отсюда
Pop ebx 
Jmp hz_UP - это джамп цикла
Popad - сюда ставим брейкпоинт чтоб цикл пропустить
Call XXXXXXX
Push hz
Inc Dword Ptr[Esp]
Ret

Дальше входим в Call XXXXXXX и идем по ней пока не увидим :


Pushad
Push xxxxxx
Lea EAX,[ebp-c]
Push Dword ptr[hz]
Call [eax] - В этом Call "эмулируется" GetVersion, GetCommandlineA и т.д.
Popad

После этого Call [eax] можно брать дамп так как нравится. Дамп будет нормальный и BBS тоже будет впорядке. Импорт тоже можно восстанавливать прямо тут, не дожидаясь пока до оер дойдет. С импортом тут тоже 1 прикол оказался. Теперь даже плагин для определения эмуляций не помагает, т.к. 1 функция все равно не верно определяется. Это функция GetCommandlineA, плагин ее путает с GetVersion. Найти такую неверно определенную функцию очень просто. Восстанавливаем импорт как обычно, а потом ищем в дереве импорта Imprec функцию GetCurrentDirectoryA. Будет типа так:


1 000931D0 kernel32.dll 0158 GetCurrentDirectoryA
1 000931D4 kernel32.dll 01DC GetVersion
1 000931D8 kernel32.dll 0133 FreeLibrary

Так вот этот GetVersion который между GetCurrentDirectoryA и FreeLibrary на самом деле GetCommandLineA. Сколько я прог смотрел везде так было.

Теперь про эмуляцию апи. Много шуму вокруг этого поднимали. Апи эмулировать нужно далеко не всегда, если проге есть закриптованные участки то обычно эти апи - это функции чтения ключевого файла. Эмулировать надо если получили дамп, а прога при заходе к примеру в About матерится о том что у нее чо-то не так по такому-то адресу... Как искать их адреса? Многи предлагаю ципляться на bpx Getmodulehandlea if (*(esp+4)==0) и потом листать куда-то... Я так ничего найти не смог поэтому нашел свой способ. При запущеной проге заходим в айс и делаем addr имя_проги, чтоб в ее адресное пространство попасть. Потом делаем поиск в памяти протектора значения imagebase нашей проги. Ну типа если imagebase = 400000 и протектор лежит в районе C00000 - D00000 делаем поиск: s C00000 l 100000 00 00 40 00 00 00 40 00 Там просто рядом с этими апи лежит 2 раза подряд Imagebase. Все. Там ниже под тем местом где найдет будут лежать адреса апи. Как эмулировать расписано в статье "Исследование защиты на основе ASProtect 1.2x" by Kola на www.reversing.net. В Actual Startup Pro 2.3 есть всего 2 апи. Одна читает ключевой файл, а другая - записывает какое-то число в секцию DATA которое потом не юзается. Т.е. тут эмулировать нечего.

P.S. Спасибо Kola за наставление на путь истинный :)

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay