|
|
| Посл.отвђт | Сообщен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: |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.105 |