| eXeL@B —› Вопросы новичков —› ImpRec. Принципы работы. |
| Посл.ответ | Сообщение |
|
|
Создано: 10 апреля 2009 16:02 · Личное сообщение · #1 Постил на васм, но думаю там ответа так и не дождусь. Вобщем хочется поинтересоваться как работает ImpRec. Как определяется адрес IAT исходя из OEP? Мне представляется, что после нажатия на кнопку Get Imports просходит сканирование от OEP и поиск инструкций вида CALL DWORD PTR [XXX] либо CALL YYY;JMP DWORD PTR [XXX]. После нахождения хотя бы одного такого вызова для конкретной DLL можно видеть, адрес внутри IAT найден, а т.к. все IMAGE_THUNK_DATA's в теории должны быть смежными, чтобы не разбухивать размер, то банально пройдясь вверх по адресам, проверяя определенные условия можно получить начало IAT. Размер можно получить также сканируя по адресам вверх и сравнивая определенные условия. Условиями могут быть принадлежность DWORD выделенному адресу процесса или просто возможность чтения-записи. Валидность импорта может определяться исходя из самих адресов и сравнением их с экспортом модулей загруженных в адресное пространство процесса. Get API Calls тоже понятно - сканирование определенных по переходам/аттрибутам регионов кода и получение всех CALL [XXX]/CALL XXX инструкций и их анализ как было описано выше. Интересуют опции Trace Level X. Зачем вообще нужна трассировка. Я понимаю, что для анализа невалидных найденных вхождений, но как это работает? Что делает каждый из уровней трассировки? Спасибо. ![]() |
|
|
Создано: 10 апреля 2009 18:58 · Личное сообщение · #2 Трассировка там разная, иногда просто дизасмом в статике, иногда через TF, она же пошаговая отладка. Если импорт перенаправлен, пытается (хотя и весьма слабо) найти всё же реальную функцию-для этого и нужно. Остальное тебе представляется примерно правильно. Есть сорцы версии 1.4.2, можешь их ещё поглядеть. ![]() |
|
|
Создано: 11 апреля 2009 01:10 · Личное сообщение · #3 Я так понимаю проты и пакеры чтобы затруднить восстановление импорта делают вложенные переходы, т.е. запись на функцию в IAT не сразу получается как обычно, а может быть через цепочку. Такая же идея и с вызовами API. Т.е. было CALL [EAX] ; GetWindow, а стало CALL [EAX]; -> <мусор> CALL [GetWindow]. Правильно? Подскажите еще пожалуйста примеры пакеров, которые так делают. ![]() |
|
|
Создано: 11 апреля 2009 08:28 · Личное сообщение · #4 BlackParrot пишет: Т.е. было CALL [EAX] ; GetWindow, а стало CALL [EAX]; -> <мусор> CALL [GetWindow]. Бывает и так, что API-функция копируется полностью в выделенную область памяти и ее код обрабатывается самим протом. Это мера противодействия распознаванием импорта ImpRec, приходится восстанавливать импорт вручную или писать скрипт. Таким образом поступают не так уж мало протов. Вот почитай. Там статьи касающиеся восстановления импорта, добавлению нового импорта в существующие проги и общие вопросы относительно работы импорта в PE файлах. ----- Программист SkyNet ![]() |
|
|
Создано: 12 апреля 2009 20:48 · Личное сообщение · #5 FrenFolio дал ссылку на интересные статьи. Они на английском. Лично мне неудобно читать английский текст, и я решил перевести для себя одну из этих статей (www.tuts4you.com/download.php?view.196). Может кому надо... (в аттаче) 41ce_12.04.2009_CRACKLAB.rU.tgz - IMPFIX_перевод.TXT
![]() |
| eXeL@B —› Вопросы новичков —› ImpRec. Принципы работы. |







Для печати