Новые шуточки от дяди Солодовникова... в 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 за наставление на путь истинный :)
|