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 3 von 3     123   
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)
 
brechi
 
#21
  Alt 16. Jul 2007, 10:54
Hi Olli, ich weiß dass wie die AV Programme in der Regel aufgebaut sind. Als Cheatprogrammierer kenn ich zumindest die Hooktechniken und teste so auch mal die ein oder anderen AV Programme. Ich hab mir aber schon länger nicht mehr KAV usw. getestet, daher kann ich nur aus Erfahrungen sprechen.
Bei Antivir war es z.b. so, dass ich ein mit UPX gepacktes Programm hatte, was nach dem entpacken und wieder packen mit UPX und einem anderen Komprimierungslevel schon die Exe nicht mehr erkannt hat. Da war wohl einfach eine Signatur für die Exe eingebaut, entpackt wurde sie wohl nicht. (Obwohl Antivir dafür ja eine entpackroutine hat). Hat mich nur geweundert warum sie da eine einfache Signatur gemacht haben und nicht auf die entpackte Exe. Naja gut, wird sich wohl mitlerweile geändert haben.
Dann das Beispiel Morphine. Wird ja größtenteils für Viren use bwneutzt und da bin ich mir doch eben sicher, dass zumindest zu meiner Zeit wo ichs mir angeschaut habe, generell alle mit Morphine gepackten Dateien als Virus eingestuft wurden. Ist mir auch relativ verständlich. Immerhin ist es OpenSource und man kann da immer kleine Änderungen machen und die gleiche gepackte Datei sieht auch immer anders aus. Macht mein Crpyter ja genauso, und denke nicht, dass die AV Programmierer für irgend welche kleinen Crypter jedesmal einen ALgorithmus entwicklen wollen der das Teil entpackt.
Und dann kommen wir noch zu Execryptor ( http://www.strongbit.com/execryptor_inside.asp ) ein kommerzielles Programm zum crypten. Die selbe Exe sieht auch immer anders aus, und entpacken kann man es nicht. Würd mich aml interessieren wie du dagegen vorgehen würdest. Bleibt ja dann auch nur für jeden Virus eine Signatur zu erstellen. Nur der Virenschreiben muss jedesmal die Exe neu durch den Crypter jagen und jedesmal wird sie nicht mehr erkannt.
Ein interessantter (wenn auch meienr Meinung nach unschön gelöster) Ansatz hjat ja asquared. Also API hooking um dann zu schaun ob man einen Virus hat. Dies könnten die AV Hersteller eigentlich super für jeglichen gecrypteten Code anwenden. Nur als Beispiel wieder Morphine, wo einige AV Hersteller ja wohl lange Zeit Probleme hatten den Programmcode zu entcrpyten. Ein Hook auf VirtualProtect (bzw. VirtualProtectNt) und man kann die Adresse vom entschlüsselten Code direkt vom Stack ablesen. Und dann darauf eben eine Signatur anlegen. Weiß nicht inwiefern die AV Hersteller das Scannen von ausgeführten Dateien überwachen. Damit kann man schon Viren die gecrypted sind erkennen ohne großartig für jede Version des Crypters den Entschlüsselunsgcode anzupassen. die ganzen Morphine Viren können so während der Laufzeit gecheckt werden, und der VirtualProtect Hook funktioniert für alle Morhpine Versionen.
http://uall.cheat-project.com/files/...ine_source.zip
  Mit Zitat antworten Zitat
Olli
 
#22
  Alt 16. Jul 2007, 15:50
Zitat von brechi:
Dann das Beispiel Morphine. Wird ja größtenteils für Viren use bwneutzt und da bin ich mir doch eben sicher, dass zumindest zu meiner Zeit wo ichs mir angeschaut habe, generell alle mit Morphine gepackten Dateien als Virus eingestuft wurden.
Denkbar, aber mit welchen der insgesamt 2 dutzend AV-Engines die es so gibt?

Zitat von brechi:
Ist mir auch relativ verständlich. Immerhin ist es OpenSource und man kann da immer kleine Änderungen machen und die gleiche gepackte Datei sieht auch immer anders aus. Macht mein Crpyter ja genauso, und denke nicht, dass die AV Programmierer für irgend welche kleinen Crypter jedesmal einen ALgorithmus entwicklen wollen der das Teil entpackt.
Wollen nicht, oft ist es aber notwendig und oftmals sind zumindest die Packalgos wiederverwendbar.

Zitat von brechi:
Und dann kommen wir noch zu Execryptor ( http://www.strongbit.com/execryptor_inside.asp ) ein kommerzielles Programm zum crypten. Die selbe Exe sieht auch immer anders aus, und entpacken kann man es nicht. Würd mich aml interessieren wie du dagegen vorgehen würdest. Bleibt ja dann auch nur für jeden Virus eine Signatur zu erstellen. Nur der Virenschreiben muss jedesmal die Exe neu durch den Crypter jagen und jedesmal wird sie nicht mehr erkannt.
Hmm, also ich wuerde sagen, dass dieses Produkt nur von paranoiden Idioten eingesetzt wird, die ihren Anwendern langsame Programme anbieten wollen, und eben von Malware-Autoren welche die "frei erhaeltliche" Version benutzen. So gesehen waere das einer der Packer, wo ich sogar fuer eine generelle Erkennung und Einstufung als potentielle Malware waere. Gibt da noch weniger als ein halbes dutzend anderer Kandidaten, fuer die aehnliches zutrifft. Bei Themida waeren es eben die Spielehersteller und die Malware-Autoren.

Zitat von brechi:
Ein interessantter (wenn auch meienr Meinung nach unschön gelöster) Ansatz hjat ja asquared. Also API hooking um dann zu schaun ob man einen Virus hat. Dies könnten die AV Hersteller eigentlich super für jeglichen gecrypteten Code anwenden. Nur als Beispiel wieder Morphine, wo einige AV Hersteller ja wohl lange Zeit Probleme hatten den Programmcode zu entcrpyten. Ein Hook auf VirtualProtect (bzw. VirtualProtectNt) und man kann die Adresse vom entschlüsselten Code direkt vom Stack ablesen. Und dann darauf eben eine Signatur anlegen.
Eines der ersten Gebote in der AV-Branche: Niemals boesartigen Code ausfuehren, den man erkennen kann. Du weisst so gut wie ich, dass man solchen Hooks ueblicherweise einfach entgehen kann. Die Emulatoren haben im Zusammenhang mit Signaturen aber aehnliche Dinge eingebaut. Ist also nicht so, dass hier die Signaturen von gepackten Dateien hinzugefuegt werden muessen, wenn man denn einen Entpacker hat oder der Emulator die Datei entpacken kann.

Zitat von brechi:
Weiß nicht inwiefern die AV Hersteller das Scannen von ausgeführten Dateien überwachen.
Meinst du nach dem Laden?

Zitat von brechi:
Damit kann man schon Viren die gecrypted sind erkennen ohne großartig für jede Version des Crypters den Entschlüsselunsgcode anzupassen.
Packer erkennen heisst aber noch nicht entpacken. Und bei unserem Emulator ist es so, dass der die EXE auch aufm PPC-Mac oder irgendwelcher anderen exotischen Hardware "ausfuehrt" (also emuliert). Hooks sind zumindest fuer die Kern-Engine bei uns einfach zu systemspezifisch.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#23
  Alt 16. Jul 2007, 15:54
Ich hatte nachgefragt, weil ich morphine kenne und weiß, dass das von Antivren-Programmen erkannt6 wird. Aber was nützt es mir, wenn mein Virenscanner nicht anschlägt, aber dann der von Kunden? Und dann hängt das ja noch von der Definitionsdatei ab.

Der beste Schutz ist immer noch eine bedingte Kompilierung und entsprechend Funktionen nicht einkompilieren bei Shareware Versionen. Denn was im Kompilat nicht drin ist, kann nicht gecrackt werden.
Michael
  Mit Zitat antworten Zitat
Olli
 
#24
  Alt 16. Jul 2007, 16:03
Zitat von Luckie:
Der beste Schutz ist immer noch eine bedingte Kompilierung und entsprechend Funktionen nicht einkompilieren bei Shareware Versionen. Denn was im Kompilat nicht drin ist, kann nicht gecrackt werden.
Bingo!
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#25
  Alt 17. Jul 2007, 18:35
Zitat:
  • 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!
ResizeSection hat Probleme gemacht aber geht schon
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#26
  Alt 6. Mai 2008, 14:58
Zitat von ErazerZ:
Du kannst damit zum Beispiel, einen neuen Code in die Anwendung "einschleusen" und diesen beim Start ausführen lassen.
Gibt es dazu auch ein Beispiel?

Um neuen Code einzuschleusen, reicht es da in die neue Sektion eine kompilierte Exe zu kopieren und dann den Einsprungspunkt umzubiegen?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

 
Delphi 2007 Enterprise
 
#27
  Alt 6. Mai 2008, 18:42
ExeLoader.dpr ist ein Beispiel dazu. Das ist ein einfacher Execrypter der nichts anderes macht wie einen Code in einer anderen Exe-Datei einzuschleusen und dann beim ausführen ausgeführt wird und er zurück zum originellen Einsprungpunkt zurückspringt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#28
  Alt 6. Mai 2008, 18:47
Gut, dann muss ich mir das noch mal genauer angucken.
Michael
  Mit Zitat antworten Zitat
darknes
 
#29
  Alt 16. Aug 2010, 14:42
Mir ist klar das dieses thema schon sehr alt ist aber schon zu 2003 konnte man Execrypter entpacken(mupen).
Allso @ brechi ist das hier "Und dann kommen wir noch zu Execryptor ( http://www.strongbit.com/execryptor_inside.asp ) ein kommerzielles Programm zum crypten. Die selbe Exe sieht auch immer anders aus, und entpacken kann man es nicht"
Reiner müll vonwegen nicht entpacken das ich nicht lache.
Du hast dich zwar sehr viel mit av´s befasst,aber wenn du dich nur ein monat oder zwei mit dem manuel unpacking befasst denkst du dir das die routine eines av´s programmes ein witz gegen über von manuel unpacking ist.
@ErazerZ könntest du ein bsp:coden wo bestimmte sectionen gelöscht werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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:28 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