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 2 von 3     12 3      
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 ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#11
  Alt 14. Jul 2007, 11:16
Zitat von Relicted:
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
Du kannst damit zum Beispiel, einen neuen Code in die Anwendung "einschleusen" und diesen beim Start ausführen lassen. Oder zum Beispiel die Importe der Anwendung auslesen, also die WinAPI die vom Programm benutzt wird.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

 
Delphi 7 Enterprise
 
#12
  Alt 14. Jul 2007, 11:41
Zitat von Relicted:
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
Du kannst zum Beispiel deine Kunden ärgern, indem du sowas nettes wie hier in Beitrag #19 (Anhang: orignal.exe und encrypted.exe machst. Dabei wird bei encrypted.exe der Code in der Exe erst entschlüsselt, wenn man das richtige Passwort eingegeben hat (da zum entschlüsseln das Passwort notwendig ist).
  Mit Zitat antworten Zitat
Relicted

 
Delphi 10.4 Sydney
 
#13
  Alt 14. Jul 2007, 12:38
coole sache... aber ich glaube sowas mögen kunden generell nicht :-p
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#14
  Alt 14. Jul 2007, 12:41
Was sagen eingentlich Virenscanner dazu, wenn man die Exe-Datei modifiziert oder verschlüsselt?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#15
  Alt 14. Jul 2007, 12:50
Und ich hab schon wieder eine Neue Version hochgeladen.
Zitat:
  • Neu Dabei
  • CopyMemoryBuffer - Damit kann man die geladene Datei im Speicher bearbeiten.
  • RecalcImageSize - Damit lässt sich die SizeOfImage neu berechnen.
  • CopyMemoryBuffer = CopyMemoryToBuffer - Damit kann man den Speicher der geladenen Datei ändern.
  • CopyMemoryFromBuffer - Damit kann man aus dem Speicher der geladenen Datei lesen.
  • 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.
  • AddSection - Jetzt wird geprüft ob sich Daten nach dem Ende aller Sektionen befinden, falls ja werden diese gespeichert und wieder angehängt.
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#16
  Alt 14. Jul 2007, 12:52
Zitat von Luckie:
Was sagen eingentlich Virenscanner dazu, wenn man die Exe-Datei modifiziert oder verschlüsselt?
Wenn es keine Trojaner sind dann wird er auch nichts sagen . Und das war doch nur ein kleines Beispiel für die Unit.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

 
Delphi 7 Enterprise
 
#17
  Alt 14. Jul 2007, 12:57
Zitat von Relicted:
coole sache... aber ich glaube sowas mögen kunden generell nicht :-p
Das glaube ich auch.

Zitat von Luckie:
Was sagen eingentlich Virenscanner dazu, wenn man die Exe-Datei modifiziert oder verschlüsselt?
Meiner sagt nix Lad dir doch mal die Beispieldatei von mir runter!
  Mit Zitat antworten Zitat
brechi
 
#18
  Alt 14. Jul 2007, 13:01
Die sagen nichts, du kannst jeden Virus crypten und der wird nicht mehr erkannt. Jedenfalls so lange bis der crypter auf die Blacklist kommt. (vereinzelt zeigen die halt an, dass die Datei möglicherweise ein Virus ist)
  Mit Zitat antworten Zitat
Olli
 
#19
  Alt 14. Jul 2007, 13:33
Zitat von Luckie:
Was sagen eingentlich Virenscanner dazu, wenn man die Exe-Datei modifiziert oder verschlüsselt?
Hängt davon ab.

Zitat von brechi:
Die sagen nichts, du kannst jeden Virus crypten und der wird nicht mehr erkannt. Jedenfalls so lange bis der crypter auf die Blacklist kommt. (vereinzelt zeigen die halt an, dass die Datei möglicherweise ein Virus ist)
Also erstens verstand ich Luckies Frage eher in der Richtung, daß man es auf einem System mit Virenscanner macht, wo es dann eben nur bei aktivem Behavioral Blocking aufgehalten würde.

Allerdings muß ich dir etwas widersprechen. Das Thema wurde zwar auf dem Antivirus-Tester-Workshop hier in Reykjavík im Mai auch angesprochen, aber allgemein ist es eben nicht so, daß Packer/Crypter geblacklisted werden. Bei einigen AV-Firmen gibt es allerdings diese Tendenz, was auch rege am zweiten Tag in der Podiumsdiskussion diskutiert wurde. Auch war man sich weitgehend darüber einig, daß bei einem Packer/Crypter der quasi nur von Malware benutzt wird, ein Blacklisting bis zur Analyse und Implementierung im Emulator der AV-Engine gerechtfertigt werden kann. Übrigens hatte diese Diskussion ein Kollege von Kaspersky Niederlande angeregt, weil er sowas in seinem Vortrag am Rande erwähnt hatte - das (zumindest temporäre Blacklisting) sei übliche Praxis bei Kaspersky.

Ist der Packer erstmal effektiv in der Engine implementiert, braucht der Emulator sich bekanntlich nicht mehr durch den Entpackcode durchwühlen und damit werden solche Viren dann doch erkannt. Du (brechi) solltest doch eigentlich wissen, wie AVs implementiert sind, zumindest oberflächlich.

Abgesehen davon reden wir hier vermutlich noch nichtmal von Viren im traditionellen Sinn, weil die bekanntlich nur noch den kleinsten Teil ausmachen. Auch Skiptkiddies sind schließlich nur Benutzer vorgefertigter Lösungen
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#20
  Alt 14. Jul 2007, 13:51
Zitat von brechi:
Die sagen nichts, du kannst jeden Virus crypten und der wird nicht mehr erkannt. Jedenfalls so lange bis der crypter auf die Blacklist kommt. (vereinzelt zeigen die halt an, dass die Datei möglicherweise ein Virus ist)
Ja genau oder man benutzt kleine Exploits um den Emulator (Heuristics, Sandbox) des AV-Systems dazu zu zwingen das scannen abzubrechen. Aber Back to Topic.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 12:39 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