![]() |
eXeL@B —› Протекторы —› Как реализовать восстановление импорта программно? |
Посл.ответ | Сообщение |
|
Создано: 12 июня 2006 15:07 · Поправил: BUGOR · Личное сообщение · #1 Здраствуйте, уважаемый all. Прошу у вам помощи. Решился-таки написать динамический унпакер, чисто для себя, для повышения опыта, выбрал FSG. Вообщем реализовал всё, до OEP дохожу, там брякаюсь, делаю дамп, правлю таблицу секций, заголовки и встал я на импорте. Как программно восстановить импорт? Нашёл место где FSG заполняет IAT, но я видать туговатый, не могу догнать, что мне с этим делать, хотя довольно отчётливо представляю как в программе устроен импорт, но вот как его восстановить понять не могу, прошу помочь. В аттач кладу распакованный, запакованный файлы и дамп, который делает мой унпакер. Так же, место где FSG заполняет импорт находится по адресу: 004001C2 Не могу приаттачить: fearus.narod.ru/ASMmd5.rar Если есть какие-нибудь статьи, которые объясняют динамическое восстановление импорта, то буду благодарен за ссылку. ![]() |
|
Создано: 12 июня 2006 15:18 · Личное сообщение · #2 |
|
Создано: 12 июня 2006 15:22 · Личное сообщение · #3 |
|
Создано: 12 июня 2006 15:39 · Личное сообщение · #4 |
|
Создано: 12 июня 2006 16:30 · Поправил: Hellspawn · Личное сообщение · #5 как-то давно, тоже писал нечто подобное и нашёл полезное в нете ![]() держи, разбирайся.... ![]() ----- [nice coder and reverser] ![]() |
|
Создано: 12 июня 2006 16:34 · Личное сообщение · #6 |
|
Создано: 12 июня 2006 16:45 · Поправил: PE_Kill · Личное сообщение · #7 |
|
Создано: 12 июня 2006 16:45 · Личное сообщение · #8 где уже не помню попался исходник импрек.длл древний правда ![]() ![]() |
|
Создано: 12 июня 2006 16:50 · Личное сообщение · #9 |
|
Создано: 12 июня 2006 17:18 · Личное сообщение · #10 |
|
Создано: 12 июня 2006 17:34 · Поправил: BUGOR · Личное сообщение · #11 PE_Kill, ты гуру спору нет, и твой экзамен мне в личке очень понравился, да только я тебе сказал, что у меня есть желание и если я не понимаю как восстановить импорт, то это не значит, что я не смогу это понять, для тебя это элементарно, да, может быть это дейтсвительно элементарно, я это пойму, когда смогу сделать это. То, чего ты достиг в этой области никто не ставит под сомнение, но не надо считать меня сопляком, который пришёл просить научить его хэкать и выносить приговоры типа "но если ты не понимаешь элементарного, то о чем речь?", поэтому давай закончим этот бессмысленный спор и каждый пойдёт своей дорогой, если ты можешь помочь в чём-то, то помоги, я буду тебе благодарен и возможно в чём-то смогу помочь тебе, если же не хочешь мне помогать, то просто проигнорируй этот топик. ![]() |
|
Создано: 13 июня 2006 12:08 · Личное сообщение · #12 |
|
Создано: 13 июня 2006 12:39 · Личное сообщение · #13 |
|
Создано: 13 июня 2006 13:07 · Личное сообщение · #14 |
|
Создано: 13 июня 2006 13:58 · Личное сообщение · #15 Я клепал изврата ради свою реализацию примерно следущим способом: 1) Находил границы подгруженных либ; 2) брал адрес из IAT и смотрел чьей либе он принадлежит. Дальше вручную разбирал экспорт этой либы и определял имя или ординал. 3) добавлял его в таблицу импорта. Сложного ничего, а попрактиковаться полезно=) ![]() |
|
Создано: 13 июня 2006 14:22 · Поправил: BUGOR · Личное сообщение · #16 |
|
Создано: 13 июня 2006 15:17 · Поправил: BUGOR · Личное сообщение · #17 |
|
Создано: 13 июня 2006 15:50 · Личное сообщение · #18 Посмотрел я твою прогу. Короче так. По адресу 004001C2 LODS DWORD PTR DS:[ESI]. Так вот там немного извратная директория импорта. По адресу из ESI лежит массив укзателей на имена АПИ. По адресу ESI+4 лежит указатель на имя DLL. Всё можешь ребилдить импорт. Размер директории импорта ревен числу ImageImportDescriptors*0x14 + 0x14. Мутишь новый массив из IIDs, FirstThunks которого получаешь из ESI пишешь его в новую секцию (если будишь отрезать секцию пакера), пересчитываешь размер и пишешь в Import Directory RVA адрес первого IID, в Size пересчитаный размер ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 14 июня 2006 07:54 · Личное сообщение · #19 Держи сорс, думаю дальше сам разберешься. Дампить надо на обработке импорта. ![]() ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 14 июня 2006 11:57 · Личное сообщение · #20 PE_Kill, большое спасибо. Но ты знаешь, там если брякнутся на адресе LODS DWORD PTR DS:[ESI], то в esi будет указатели на адреса функций, а в esi+4 указатели на имена длл, так вот если от всех этих VA (на имена функций) отнять ImageBase+1, то мы получим offset'ы на имена функций, после чего заменяем все FFFFFFFF и 7FFFFFFF в этом массиве указателей на нули, это будут границы массивов FirstFunk. Далее из той таблицы, что в [ESI] от первого значение отнимаем ImageBase, это будет ни что иное как IMAGE_IMPORT_DESCRIPTOR.FirstFunk, от значения [ESI+4] тоже отнимаем ImageBase и получаем IMAGE_IMPORT_DESCRIPTOR.Name(RVA). Таким образом можно не добавлять новую секцию, а записать импорт на тоже место, где он и был, только обработав FirstFunk и Сгенерив IID на основе Таблицы в [ESI]. ![]() |
|
Создано: 14 июня 2006 12:00 · Личное сообщение · #21 |
|
Создано: 14 июня 2006 12:07 · Личное сообщение · #22 Возможно, это я за пару минут накидал, особо не смотрел, что там да как, ты же просил подсказку, я тебе ее дал. Кстати границы FirstThunk только 7FFFFFFF, а FFFFFFFF это конец IAT, но вместо него тоже надо 0 втыкать. Удачи. PS Проверь, как FSG с импортом по ординалам работает. ----- Yann Tiersen best and do not fuck ![]() |
![]() |
eXeL@B —› Протекторы —› Как реализовать восстановление импорта программно? |