AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Portable Executable File Unit
Thema durchsuchen
Ansicht
Themen-Optionen

Portable Executable File Unit

Ein Thema von ErazerZ · begonnen am 30. Jun 2007 · letzter Beitrag vom 16. Aug 2010
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von ErazerZ
ErazerZ
Registriert seit: 27. Mai 2005
Hallo,
ich habe mich des öfteren mit Microsofts PE-Format beschäftigt und deswegen dachte ich mir das ich mal eine Unit mache die die Arbeit mit dem PE-Format erleichtern sollte . Die Unit wird von mir täglich mit neuen Funktionen erweitert!
Unit Version: 1.3
Funktionen:
  • Allgemeines
  • LoadFromFile - Laden einer Datei.
  • SaveToFile - Speichern einer Datei.
  • ValidHeaders - Überprüft ob die DOS + NTHEADERS in ordnung sind.
  • ReadPeHeaders - Ließt alle Sektionen und Header ein.
  • Align - Align .
  • SectionToString - Gibt den Namen einer Sektion in String zurück.
  • StringToSection - Setzt einen neuen Namen einer Sektion.
  • SetAddressOfEntryPoint - Setzt einen Neuen EntryPoint.
  • SetImageBase - Setzt eine neue ImageBase.
  • CopyMemoryToBuffer - Damit kann man den Speicher der geladenen Datei ändern.
  • CopyMemoryFromBuffer - Damit kann man aus dem Speicher der geladenen Datei lesen.

    Umrechnungen
  • RvaToFileOffset - Berechnet die Relative Virtuelle Adresse in die Physikalische Adresse um.
  • FileOffsetToRva - Berechnet die Physikalische in die Relative Virtuelle Adresse um.
  • VaToFileOffset - Berechnet die Virtuelle Adresse in unserem Speicher in die Physikalische Adresse um.
  • FileOffsetToVa - Berechnet die Physikalische Adresse in die Virtuelle Adresse in unserem Speicher um.
  • VaToRva - Berechnet die Virtuelle Adresse in unserem Speicher in die Relative Virtuelle Adresse.
  • RvaToVa - Berechnet die Relative Virtuelle Adresse in der Virtuellen Adresse in unserem Speicher.
  • RvaToSection - Liefert anhand der Relativen Virtuellen Adresse die Nummer der Sektion in der sie sich befindet.
  • FileOffsetToSection - Liefer anhand der Physikalischen Adresse die Nummer der Sektion in der sie sich befindet.

    Hinzufügen/Entfernen
  • InsertBytes - Fügt x Bytes im Speicher der Datei.
  • DeleteBytes - Löscht x Bytes im Speicher der Datei.
  • FindCodeCaves - Sucht nach sogenannten "Code-Höhlen" (0-Bytes) im Speicher der Datei.

    Sektionen
  • AddSection - Fügt eine neue Sektion hinzu. Hier wird jedoch geprüft ob noch Platz für eine neue Sektion vorhanden ist, falls nein wird neuer angelegt.
  • DeleteSection - Löscht eine bestimmte Sektion aus der PE Datei.
  • GetCharacteristics - Liefert die Characteristics in String einer Sektion.
  • GetCodeSection - Liefert die Nummer der Sektion in der sich die Code-Sektion befindet.
  • GetDataSection - Liefert die Nummer der Sektion in der sich die Data-Sektion befindet.
  • GetResourceSection - Liefer die Nummer der Sektion in der sich die Ressourcen-Sektion befindet.
  • GetImportAddressTable - Liefert alle Importe einer Datei (Zurzeit Normale IAT, Delayed IAT, Bound IAT).
  • GetExportsAddressTable - Liefert die Exports einer Datei.
  • GetThreadLocalStorage - Liefert Informationen zu TLS.
  • GetResources - Liefert alle Ressourcen der Datei (Ressourcen-Typen, Resourcen-Namen).
  • GetDebugDirectory - Liefert Informationen zu der Debug Directory.
  • GetLoadConfigDirectory - Liefert Informationen zu der Load Config Directory.
  • GetEntryExceptionDirectory - Liefert Informationen zu Entry Exception Directory.
  • DumpSection - Damit kann man eine Sektion auf der Festplatte speichern.
  • GetHighestSectionSize - Liefert die "größte"/letzte Sektion (also PointerToRawData + SizeOfRawData).
  • GetDataFromEOF - Damit kann man die Daten die sich nach Ende aller Sektionen befinden auslesen und zwischenspeichern.
  • RecalcImageSize - Damit lässt sich die SizeOfImage neu berechnen.
  • ResizeSection - Damit kann man einzelne Sektionen vergrößern! Achtung: Ressourcen (OffsetToData) werden angepasst!
  • CalcChecksum - Damit wird die Check-Summe der PE Datei berechnet.
  • RecalcCheckSum - Berechnet automatisch die Check-Summe und ändert diese gleich in den Headern.
  • WriteImageSectionHeader - Schreibt alle ImageSections in dem Speicher!

    Neu Dabei
  • AddSection - RawSize hinzugefügt, VirtualSize entfernt - wird automatisch von RecalcImageSize berechnet,
    lpData und dwDataLength hinzugefügt (das heißt, dass man die neue Sektion gleich mit Daten füllen kann).
  • DeleteSection - ImageSize wird über RecalcImageSize berechnet, ruft RecalcCheckSum am Ende der funktion auf!
  • ResizeSection - Damit kann man einzelne Sektionen vergrößern! Achtung: Ressourcen (OffsetToData) werden angepasst!
  • GetResources - Überarbeitet (RVA wurde falsch berechnet!), neue Struktur (enthält größe des Entries)
  • Resources Beispiel - Angepasst an die neue Struktur und Dump funktion hinzugefügt!
  • CalcChecksum - Damit wird die Check-Summe der PE Datei berechnet.
  • RecalcCheckSum - Berechnet automatisch die Check-Summe und ändert diese gleich in den Headern.
  • WriteImageSectionHeader - Schreibt alle ImageSections in dem Speicher!

    Beispiele
  • IAT - Ein Beispiel Programm um die Imports einer Anwendung auszulesen und auszugeben.
  • EAT - Ein Beispiel Programm um die Exports einer DLL-Datei auszulesen und auszugeben.
  • Resources - Ein Beispiel Programm um die Ressourcen einer Anwendung auszulesen und auszugeben. Man kann auch die ausgewählte Ressource dumpen!
  • Sections - Ein Beispiel Programm um die Sektionen einer Anwendung auszulesen und auszugeben.
  • ExeLoader - Ein ganz kleiner Exe-Loader der die Code-Sektion mittels XOR verschlüsselt. Er fügt einen neuen Loader in einer neuen Sektion hinzu,der zur Laufzeit die Code-Sektion entschlüsselt und zum Original Entry Point springt.


