Главная страница
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.48 MB
Время: 0.031 c
4-1160804337
dreamse
2006-10-14 09:38
2007.02.25
SafeMode


2-1170782271
Novichok_new
2007-02-06 20:17
2007.02.25
Цикл for назад


15-1170225138
vitv
2007-01-31 09:32
2007.02.25
В чём преимущества MSSQL2000 над IB6X(FB1.5.X)?


2-1170756864
Cara
2007-02-06 13:14
2007.02.25
ADOConnection и Acceess


2-1171017452
User_OKA
2007-02-09 13:37
2007.02.25
база Interbase