AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi PE DATA und CODE Section dumpen / modifizieren / hinzufügen
Thema durchsuchen
Ansicht
Themen-Optionen

PE DATA und CODE Section dumpen / modifizieren / hinzufügen

Ein Thema von Zacherl · begonnen am 21. Jun 2007 · letzter Beitrag vom 24. Jun 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: PE DATA und CODE Section dumpen / modifizieren / hinzufü

  Alt 24. Jun 2007, 00:41
hy there,

ich weiß nicht wie das bei delphi 2005 ist, aber gibts da nicht annähernd die selben demos wie auch in delphi 7???
wenn ja hilft dir nicht das demo vom resexplorer (\delphi\Demos\ResXplor) weiter?? da dürftest du doch alles drin finden was du zum auslesen und dumpen der sectionen benötigst???!!!
Martin
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#12

Re: PE DATA und CODE Section dumpen / modifizieren / hinzufü

  Alt 24. Jun 2007, 02:04
Hier hab ich etwas in der Richtung gesehen:
http://www.buha.info/board/showthread.php?t=52783
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: PE DATA und CODE Section dumpen / modifizieren / hinzufü

  Alt 24. Jun 2007, 09:50
Ich wollte grad ein paar Codebeispiele (wie man in eine EXE etwas einfügt) von mir einblenden, aber das wird zu viel und zu undurchsichtig.
Hier also eine "kurze" Variante von dem umfangreichen Thema.


Folgende Vorgehensweise schlage ich vor (habe ich mal benutzt):
1. Datei in einem TMemoryStream laden (ich habe gleich eine Klasse davon abgeleitet)

2. Header lesen
Die einzelnen Header sind schon als Record in der Unit Windows definiert.
Delphi-Quellcode:
pDosHeader:PImageDosHeader //siehe unit windows
pNTHeader:PImageNtHeaders
//...


//das sieht dann in etwa so aus.
pdosheader:=mpos(0);
if pdosheader^.e_magic<>'MZthen exit;
pNTHeader:=mpos(pDOSHEADER^.e_lfanew);
//usw.... Ich nehme mal an du kennst den Aufbau des PE-Kopfes
//(die SectionHeader kommen am Ende des PE-Headers)

//mpos liefert nur den Pointer aus einer bestimmten Position von TMemorystream.Memory
function TPEReader.mpos(position: Cardinal):pointer;
begin
  result:=pointer(cardinal(memory)+position);
end;
Wenn du die ganzen einzelnen recordpointer positioniert hast, kannst du auch problemlos die einzelnen Eigenschaften lesen.
Du kannst auch den Headerteil aus memory herauskopieren:
Delphi-Quellcode:
NTHeader:TImageNTHeader;
//...
move(mpos(pDOSHEADER^.e_lfanew),NTHeader,sizeof(NTHeader));
//Achtung: das system.move klappt so nicht ganz!!
Damit bekommst du alle Infos aus dem Header.


3. Daten ändern
Hierzu brauchst du nur in deinem Stream rumschreiben und ihn schließlich wieder speichern.
Den Headerteil kannst du recht simpel über die RecordPointer aus Schritt zwei ändern.
Beim ändern einer Section (inkl. Vergrößern/verkleinern) musst du natürlich darauf achten, dass
- die Section sich jetzt nicht mit anderen sections überschneidet
- Eigenschaft SizeOfRawdata anpassen
- Eigenschaft VirtualSize anpassen
- Eigenschaft SizeOf(Un)InitializedData oder SizeofCode anpassen
- Eigenschaft SizeOfImage anpassen
- auf Sectionalignment und Filealignment achten
Mein Code um Daten im TMemorystream einzufügen:
Delphi-Quellcode:
procedure TPEReader.insert(text: string; pos: Integer);
var i,s,os:integer;
    source,dest:pbyte;
    p:pointer;
begin
  s:=length(text);
  os:=size;
  size:=size+s; //Tmemorystream.size vergrößern
  source:=mpos(os-1);
  dest:=mpos(size-1);
  for i:=1 to s+(os-pos) do begin
    dest^:=source^;
    dec(dest);
    dec(source);
  end;
  p:=mpos(pos);
  system.move(text[1],p^,s);
end;
Das Einfügen einer Section habe ich selber noch nicht gemacht. Aber abgesehen davon, dass du einen kompletten Sectionheader erstellen musst, musst du natürlich auch wieder sizeofImage etc. anpassen (und natürlich numberofSections)


4. Was du wahrscheinlich noch beachten musst, ist das umrechnen von virtuellen Adressen in DateiOffset und umgekehrt. Die eine Richtung sieht bei mir so aus:
Delphi-Quellcode:
function TPereader.RVA2Offset(Adr:cardinal):cardinal;
var i:integer;
//sectionheader ist ein array of TImageSectionHeader
//numberofSections kommt aus dem fileHeader
begin
   i:=numberofsections-1;
   result:=0;
   while i>=0 do begin
     if (adr>=sectionsheader[i].VirtualAddress)and
        (adr<sectionsheader[i].VirtualAddress+sectionsheader[i].SizeOfRawData) then begin
       result:=adr-sectionsheader[i].VirtualAddress;
       inc(result,sectionsheader[i].PointerToRawData);
     end;
     dec(i);
   end;
end;
Wie gesagt, dass ist nur ein kleiner Teil, der vielleicht den Einstieg erleichtert. Es ist aber u.a. recht hilfreich, wenn man ohne Probleme mit Hilfe eines Hex-Editors o.ä. den Aufbau einer EXE lesen kann. Hier muss man sehr vorsichtig sein und braucht viel Geduld und Übung (wenn man es zum ersten Mal macht; aber das ist ja beim programmieren generell so ).

PS: Keine Gewähr für die Codebeispiele (ich hatte mir damals die records z.B. selber definiert, weil ich nicht wusste, dass sie in der Unit windows existieren; deswegen können Unstimmigkeiten auftreten)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

Re: PE DATA und CODE Section dumpen / modifizieren / hinzufü

  Alt 24. Jun 2007, 12:28
Vielen Dank! Den Beitrag auf buha.info hab ich auch schon gefunden, aber die Unit ist sehr überladen. Da sind hier die Beispielcodes wirklich sehr hilfreich!
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 09:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz