Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Как реализовать парсинг PE64 файлов под win32 на делфи?   Найти похожие ветки 

 
gellmar ©   (2006-10-13 23:09) [0]

Доброго времени суток!
Как получить список экспортируемых функций (имя, ординал и адрес RVA) из модуля PE64, работая в Win32 на делфи7 ? Например так, как это делает Dependency Walker из пакета Windows Tools. LoadLibrary и прочие функции не работают, т.к модуль х64, а вызов мапперов даёт какую - то ерунду вместо доступа к таблице экспорта.
Заранее спасибо!


 
Ketmar ©   (2006-10-13 23:42) [1]

таки почитать о формате и сделать всё руками.


 
gellmar ©   (2006-10-14 17:17) [2]

Вот код, который работает для 32- разрядных библиотек

{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE CONSOLE}
program pr;
 uses
 Windows,
 Dialogs,
 SysUtils;

Var
 ImageBase : DWord;
 DosHeader : PImageDosHeader;
 PeHeader  : PImageNtHeaders;
 PExport   : PImageExportDirectory;
 cmdline   : String;
 pname     : PDWord;
 name      : PChar;
 i         : Integer;

Procedure FatalOsError;
begin
 ShowMessage(SysErrorMessage(GetLastError( )));
 Abort;
end;

begin
 try
   If (ParamCount( ) < 1) Then
     Abort
   Else
     cmdline := ParamStr(1);

   ImageBase := GetModuleHandle(PChar(cmdline));
   If (ImageBase = 0) Then
   Begin
      ImageBase := LoadLibrary(PChar(cmdline));
      If (ImageBase = 0) Then FatalOsError;
   End;

   try
     DosHeader := PImageDosHeader(ImageBase);
     If (DosHeader^.e_magic <> IMAGE_DOS_SIGNATURE) Then
         FatalOsError;

     PEHeader := PImageNtHeaders(DWord(ImageBase) + DWord(DosHeader^._lfanew));
     If (PEHeader^.Signature <> IMAGE_NT_SIGNATURE) Then
         FatalOsError;

     PExport := PImageExportDirectory(ImageBase +
DWord(PEHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Virtu alAddress));
     pname   := PDWord(ImageBase + DWord(PExport^.AddressOfNames));

     For i := 0 To PExport^.NumberOfNames - 1 Do begin
       name := PChar(PDWord(DWord(ImageBase)  + PDword(pname)^));
       WriteLn(name);
       inc(pname);
     end;
   finally
     FreeLibrary(ImageBase);
   end;
 except
   Abort;
 end;
end.

Я поменял вызов LoadLibrary (которая не работает для 64х модулей) на код

var
hFile, hMapping:THandle;
 ImageBasePointer:Pointer;
 PrefImageBase, ImageBase : DWord;
...
...
hFile:=CreateFile(PChar(cmdline),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
   hMapping:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,0,nil);
   if hMapping = 0 then FatalOsError;
   ImageBasePointer:=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
   ImageBase:=dword(ImageBasePointer);
...

Всё вроде грузится и даёт доступ к адресам в либе но обращения начиная с

PExport := PImageExportDirectory(ImageBase +
DWord(PEHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Virtu alAddress));
     pname   := PDWord(ImageBase + DWord(PExport^.AddressOfNames));

дают ту самую ерунду.

Как можно сделать, чтобы RVA считалось верно?
Пробовал

PExport := PImageExportDirectory(ImageBase +
DWord(PEHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Virtu alAddress) - PEHeader^.OptionalHeader.ImageBase);
     pname   := PDWord(ImageBase + DWord(PExport^.AddressOfNames));

Смещения начало давать похожие на правду, но доступ к таблице экспорта всё равно ни для 32х, ни 64х модулей не получается.


 
Ketmar ©   (2006-10-15 18:41) [3]

вам, барин, настоятельно рекомендуется снова перечитать [1]. потому как ежели что-то не работает -- значит, формат неверно разбирается. "компрене ву?" (ц)


 
Сергей М. ©   (2006-10-16 09:07) [4]


> gellmar ©   (13.10.06 23:09)


Использованные тобой декларации структур для PE32 не подходят для PE64.



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.042 c
15-1170176379
Chort
2007-01-30 19:59
2007.02.25
Распределить текст по разным столбцам


1-1167208489
Yozch1
2006-12-27 11:34
2007.02.25
цвет хидера в VTV


2-1170918311
fd979
2007-02-08 10:05
2007.02.25
Проблема вставки в MS Access


2-1170416975
Елена
2007-02-02 14:49
2007.02.25
Application.Terminate


2-1170761167
seesm
2007-02-06 14:26
2007.02.25
Как сменить метку диска





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский