| Посл.ответ | 
Сообщение | 
 Ранг: 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 
всем спасибо   во всем разобрался(но не полоностью   буду курить доки) !
   | Сообщение посчитали полезным:  |