Beispiel-Aufruf:
Delphi-Quellcode:
uses untPeFile;
...
procedure TForm1.FormCreate(Sender: TObject);
var
  PE: TPeFile;
  x: Word;
  Imports: TImportsArray;
const
  sSection = 'Name: %s' + #13#10 +
            'Sektion: %d/%d' + #13#10 +
            'Start der Sektion: %d' + #13#10 +
            'Größe der Sektion: %d';
  sImports = 'Bound Import Lib: %s';

begin
  PE := TPeFile.Create;
  // Datei Laden ..
  if PE.LoadFromFile('C:\WINDOWS\Notepad.exe') then
  begin
    // Alle Sektionen ausgeben
    for x := Low(PE.ImageSections) to High(PE.ImageSections) do
      ShowMessage(Format(sSection, [PE.SectionToString(PE.ImageSections[x]), x, PE.NumberOfSections -1, PE.ImageSections[x].PointerToRawData, PE.ImageSections[x].SizeOfRawData]));
    // Imports Auslesen
    PE.GetImportAddressTable(Imports);
    // Nur die Bound IAT ausgeben
    for x := Low(Imports) to High(Imports) do
      if Imports[x].ImportType = itBound then
        ShowMessage(Format(sImports, [Imports[x].LibraryName]));
    // Neue Sektion anlegen
    PE.AddSection('NewSec', $200);
    // Die angelegte Sektion wieder entfernen
    PE.DeleteSection(PE.NumberOfSections -1);
    // Speichern ...
    PE.SaveToFile('C:\NOTEPAD_TMP.exe');
  end;
  // Freigeben...
  PE.Free;
