· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› FirstThunk, вытащить реальный адрес для конкретной API?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 21, 2004 17:32:20

Вобщем прочитал кучу всяких статей от Ицзелиона и заканчивая "Об упаковщиках...",
и совсем запутался, нужно по известному имени API найти место в массиве FirstThunk,
где лежит реальный RVA этой API, хотелось бы алгоритм поиска для файла уже загруженного
в память.


Дата: Янв 21, 2004 18:13:24

Пардон, в загруженном файле уже нет RVA. Массив имеет только VA. Не путайся :)


Дата: Янв 21, 2004 19:13:57

> Пардон, в загруженном файле уже нет RVA. Массив имеет только VA. Не путайся

Это только после борландовского линкера связывание идет по IAT и тогда уже низзя в памяти ничего найти. А вот у мелкомягких параллельно IAT идет еще один который не изменяется. Вот.


Дата: Янв 21, 2004 19:28:46

А вот у мелкомягких параллельно IAT идет еще один который не изменяется

Тогда мы говорим об OriginalFirstThunk!
Не надо путаницу разводить!


Дата: Янв 21, 2004 20:04:54 · Поправил: Dr.Golova

Ха, гы! Я оказывается не понял ни вопроса, ни твоего ответа %)
Так вот ответ: Перебираем входы в OriginalFirstThunk пока не найдем указывающий на нужное имя. Берем FirstThunk с таким же именем и имеем как RVA этого входа, так и VA загруженной функции. Для борланда соответсно массивы сопадают - часть ищем по куску из файла, часть попамяти. Помойму так, или я опять чета не допонял?

ЗЫ: И все из-за того что я всегда пользовался самопальной структуркой:
typedef struct sIMPORT_DIRECTORY_ENTRY {
  tDWORD  ImportLookUp;    // offset of lookup table.
  tDWORD  TimeDateStamp;   // junk, usually 0.
  tDWORD  ForwardChain;    // junk, usually -1.
  tDWORD  NameRVA;         // rva of dll name.
  tDWORD  AddressTableRVA; // rva of import address table.
} tIMPORT_DIRECTORY_ENTRY, *pIMPORT_DIRECTORY_ENTRY;


Дата: Янв 21, 2004 20:07:00

Теперь ОК :)


Дата: Янв 21, 2004 20:26:04

Во-во, я в этих структурах запутался, хотел как у дяденьки Ицзелиона :-) Ладно, что-нить домозгую.


Дата: Янв 21, 2004 20:42:04

Я вот только опять не понимаю, когда файл уже загружен массив FirstThunk содержит
реальные виртуальные адреса, а не RVA указывающие на имена API, как же их сопоставить,
чтоб найти например виртуальный адрес именно для CreateProcessA??

Кстати я не зря VA / RVA путаю, в некоторых статьях различий в них не делают.


Дата: Янв 21, 2004 22:14:07

Вобщем я перебрал Name1 в IMAGE_IMPORT_DESCRIPTOR для поиска kernel32.dll, ну нашёл, теперь в каком направлении идти или я вообще не то делаю??


Дата: Янв 21, 2004 22:59:11 · Поправил: volodya

1) Действительно, FirstThunk содержит VA.
2) Для частных случаев OriginalFirstThunk содержит RVA даже в загруженном файле. Чаще этого массива просто нет.
3) Если ты нашел имя библиотеки, то самое время сканировать ее директорию экспорта для поиска твоего API. Имеешь VA твоего API. Находишь имя нужной dll и начинаешь ее лопатить в поисках твоего API. Используй таблицу экспорта.


Дата: Янв 21, 2004 23:45:44

Что-то не то..
Во-первых, у меня exe'шник,
причём уже запущенный, т.е. в памяти,
мне нужно найти то место в FirstThunk где для функции CreateProcessA записан реальный VA!
Если бы FirstThunk содержала RVA - указатель на имя функции в массиве IAT не было бы никаких проблем, единственный выход сканировать дополнительно файл на диске, мне это не очень нравится :-(


Дата: Янв 22, 2004 00:03:50

то место в FirstThunk где для функции CreateProcessA записан реальный VA!

Ну и как ты планируешь этого добиться? Информация перетерта! Надо как-то восстановить. Для этого надо использовать директорию экспорта целевой dll.


Дата: Янв 22, 2004 00:28:41 · Поправил: Asterix

Только что попробовал проделать такое, получилась какая-то фигня, почему-то FirstThunk содержит RVA вместо VA??

[...код удалён как ошибочный :-)]


Дата: Янв 22, 2004 00:50:44

почему-то FirstThunk содержит RVA вместо VA??

Такого не может быть, потому что такого не может быть никогда :) В качестве эксперимента возьми и загрузи файл в отладчике. Любой. Пойди подбери в PE Tools RVA директории. Прибавь к нему ImageBase. Потом по указанному адресу возьми 5-й DWORD и погляди, какие адреса в том массиве :)

А что до цикла, то, кажется, у тебя ошибочка в
add edi, sizeof IMAGE_IMPORT_DESCRIPTOR. Ты добавляй +4. И прогляди этот цикл под отладчиком.


Дата: Янв 22, 2004 09:33:02

Вроде разобрался, пока не касаясь исключительных ситуаций получается где-то так:
   assume edi:ptr IMAGE_NT_HEADERS
   mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
   add edi, hInstance
   assume edi:ptr IMAGE_IMPORT_DESCRIPTOR
@loop1:
   mov eax, [edi].Name1
   add eax, hInstance
   mov lpszName1, eax
   invoke lstrlen, eax
   test eax, eax
   jz @not_found
   invoke lstrcmpi, OFFSET szKernel32, lpszName1
   test eax, eax
   jz @F
   add edi, sizeof IMAGE_IMPORT_DESCRIPTOR
   jmp @loop1
@@:
   invoke GetModuleHandle, OFFSET szKernel32
   invoke GetProcAddress, eax, OFFSET szCreateProcess
   mov VA_Of_CreateProcess, eax
   mov esi, [edi].FirstThunk
   add esi, hInstance
@loop:
   mov eax, DWORD PTR [esi]
   test eax, eax
   jz @exit
   cmp VA_Of_CreateProcess, eax
   je @found
   add esi, 004h
   jmp @loop
@found:

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.105