AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

.text section dumpen

Ein Thema von Lyan · begonnen am 21. Okt 2015 · letzter Beitrag vom 22. Okt 2015
Antwort Antwort
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#1

AW: .text section dumpen

  Alt 22. Okt 2015, 16:39
Habe leider nichts fertiges hier, aber zum iterieren der Sections schnell aus dem Kopf:
Delphi-Quellcode:
    WriteLn('Section Name:');
    WriteLn(PAnsiChar(@ImageSectionHeader^.Name[0]));
Das ist strenggenommen falsch, denn TImageSectionHeader.Name ist nicht notwendigerweise nullterminiert!
Wenn der Name genau 8 Zeichen lang ist, wird ein einfacher PAnsiChar-Cast wie oben möglicherweise zusätzlichen Müll ausgeben.

TImageSectionHeader.Name ist dummerweise als Array of Byte deklariert, nicht als Array of Char.
Für letzteres hat Delphi nämlich ein paar Compiler-Magic-Funktionen, die aus einem Array of (Ansi)Char einen (Ansi)String machen und dabei nicht stur nach der Nullterminierung suchen, sondern auch die Maximallänge des Arrays berücksichtigen (_LStrFromArray, _LStrFromWArray, _UStrFromArray, _UStrFromWArray).

Um es besser zu machen, muss man entweder eigenen Code schreiben, der das Name-Bytearray in einen String kovertiert, oder man benutzt einfach einen Cast auf ein passendes Char-Array, damit die Compiler-Magic benutzt wird:
Delphi-Quellcode:
type
  TImageSectionHeaderName = array [0..IMAGE_SIZEOF_SHORT_NAME-1] of AnsiChar; // genaugenommen UTF-8 Bytes, argh
// ..
    WriteLn('Section Name:');
    WriteLn(TImageSectionHeaderName(ImageSectionHeader^.Name));
Um es ganz korrekt zu machen, sollte man den String als UTF-8 kodiert ansehen und dekodieren lassen...


Hier mal Code von mir:
Delphi-Quellcode:
// GetModuleSectionHeaders: get an array of all TImageSectionHeader structures of a given Module
function GetModuleSectionHeaders(const Module: HMODULE): TArray<TImageSectionHeader>;
var
  DosHeader: PImageDosHeader;
  NtHeaders: PImageNtHeaders;
  SectionHeader: PImageSectionHeader;
  i: Integer;
begin
begin
  Result := nil;
  DosHeader := PImageDosHeader(Module); // a HMODULE is a memory address
  // navigate the various headers and check their signatures
  if DosHeader.e_magic <> IMAGE_DOS_SIGNATURE then Exit;
  NtHeaders := Pointer(PByte(Module) + DosHeader._lfanew);
  if (NtHeaders.Signature <> IMAGE_NT_SIGNATURE) or
    (NtHeaders.OptionalHeader.Magic <> IMAGE_NT_OPTIONAL_HDR32_MAGIC) then Exit;
  // corrected, thanks to Zacherl
  SectionHeader := PImageSectionHeader(PByte(NtHeaders) + SizeOf(TImageNtHeaders) -
    SizeOf(TImageOptionalHeader) + NtHeaders^.FileHeader.SizeOfOptionalHeader);
  SetLength(Result, NtHeaders.FileHeader.NumberOfSections);
  for i := Low(Result) to High(Result) do
  begin
    Result[i] := SectionHeader^;
    // add Module's current base address to VirtualAddress
    Inc(Result[i].VirtualAddress, UIntPtr(Module));
    Inc(SectionHeader);
  end;
end;

// GetSectionHeaderName: convert SH.Name from UTF-8 byte array to string
function GetSectionHeaderName(const SH: TImageSectionHeader): string;
type
  TSectionHeaderName = array [0..IMAGE_SIZEOF_SHORT_NAME-1] of AnsiChar;
var
  Raw: RawByteString;
begin
  Raw := TSectionHeaderName(SH.Name); // _LStrFromArray
  Result := UTF8ToString(Raw);
end;

var
  SH: TImageSectionHeader;
begin
  for SH in GetModuleSectionHeaders(HInstance) do
    Writeln(Format('%-8s : VirtualAddress=%.8x, VirtualSize=%.8x, Characteristics=%.8x',
      [GetSectionHeaderName(SH), SH.VirtualAddress, SH.Misc.VirtualSize, SH.Characteristics]));
end;

Geändert von SMO (22. Okt 2015 um 18:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: .text section dumpen

  Alt 22. Okt 2015, 17:35
Das ist strenggenommen falsch, denn TImageSectionHeader.Name ist nicht notwendigerweise nullterminiert!
Wenn der Name genau 8 Zeichen lang ist, wird ein einfacher PAnsiChar-Cast wie oben möglicherweise zusätzlichen Müll ausgeben.
Da hast du recht!

Deine Funktion berechnet allerdings den Zeiger auf die erste ImageSection nicht korrekt. SectionHeader := PImageSectionHeader(NativeInt(NtHeaders) + SizeOf(NtHeaders^)) funktioniert nicht immer. Ist zwar ein ziemlich synthetischer Fall, aber das PE Format sieht vor, dass der OptionalHeader eine variable Länge haben kann. Deshalb muss die korrekte Berechnung über
Delphi-Quellcode:
ImageSectionHeader := PImageSectionHeader(PByte(ImageNtHeaders) + SizeOf(TImageNtHeaders) -
    SizeOf(TImageOptionalHeader) + ImageNtHeaders^.FileHeader.SizeOfOptionalHeader)
erfolgen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#3

AW: .text section dumpen

  Alt 22. Okt 2015, 17:53
Danke! Wieder was gelernt.
Der Code von mir war auch schon etwas älter, sehe ich gerade an der Benutzung von NativeInt. Heute caste ich Pointer nur noch auf vorzeichenlose Typen (NativeUInt oder UIntPtr), oder gleich auf PByte wie in deinem Beispiel.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz