Новые шуточки от дяди Солодвникова... в Actual Startup Pro 2.3
Чтоб не долбаться OEP: 48F2FC IATRVA: 00093164 IATSize: 00000708
Все проги, которые я смотрел с таким глюком, были на делфи и решил посмотреть, а как выглядят секции у обычных делфийских прог... И вот что сразу бросилось в глаза: третья секция(BBS) имеет Physical Size = 0! А в полученых дампах секция BBS уже существовала физически(т.е. Physical Size>0) и была заполнена всяким бредом от аспротекта! Вот вам и Rebuild PE... Как же дампить чтоб на такие грабли не наступать? В принципе можно каждый раз тупо менять размер этой секции, но это чо-то не то... Дампить надо сразу после создания импорта, не доходя к OEP. Как это место найти? 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 P.S. Спасибо Kola за наставление на путь истинный :)
|