![]() |
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, приходится восстанавливать импорт вручную или писать скрипт. Таким образом поступают не так уж мало протов. Вот ----- Программист SkyNet ![]() |
|
Создано: 12 апреля 2009 20:48 · Личное сообщение · #5 FrenFolio дал ссылку на интересные статьи. Они на английском. Лично мне неудобно читать английский текст, и я решил перевести для себя одну из этих статей (www.tuts4you.com/download.php?view.196). Может кому надо... (в аттаче) ![]() ![]() |
![]() |
eXeL@B —› Вопросы новичков —› ImpRec. Принципы работы. |