Главная страница
    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.043 c
15-1170200828
hmmm
2007-01-31 02:47
2007.02.25
google


2-1170926132
kilop
2007-02-08 12:15
2007.02.25
как сделать так чтобы при запуске форма появлялась в центре


15-1170402730
Empleado
2007-02-02 10:52
2007.02.25
Всех с Днем Сурка!


2-1170742872
Нож
2007-02-06 09:21
2007.02.25
Interbase тормозит... почему?


2-1170431934
nordic3
2007-02-02 18:58
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский