eXeL@B —› Программирование —› IID.ForwarderChain такли уж он нужен ? |
Посл.ответ | Сообщение |
|
Создано: 07 октября 2008 22:30 · Поправил: theCollision · Личное сообщение · #1 Всем хай. Чтото не воткну, на кой икс этот параметр в импорте сис.загрузчику нужен ? Да, это первый индекс форвардируемой ф-ции и что с того ? Как это может влиять на импортирование ? Прошу ситуацию когда kernel32.HeapAlloc->Ntdll.RtlHeapAlloc(или чтот вроде этого) не указывать, это ясно и понятно, но это же при экспорте нужно. Также понятно на кофиг ваще форвардинг нужен и где от него польза! Но вот убейте, но не могу понять на кой фиг нужен при импортировании ? ))) ЗЫ: Упаковщики не предлагать, там про это один листинг на си и другой рип из ИДА и сказано что это индекс первого форварда, а это как вы знаете я уже итак понимаю ! ;) Пока не могу, может пока кто-то пишет уже догадаюсь за чем и как все это делается ))) ----- My love is very cool girl. |
|
Создано: 07 октября 2008 22:55 · Поправил: theCollision · Личное сообщение · #2 Млять, нашел что-то: he IAT and Forwarded API Processing Once LdrpWalkImportDescriptor knows that the module is in memory (either through a call to LoadLibraryExW way back at the beginning or via the LdrpMapDll call in LdrpLoadImportModule), the next step is to examine each and every API referenced in Forwarded's imported module list with the call to LdrpSnapIAT. Why is this necessary? There are two reasons. First, you want to replace the placeholders in the Import Address Table (IAT) with real entry points. Second, you need to locate and process APIs that may have been forwarded on to another DLL. (Forwarding is one technique Microsoft employs to expose a common Win32 API set and to hide the low-level differences between the Windows NT and Windows 9x platforms.) Но как-то туманно ;( или мой уровень настоко низок, что могу ощутить смысл ----- My love is very cool girl. |
|
Создано: 07 октября 2008 23:37 · Личное сообщение · #3 С помощью форвардинга ты можешь определить какая функция будет вызываться вместо той, что обозначена в импорте/экспорте твоего приложения. В качестве примера можно привести вызов функции EnterCriticalSection из kernel32.dll. Такой функции просто не существует, и при обращении к ней на самом деле вызывается функция RtlEnterCriticalSection из ntdll.dll. Вот и ты точно также можешь задать какая функция из другого модуля будет вызываться вместо обозначенной. При этом приложение не будет напрямую вызывать функцию из другого модуля, об этом будет заботится загрузчик. А выгода от этого в совместимости, т.к. например, если ты запустишь дамп в импорте которого будет функция RtlEnterCriticalSection из ntdll.dll на Windows 9x, то получишь сообщение об ошибке в ответ (ntdll.dll то там нет). А если там будет EnterCriticalSection из kernel32.dll, то приложение нормально запуститься. |
|
Создано: 08 октября 2008 00:00 · Поправил: theCollision · Личное сообщение · #4 kioresk Это ты про экспорт говоришь! ;) Про экспорт-то понятно, изначально в своем первом посте сказал! Но вот при импортировании нафиг надо то ? Мне представляется работа загрузчика таковой: 1. Берется очередной рва строки ф-ции или ее ординал в IAT 2. Ищется или грузится нужная dll(exe, модуль) 3. Находится рва в EAT , если это форвардинг 3, то ищется в указанный модуль, который подгружается или уже находится в памяти 4. Потом по ординалу\имени находится адрес реализации, может быть и этот форвардинг, тогда повтор 5. Найденное подставляется в IAT, что в п.1 ! вот скажите плиз, на кой фиг в этом алгоритме нужен ForwarderChain ? ----- My love is very cool girl. |
|
Создано: 08 октября 2008 07:35 · Личное сообщение · #5 -- 1 -- Зайди сюда www.uinc.ru/articles/41/ там с примерами, вот отрывок Файл с API-forwarding будет иметь таблицу экспорта с функцией, имеющей нестандартный RVA, значение которого не будет укладываться в лимит размера директории. Алгоритм обработки таких форвардов заложен в функцию LdrpSnapIAT и, как нам кажется, Russell в своей статье здесь допустил ошибку. Смотрите: NTSTATUS LdrpSnapIAT ... { … // there are forwarders if (-1 != pImageImportDescriptor->ForwarderChain) { IATFirstThunkEntry = pLoadingItem->ImageBase + pImageImportDescriptor->FirstThunk + (pImageImportDescriptor->ForwarderChain / 4); … } -- 2 -- www.rsdn.ru/article/baseserv/pe_coff.xml DWORD ForwarderChain Это поле имеет отношение к передаче, когда одна DLL передает ссылку на какую-то свою функцию другой DLL. Например, в Windows NT KERNEL32.DLL посылает несколько своих экспортируемых функций NTDLL.DLL. Приложение может посчитать это вызовом функции в KERNEL32.DLL, но в итоге это будет вызов в NTDLL.DLL. Это поле содержит указатель в массив FirstThunk (описан вкратце). Функция, указанная этим полем, будет послана в другую DLL. К сожалению, формат посылки функции лишь вкратце описан в документации Microsoft. За дополнительной информацией о посылке обращайтесь к разделу "Передача экспорта" в этой главе. -- 3 -- wasm.ru/print.php?article=pe_inf А как же быть, если dll экспортирует функцию код которой содержится в другой dll, т.е. при форварде? Ведь у "другой" dll неизвестно время ее создания и версия... Во избежания всех связанных с этим печальных последствий, в каталоге импорта загружаемого файла в структуре IMAGE_IMPORT_DESCRIPTOR есть поле ForwarderChain, которое содержит индекс первого импортируемого форварда в массиве FirstThunk. Элементом с таким индексом в массиве FirstThunk является элемент содержащий индекс следующего импортируемого форварда в этом же массиве. И так по цепочке, пока не встретится элемент со значением -1, что означает - форвардов больше нет. Логика загрузчика такова, если он встретил ForwarderChain не равное -1, то он пройдет по цепочке форвардов и перепатчит их адреса, т.е. форварды перепатчиваются всегда! ----- Yann Tiersen best and do not fuck |
|
Создано: 08 октября 2008 10:14 · Личное сообщение · #6 PE_Kill Я писал еще в первом посте: >>ЗЫ: Упаковщики не предлагать, там про это один листинг на си и другой рип из ИДА и сказано что это индекс первого форварда, а это как вы знаете я уже итак понимаю ! ;) Если внимательно почитать п.1. то там кроме слов: "ForwarderChain здесь является индексом первого форварда." больше по существу ничего нет, читая мое "зы" вверху ты знаешь что я уже знаю что этот ForwarderChain является индексом! Тоже самое по п.2. Ед. что проливает хоть не много свету на мой вопрос это п.3, но ! Скажите пожалуйста, какое нафиг импорту дело, откуда взяли адрес и поставили в него ? Зачем ему надо знать, что ф-ция на самом деле не с той длл, а форварднутая ? Он ведь всего лишь хранит адрес и ему по сути должно фиолетово как получен этот адрес ! ;) Опять же смотрим в п.3 "Ведь у "другой" dll неизвестно время ее создания и версия..." . Как это не известно ? Берем рва-строки ф-ции или ее ординал, Переходим в экспорт длл, потом находим соотвествующий адрес в ее ИАТ(FirstChunk) и тут же понимаем что это форвард или нет, если форвард то находим длл, либо подгружаем длл(об этом я уже писал). Думается это стандартная последовательность работы GetProcAddress . Так скажите, как это можно не знать время и создание версии, если длл или подгружена или найдена ?! ----- My love is very cool girl. |
|
Создано: 08 октября 2008 10:44 · Личное сообщение · #7 |
|
Создано: 08 октября 2008 12:09 · Личное сообщение · #8 приложу-ка я интересный файлик ) Это лог вывода содержимого обычного импорта,после применения bind -o -u my_tools.exe, моя тулза применяет токо kernel32.dll и тоже самое что и в этом логе показывает и LordPE c38f_08.10.2008_CRACKLAB.rU.tgz - 01_PEInfo.txt ----- My love is very cool girl. |
|
Создано: 08 октября 2008 12:22 · Личное сообщение · #9 kioresk пишет: В качестве примера можно привести вызов функции EnterCriticalSection из kernel32.dll. Такой функции просто не существует, и при обращении к ней на самом деле вызывается функция RtlEnterCriticalSection из ntdll.dll. А реально ли такое реализовать в masm32 ? что-то не нашел никакого упоминания на этот счет... ни одного примера... например, если писать враппер к какой-нибудь длл и просто перенаправить все апи на оригинальную длл`ку, а перехватить только нужные апи... |
|
Создано: 08 октября 2008 12:41 · Личное сообщение · #10 |
|
Создано: 08 октября 2008 15:48 · Личное сообщение · #11 |
eXeL@B —› Программирование —› IID.ForwarderChain такли уж он нужен ? |