Сейчас на форуме: tyns777, zombi-vadim, zds (+5 невидимых)

 eXeL@B —› Программирование —› Какой практический смысл в поле IMAGE_IMPORT_DISCRIPTOR.ForwardChain ?
Посл.ответ Сообщение

Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 18 ноября 2012 12:09
· Личное сообщение · #1

Мне не совсем понятно назначение этого поля.

Пока пришел к выводу что это еще один дополнительный флажок позволяющий системному загрузчику понять что функция импортируемая из другого модуля на самом деле тоже импортируется из другого модуля.

Основным флажком и алгоритмом обнаружения перенаправляемого элемента, думаю, является такое:

Системный загрузчик при просмотре таблицы экспорта и спотыкаясь о rva-из-iat, который в свою очередь не попадает в пределы экспорта, то считается что это rva-строки вида "another_modulename.imported_element_name" .

Т.е. как-то так:
Code:
  1.             uint32_t exportEnd = exportStart + expDataDir->Size;
  2.             bool isForwardFound = (exportStart < elementRva) && (elementRva < exportEnd);


Что в имеющихся доках? :

Во всех доках: упаковщики в последний раз, дока от MS, дока про зеленное и красное на васме, дока про загрузчик на дельфи на rsdn.ru и везде одно и тоже, слова вида:

"Если ForwardChain -1 то в этом импортируемом модуле ни один элемент не перенаправляется, иначе это индекс первого перенаправляемого элемента"

и на этом все!

То что я вижу что это форвард - этого мало! Мне надо понимать, а что дальше с этим элементом? Как этот флажок "это форвард" используется? Ведь, как я уже сказал выше, если можно определить по экспорту, то нафига нужен еще и этот ForwardChain?



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 18 ноября 2012 12:48 · Поправил: r_e
· Личное сообщение · #2

sys_dev
На сайте ms есть официальный документ
Microsoft Portable Executable and Common Object File Format Specification
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx

-----
старый пень




Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 18 ноября 2012 12:56
· Личное сообщение · #3

r_e
Мои слова :
Code:
  1. Во всех доках: упаковщики в последний раз, <b>дока от MS</b>,

Это означает что перед тем как задать вопрос изучил Все что мне доступно и из этого доступного нихера не понял смысл поля.

Еще раз повторюсь:
1) Определить факт перенаправляемого элемента можно опираясь на попадание RVA экспортируемого элемента в диапазон между ( exportDir.VirtualAddress ) и ( exportDir.VirtualAddress + exportDir.VirtualSize )
2) Если форвард можно определить по алгоритму п.1. Нахера еще нужно ForwardChain : Нахера плодить сущности?

Суть вопроса в п.2 ?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 ноября 2012 13:23
· Личное сообщение · #4

И чем тебя не устраивает объяснение, что это индекс? Да, можно и без него. Можно много без чего. И без баунд импорта. И без хинтов в импорте. Для скорости это.

| Сообщение посчитали полезным: sys_dev

Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 18 ноября 2012 13:29
· Личное сообщение · #5

Archer
Несмотря на то что все факты указывали на то что это дополнительный флажок, я все же до последнего отметал мысль что это для скорости и мне все казалось что я чего-то упускаю из виду.

Вопрос решен,моя гипотеза "что это всего лишь еще один доп. флажок" подвержена ответом Archer.




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 04 июня 2015 11:13 · Поправил: mysterio
· Личное сообщение · #6

Возникла потребность восстановить исходный файл (оригинал или максимально близкий к нему), после того как над ним "поиздевалась" утилита IIDKing.
С PE-форматом плохо знаком, но методом научного тыка удалось выяснить, что IIDKing изменяет 5 параметров:
File Size и Number of Sections - с этими двумя все просто - удалили секцию и оба приходят в норму.
Size of Image - восстановление проблем не вызвало.
А вот с последними двумя требуется помощь: Import Directory RVA и Import Directory Size. Пока все это писал с помощью этой статьи (english) нашлось решение как восстановить Import Directory Size. Остался последний параметр Import Directory RVA - как его восстановить ? Импорт (изначальный, никуда не девался) ведь не менялся, IIDKing просто заменил RVA и Size своими значениями. Формулу может какую кто подскажет, где какое смещение прочесть в файле и т.д ?

P.S. Сорри за некропостинг, не хотелось создавать новую тему.

-----
Don_t hate the cracker - hate the code.





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 04 июня 2015 14:15 · Поправил: -=AkaBOSS=-
· Личное сообщение · #7

mysterio
IIDKing всего лишь создаёт свою таблицу импортируемых модулей, но оригинал остаётся на месте.
Нужно перед удалением секции глазами просмотреть, где расположены списки функций и проследить референсы к ним.

Может быть, вы лучше покажете файл?




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 04 июня 2015 15:46 · Поправил: mysterio
· Личное сообщение · #8

То что импорт никуда не делся я в курсе .... как его найти ? Понятно, что "старое", оригинальное RVA, значение будет меньше того что написал туда IIDKing и приблизительно (в зависимости от файла) будет равно первому OriginalFirstThunk - но это приблизительное значание а не точное - с таким значением восстановленный файл не запустится "кривой импорт". Например для Small_Form_[Original/IIDKing].exe - Import Directory RVA = A000, а OriginalFirstThunk = A064. Проблема не с конкретным файлом; нужно не только научиться делать это руками но и научить "программу" (пишу для себя, так сказать deIIDKing Personal Edition - свой велосипед с квадратными колесами - и пока он не едет).

Файлы которые использую для теста. Внутри: Small_Form_[Original/IIDKing].exe - пустая форма на делфях, свой подопытный (с интересным, а может и нет, значением Import Directory Size). И JQSD_[Original/IIDKing].exe - файл X - так сказать неизвесный файл (приложен оригинал и модифицированный + dll).

ARCHANGEL
Пример чего, файлов ? Так вот они выше ;) Кролики на которых тренируюсь.

-----
Don_t hate the cracker - hate the code.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 04 июня 2015 18:54 · Поправил: -=AkaBOSS=-
· Личное сообщение · #10

Цель всё равно туманна.. Писать обратный алгоритм от воздействия косячой проги, которая даже сместить секции не может, если в хидере места мало

Чуток по теме: тут так же как в случае с ребилдом импорта - по уму не получится, нужен перебор.

1. Смотрим в ту таблицу, что сгенерил IIDKing и отделяем те модули, FirstThunk которых ведёт в ту же секцию, где и текущая директория импорта. Таким образом отсеиваются добавленные модули. Если после отсеивания модулей в списке не осталось, знач директория оригинальная.. или идентичная оригинальной) Кстати, неясно, накой эта утилита генерит два раздельных списка FirstThunk и OriginalFirstThunk.. обычно хватает одного.

2. Теперь, когда у нас есть RVA FirstThunk'ов модулей, гарантированно используемых прогой, можно начинать искать их в файле. Я так понял, структура списка не меняется, поэтому можно предположить, что искомые рва должны найтись в том же порядке на расстоянии в sizeof(IMAGE_IMPORT_DESCRIPTOR).
Берём рва первого OriginalFirstThunk и таким образом получаем начало IAT




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 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 ?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати