Ich muss auch gestehen, dass ich die letzte Zeile in diesem Thread gelöscht habe. In der stand: "Ich warte dann mal auf die Antwort von Zacherl, mit viel Glück hat er noch was übrig".
Habe leider nichts fertiges hier, aber zum iterieren der Sections schnell aus dem Kopf:
Delphi-Quellcode:
var
ImageBase: Pointer;
ImageDosHeader: PImageDosHeader;
ImageNtHeaders: PImageNtHeaders;
ImageSectionHeader: PImageSectionHeader;
I: Integer;
begin
ImageBase := Pointer(hInstance);
ImageDosHeader := PImageDosHeader(ImageBase);
if (ImageDosHeader^.e_magic <> IMAGE_DOS_SIGNATURE) then
begin
Exit;
end;
ImageNtHeaders := PImageNtHeaders(PByte(ImageDosHeader) + ImageDosHeader^._lfanew);
if (ImageNtHeaders^.Signature <> IMAGE_NT_SIGNATURE) then
begin
Exit;
end;
ImageSectionHeader := PImageSectionHeader(PByte(ImageNtHeaders) + SizeOf(TImageNtHeaders) -
SizeOf(TImageOptionalHeader) + ImageNtHeaders^.FileHeader.SizeOfOptionalHeader);
I := 1;
while (I < ImageNtHeaders^.FileHeader.NumberOfSections) do
begin
WriteLn('Section Name:');
WriteLn(PAnsiChar(@ImageSectionHeader^.Name[0]));
WriteLn('Virtual Address:');
WriteLn(IntToHex(NativeUInt(ImageBase) + ImageSectionHeader^.VirtualAddress,
SizeOf(Pointer) * 2));
WriteLn('Size:');
WriteLn(IntToHex(ImageSectionHeader^.SizeOfRawData, 1));
Inc(ImageSectionHeader);
Inc(I);
end;
end;
Statt hInstance kannst du auch die ImageBase einer beliebigen
Dll nehmen, falls du das brauchst. Die Section dumpst du dir dann einfach mit CreateFile/WriteFile über die Virtual Address.
Würde mich allerdings nicht drauf verlassen, dass sich alle Binaries an die .text bzw. .code Konvention bezüglich des Section Names halten.