Сейчас на форуме: tyns777, zombi-vadim, zds (+5 невидимых) |
eXeL@B —› Программирование —› Какой практический смысл в поле IMAGE_IMPORT_DISCRIPTOR.ForwardChain ? |
Посл.ответ | Сообщение |
|
Создано: 18 ноября 2012 12:09 · Личное сообщение · #1 Мне не совсем понятно назначение этого поля. Пока пришел к выводу что это еще один дополнительный флажок позволяющий системному загрузчику понять что функция импортируемая из другого модуля на самом деле тоже импортируется из другого модуля. Основным флажком и алгоритмом обнаружения перенаправляемого элемента, думаю, является такое: Системный загрузчик при просмотре таблицы экспорта и спотыкаясь о rva-из-iat, который в свою очередь не попадает в пределы экспорта, то считается что это rva-строки вида "another_modulename.imported_element_name" . Т.е. как-то так: Code:
Что в имеющихся доках? : Во всех доках: упаковщики в последний раз, дока от MS, дока про зеленное и красное на васме, дока про загрузчик на дельфи на rsdn.ru и везде одно и тоже, слова вида: "Если ForwardChain -1 то в этом импортируемом модуле ни один элемент не перенаправляется, иначе это индекс первого перенаправляемого элемента" и на этом все! То что я вижу что это форвард - этого мало! Мне надо понимать, а что дальше с этим элементом? Как этот флажок "это форвард" используется? Ведь, как я уже сказал выше, если можно определить по экспорту, то нафига нужен еще и этот ForwardChain? |
|
Создано: 18 ноября 2012 12:48 · Поправил: r_e · Личное сообщение · #2 |
|
Создано: 18 ноября 2012 12:56 · Личное сообщение · #3 r_e Мои слова : Code:
Это означает что перед тем как задать вопрос изучил Все что мне доступно и из этого доступного нихера не понял смысл поля. Еще раз повторюсь: 1) Определить факт перенаправляемого элемента можно опираясь на попадание RVA экспортируемого элемента в диапазон между ( exportDir.VirtualAddress ) и ( exportDir.VirtualAddress + exportDir.VirtualSize ) 2) Если форвард можно определить по алгоритму п.1. Нахера еще нужно ForwardChain : Нахера плодить сущности? Суть вопроса в п.2 ? |
|
Создано: 18 ноября 2012 13:23 · Личное сообщение · #4 И чем тебя не устраивает объяснение, что это индекс? Да, можно и без него. Можно много без чего. И без баунд импорта. И без хинтов в импорте. Для скорости это. | Сообщение посчитали полезным: sys_dev |
|
Создано: 18 ноября 2012 13:29 · Личное сообщение · #5 |
|
Создано: 04 июня 2015 11:13 · Поправил: mysterio · Личное сообщение · #6 Возникла потребность восстановить исходный файл (оригинал или максимально близкий к нему), после того как над ним "поиздевалась" утилита С PE-форматом плохо знаком, но методом научного тыка удалось выяснить, что IIDKing изменяет 5 параметров: File Size и Number of Sections - с этими двумя все просто - удалили секцию и оба приходят в норму. Size of Image - восстановление проблем не вызвало. А вот с последними двумя требуется помощь: Import Directory RVA и Import Directory Size. Пока все это писал с помощью P.S. Сорри за некропостинг, не хотелось создавать новую тему. ----- Don_t hate the cracker - hate the code. |
|
Создано: 04 июня 2015 14:15 · Поправил: -=AkaBOSS=- · Личное сообщение · #7 |
|
Создано: 04 июня 2015 15:46 · Поправил: mysterio · Личное сообщение · #8 То что импорт никуда не делся я в курсе .... как его найти ? Понятно, что "старое", оригинальное RVA, значение будет меньше того что написал туда IIDKing и приблизительно (в зависимости от файла) будет равно первому OriginalFirstThunk - но это приблизительное значание а не точное - с таким значением восстановленный файл не запустится "кривой импорт". Например для Small_Form_[Original/IIDKing].exe - Import Directory RVA = A000, а OriginalFirstThunk = A064. Проблема не с конкретным файлом; нужно не только научиться делать это руками но и научить "программу" (пишу для себя, так сказать deIIDKing Personal Edition - свой велосипед с квадратными колесами - и пока он не едет). ARCHANGEL Пример чего, файлов ? Так вот они выше ;) Кролики на которых тренируюсь. ----- Don_t hate the cracker - hate the code. |
|
Создано: 04 июня 2015 16:51 · Личное сообщение · #9 mysterio RVA должно равняться первому IMAGE_IMPORT_DESCRIPTOR, размер загрузчик вычисляет сам, не опираясь на поле в заголовке, считается, что первый нулевой IMAGE_IMPORT_DESCRIPTOR и будет служить завершением таблицы импорта. Для автоматического восстановления нужно эвристически искать что-то похожее на IMAGE_IMPORT_DESCRIPTOR, т.е. искать и проверять, соответствуют ли все последовательно идущие друг за другу структуры IMAGE_IMPORT_DESCRIPTOR фактическому заполнению функциями из таблицы. Возможно, если приложите пример, то люди покажут на практике, как искать. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 04 июня 2015 18:54 · Поправил: -=AkaBOSS=- · Личное сообщение · #10 Цель всё равно туманна.. Писать обратный алгоритм от воздействия косячой проги, которая даже сместить секции не может, если в хидере места мало Чуток по теме: тут так же как в случае с ребилдом импорта - по уму не получится, нужен перебор. 1. Смотрим в ту таблицу, что сгенерил IIDKing и отделяем те модули, FirstThunk которых ведёт в ту же секцию, где и текущая директория импорта. Таким образом отсеиваются добавленные модули. Если после отсеивания модулей в списке не осталось, знач директория оригинальная.. или идентичная оригинальной) Кстати, неясно, накой эта утилита генерит два раздельных списка FirstThunk и OriginalFirstThunk.. обычно хватает одного. 2. Теперь, когда у нас есть RVA FirstThunk'ов модулей, гарантированно используемых прогой, можно начинать искать их в файле. Я так понял, структура списка не меняется, поэтому можно предположить, что искомые рва должны найтись в том же порядке на расстоянии в sizeof(IMAGE_IMPORT_DESCRIPTOR). Берём рва первого OriginalFirstThunk и таким образом получаем начало IAT |
|
Создано: 08 июня 2015 13:29 · Поправил: mysterio · Личное сообщение · #11 Проблему решил пару дней назад - топик можно закрыть. Если кому интересно - все необходимое по восстановлению Import Directory RVA находится в секции IIDKinga - нужно лишь правильно применить. Велосипед, видимо, из-за "квадратных колес" на своем же примере с пуcтой формой не "завелся" (можно и пешком пройтись - руками ), зато на реальных примерах (если конечно нет подвоха) "едет" на ура Thanks all. ----- Don_t hate the cracker - hate the code. |
eXeL@B —› Программирование —› Какой практический смысл в поле IMAGE_IMPORT_DISCRIPTOR.ForwardChain ? |