Посл.ответ |
Сообщение |
Ранг: 38.0 (посетитель) Активность: 0.01↘0 Статус: Участник
|
Создано: 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.47↘0.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.07↘0 Статус: Участник
|
Создано: 19 ноября 2007 05:09 · Поправил: S_T_A_S_ · Личное сообщение · #3
Лучше не использовать SetFilePointer и т.п, а замапить файл с флагом SEC_IMAGE. Иначе придётся долго решать проблемы из-за разных выравниваний секций в памяти и на диске. + учти, что может быть форвард. Кода в сети куча, на дельфи поищи статью на rsdn.ru про загрузчик.
| Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 19 ноября 2007 09:57 · Личное сообщение · #4
+1 протев ReadFile, мапинг проще.. аффтар пишет на дельфе, а там все стркутуры PE определены, так-что четайте "От зеленого к красному" с wasm'а сложностей возникнуть не должно...
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор 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.01↘0 Статус: Участник
|
Создано: 19 ноября 2007 12:27 · Личное сообщение · #6
Jupiter пишет:
при чём тут SizeOf(NumOfSections) ?
это я описался ...просто не то скопипистил, стал исправлять...исправил не все
За алго спасибо!
Hellspawn за код спасибо....будем разбираться!
| Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 19 ноября 2007 13:23 · Личное сообщение · #7
ne0n пишет:
За алго спасибо!
пожалст. в принципе, код Hellspawn'a по тому же алго ;)
есть нюанс - если ты пишешь не под конкретную прогу (где заведомо известно, что таблица экспорта корректна), то лучше всё-таки вызывать ф-цию для конверта RVA в файловое смещение, т.к. совсем не обязательно, что таблица лежит в одной секции.
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 38.0 (посетитель) Активность: 0.01↘0 Статус: Участник
|
Создано: 20 ноября 2007 01:08 · Личное сообщение · #8
Jupiter таблица всегда корректна(ну я так думаю) но я уже решил что буду делать RVAToFileOffset...даже гдето реализации видел(береженого бог бережет:s5
| Сообщение посчитали полезным: |
Ранг: 228.7 (наставник), 2thx Активность: 0.12↘0 Статус: Участник 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.04↘0 Статус: Участник
|
Создано: 20 ноября 2007 03:39 · Личное сообщение · #10
ne0n
Юзай эти функи:
ImageRVAToVa
ImageRVAToSection
ImageNTHeaders
----- The truth is out of there... | Сообщение посчитали полезным: |
Ранг: 115.1 (ветеран), 3thx Активность: 0.07↘0 Статус: Участник
|
Создано: 20 ноября 2007 13:49 · Личное сообщение · #11
смотрите сорцы pedump (Matt Pietrek)
все вопросы отпадут
| Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 21 ноября 2007 02:16 · Личное сообщение · #12
ne0n пишет:
но я уже решил что буду делать RVAToFileOffset
RVAToFileOffset тебе придётся делать в любом случае, как ты иначе прочитаешь по адресу, на который указывает элемент таблицы? у тебя ж не "плоский" файл с одной сплошной секцией.
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 38.0 (посетитель) Активность: 0.01↘0 Статус: Участник
|
Создано: 21 ноября 2007 17:27 · Личное сообщение · #13
всем спасибо во всем разобрался(но не полоностью буду курить доки) !
| Сообщение посчитали полезным: |