end;
Falls ihr Verbesserungsvorschläge habt, dann nur her damit!
Angehängte Dateien
Dateityp: zip portable_executable_file_unit_783.zip (23,5 KB, 423x aufgerufen)
 
Benutzerbild von lbccaleb
lbccaleb

 
Delphi 7 Enterprise
 
#2
  Alt 30. Jun 2007, 20:15
ich werde sie mal testen thx dafür, wie siehts denn aus mit dem copyright???

nur credits bei verwendung!!?? und wie siehts aus mit dem bearbeiten???
Martin
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#3
  Alt 30. Jun 2007, 20:25
Zitat von lbccaleb:
ich werde sie mal testen thx dafür, wie siehts denn aus mit dem copyright???

nur credits bei verwendung!!?? und wie siehts aus mit dem bearbeiten???
Naja wenn du willst kannst du mir auch ruhig Geld dafür geben . Ist ja "nur" Code und ich bin damit zufrieden wenn mein Name in den Credits steht .
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#4
  Alt 13. Jul 2007, 22:52
Habe gerade eben eine neue Version (mit Beispielen) raufgeladen.

Zitat von ErazerZ:
  • Neu Dabei
  • DumpSection - Damit kann man eine Sektion auf der Festplatte speichern.
  • CopyMemoryBuffer - Damit kann man die geladene Datei im Speicher bearbeiten.
  • IAT-Auslesen verbessert.

    Beispiele
  • IAT - Ein Beispiel Programm um die Imports einer Anwendung auszulesen und auszugeben.
  • EAT - Ein Beispiel Programm um die Exports einer DLL-Datei auszulesen und auszugeben.
  • Resources - Ein Beispiel Programm um die Resourcen einer Anwendung auszulesen und auszugeben.
  • Sections - Ein Beispiel Programm um die Sektionen einer Anwendung auszulesen und auszugeben.
  • ExeLoader - Ein ganz kleiner Exe-Loader der die Code-Sektion mittels XOR verschlüsselt. Er fügt einen neuen Loader in einer neuen Sektion hinzu, der zur Laufzeit die Code-Sektion entschlüsselt und zum Original Entry Point springt.
  Mit Zitat antworten Zitat
quantum

 
Delphi XE Professional
 
#5
  Alt 14. Jul 2007, 00:05
Gute Arbeit
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#6
  Alt 14. Jul 2007, 01:46
Du machst dir da ja ein menge Arbeit. Ich habe dafür bis jetzt immer die JclPeImage Unit benutzt.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

 
Delphi 12 Athens
 
#7
  Alt 14. Jul 2007, 09:08
Moin, moin

Ja, das mit den zugehörigen Beispielen hat was! Programme zum verschlüsseln von Programmteilen kosten oft deutlich Geld. Hier sieht man auch noch wie vieles funktioniert. Das Projekt lässt jedenfalls auf deutlich Geduld und Ausdauer schliessen.

Viele Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Relicted

 
Delphi 10.4 Sydney
 
#8
  Alt 14. Jul 2007, 10:33
huhu!

mal eine ganz beschränkte frage:

was tut es und wofür braucht man es?


gruß
reli
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#9
  Alt 14. Jul 2007, 10:38
Zitat von Relicted:
huhu!

mal eine ganz beschränkte frage:

was tut es und wofür braucht man es?


gruß
reli
Ließ nochmal den Ersten Beitrag. Damit kann Portable Executable Dateien (Anwendungen sozusagen) bearbeiten.
  Mit Zitat antworten Zitat
Relicted

 
Delphi 10.4 Sydney
 
#10
  Alt 14. Jul 2007, 10:40
jo da hatte ich gerade kurz mal drüber gelesen
mir war nur der sinn nicht 100%ig klar
d.h. man könnte in einer bestehenden datei z.b. noch eine andere "datei" unterbringen durch eine neue section und diese dann später wieder auslesen?

gruß
reli
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 10:56 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