Текущий архив: 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