eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: FireInAHole
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

Ранг: 57.1 (постоянный)
Статус: Участник

Создано: 18 ноября 2012 12:09 New!
Цитата · Личное сообщение · #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?

Ранг: 566.0 (!)
Статус: Модератор

Создано: 18 ноября 2012 12:48 · Поправил: r_e New!
Цитата · Личное сообщение · #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 (постоянный)
Статус: Участник

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

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

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

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

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


Ранг: 1983.5 (!!!!)
Статус: Модератор
retired

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

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

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


Ранг: 57.1 (постоянный)
Статус: Участник

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

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

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


Ранг: 307.7 (мудрец)
Статус: Участник

Создано: 4 июня 2015 11:13 · Поправил: 4 июня 2015 11:14 mysterio New!
Цитата · Личное сообщение · #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. Сорри за некропостинг, не хотелось создавать новую тему.


Ранг: 147.4 (ветеран)
Статус: Участник

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

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

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


Ранг: 307.7 (мудрец)
Статус: Участник

Создано: 4 июня 2015 15:46 · Поправил: 4 июня 2015 17:05 mysterio New!
Цитата · Личное сообщение · #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
Пример чего, файлов ? Так вот они выше ;) Кролики на которых тренируюсь.


Ранг: 654.2 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 4 июня 2015 16:51 New!
Цитата · Личное сообщение · #9

mysterio
RVA должно равняться первому IMAGE_IMPORT_DESCRIPTOR, размер загрузчик вычисляет сам, не опираясь на поле в заголовке, считается, что первый нулевой IMAGE_IMPORT_DESCRIPTOR и будет служить завершением таблицы импорта.

Для автоматического восстановления нужно эвристически искать что-то похожее на IMAGE_IMPORT_DESCRIPTOR, т.е. искать и проверять, соответствуют ли все последовательно идущие друг за другу структуры IMAGE_IMPORT_DESCRIPTOR фактическому заполнению функциями из таблицы.

Возможно, если приложите пример, то люди покажут на практике, как искать.


Ранг: 147.4 (ветеран)
Статус: Участник

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

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

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

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

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


Ранг: 307.7 (мудрец)
Статус: Участник

Создано: 8 июня 2015 13:29 · Поправил: 8 июня 2015 13:30 mysterio New!
Цитата · Личное сообщение · #11

Проблему решил пару дней назад - топик можно закрыть. Если кому интересно - все необходимое по восстановлению Import Directory RVA находится в секции IIDKinga - нужно лишь правильно применить. Велосипед, видимо, из-за "квадратных колес" на своем же примере с пуcтой формой не "завелся" (можно и пешком пройтись - руками ), зато на реальных примерах (если конечно нет подвоха) "едет" на ура Thanks all.
 eXeL@B —› Программирование —› Какой практический смысл в поле IMAGE_IMPORT_DISCRIPTOR.ForwardChain ?

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS