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

 eXeL@B —› Программирование —› получения таблицы экспорта файла
Посл.ответ Сообщение

Ранг: 38.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 19 ноября 2007 02:34 · Поправил: ne0n
· Личное сообщение · #1

вообщем необходимо получить таблицу экспорта файла ну точнее не саму таблицу а RVA некой функции...
но вобщем фроде формат читал но не доконца разобрался...начнем с того до чего я дошел:
получил адрес таблицы экспорта(ну перед этим получил смещение PE заголовка PEHeaderOffset):
SetFilePointer(FHandle,PEHeaderOffset + $78, nil,0);
ReadFile(Fhandle,ExportTableRVA,SizeOf(ExportTableRVA), BRead, nil);

но что то я так и не разобрался как получит функции и их RVA подскажите пожалуйста как это сделать, можно конечно кусок кода дать)




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 19 ноября 2007 03:10
· Личное сообщение · #2

твой код:
ReadFile(Fhandle,ExportTableRVA,SizeOf(NumOfSections), BRead, nil);
при чём тут SizeOf(NumOfSections) ?

примерный алго:
получил смещение PE заголовка IMAGE_DOS_HEADER.e_lfanew
узнал адрес таблицы экспорта IMAGE_NT_HEADERS.OptionalHeader.DataDirectory.VirtualAddress
получил указатель на имена IMAGE_EXPORT_DIRECTORY.AddressOfNames
перечисляешь имена, сверяя счётчик с IMAGE_EXPORT_DIRECTORY.NumberOfNames
когда нашёл имя нужной ф-ции,
узнаёшь номер ф-ции IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals
получаешь адрес [edi].IMAGE_EXPORT_DIRECTORY.AddressOfFunctions

если ты знаешь формат PE, тебе будет не так уж сложно написать функцию

если лень думать своей головой - пиши, может напишу для тя ф-цию на асме ;)

-----
EnJoy!




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 19 ноября 2007 05:09 · Поправил: S_T_A_S_
· Личное сообщение · #3

Лучше не использовать SetFilePointer и т.п, а замапить файл с флагом SEC_IMAGE. Иначе придётся долго решать проблемы из-за разных выравниваний секций в памяти и на диске. + учти, что может быть форвард. Кода в сети куча, на дельфи поищи статью на rsdn.ru про загрузчик.




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 ноября 2007 09:57
· Личное сообщение · #4

+1 протев ReadFile, мапинг проще.. аффтар пишет на дельфе, а там все стркутуры PE определены, так-что четайте "От зеленого к красному" с wasm'а сложностей возникнуть не должно...

-----
invoke OpenFire





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 19 ноября 2007 10:54 · Поправил: Hellspawn
· Личное сообщение · #5

вот тебе код

type
TDWordArray = array [0..0] of DWORD;
TWordArray = array [0..0] of WORD;
PDWordArray = ^TDWordArray;
PWordArray = ^TWordArray;
...
pDosHeader : PImageDosHeader;
pPeHeader : PImageNtHeaders;
pPExport : PImageExportDirectory;
pName : PDWordArray;
pFunc : PDWordArray;
pOrd : PWordArray;
...
pDosHeader := PImageDosHeader(dwImageBase);
...
pPEHeader := PImageNtHeaders(dwPtr+DWord(PImageDosHeader(dwImageBase)._lfanew));
...
pPExport := PImageExportDirectory(dwPtr+pPEHeader.OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
pName := POINTER(dwPtr + DWord(pPExport.AddressOfNames));
pFunc := POINTER(dwPtr + DWord(pPExport.AddressOfFunctions));
pOrd := POINTER(dwPtr + DWord(pPExport.AddressOfNameOrdinals));
For i := 0 to pPExport.NumberOfNames - 1 do
begin
...
end;


-----
[nice coder and reverser]




Ранг: 38.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 19 ноября 2007 12:27
· Личное сообщение · #6

Jupiter пишет:
при чём тут SizeOf(NumOfSections) ?

это я описался...просто не то скопипистил, стал исправлять...исправил не все
За алго спасибо!
Hellspawn за код спасибо....будем разбираться!




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 19 ноября 2007 13:23
· Личное сообщение · #7

ne0n пишет:
За алго спасибо!

пожалст. в принципе, код Hellspawn'a по тому же алго ;)
есть нюанс - если ты пишешь не под конкретную прогу (где заведомо известно, что таблица экспорта корректна), то лучше всё-таки вызывать ф-цию для конверта RVA в файловое смещение, т.к. совсем не обязательно, что таблица лежит в одной секции.

-----
EnJoy!




Ранг: 38.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 20 ноября 2007 01:08
· Личное сообщение · #8

Jupiter таблица всегда корректна(ну я так думаю) но я уже решил что буду делать RVAToFileOffset...даже гдето реализации видел(береженого бог бережет:s5



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 20 ноября 2007 02:17 · Поправил: Error_Log
· Личное сообщение · #9

Еще есть такая функа в NTDLL - RtlImageDirectoryEntryToData,
NTSYSAPI
PVOID
RtlImageDirectoryEntryToData(
IN PVOID Base,
IN BOOLEAN MappedAsImage,
IN USHORT DirectoryEntry,
OUT PULONG Size
);
в данном случае
( PIMAGE_EXPORT_DIRECTORY )RtlImageDirectoryEntryToData( Image, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size );

-----
Research is my purpose





Ранг: 111.1 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 20 ноября 2007 03:39
· Личное сообщение · #10

ne0n
Юзай эти функи:
ImageRVAToVa
ImageRVAToSection
ImageNTHeaders

-----
The truth is out of there...




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 20 ноября 2007 13:49
· Личное сообщение · #11

смотрите сорцы pedump (Matt Pietrek)
все вопросы отпадут




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 21 ноября 2007 02:16
· Личное сообщение · #12

ne0n пишет:
но я уже решил что буду делать RVAToFileOffset


RVAToFileOffset тебе придётся делать в любом случае, как ты иначе прочитаешь по адресу, на который указывает элемент таблицы? у тебя ж не "плоский" файл с одной сплошной секцией.

-----
EnJoy!




Ранг: 38.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 21 ноября 2007 17:27
· Личное сообщение · #13

всем спасибо во всем разобрался(но не полоностью буду курить доки) !


 eXeL@B —› Программирование —› получения таблицы экспорта файла
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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