AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie herausfinden ob eine Ausführbare gepackt ist?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie herausfinden ob eine Ausführbare gepackt ist?

Ein Thema von Metal_Snake2 · begonnen am 17. Jun 2006 · letzter Beitrag vom 2. Jul 2006
Antwort Antwort
Seite 3 von 3     123   
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#21

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 21. Jun 2006, 17:18
Zitat von Lillebrohr:
Bei Delphi liegt der EP oft auch in der DATA-Section also wars das mit CODE-Section.
Das bezweifel ich. Zeigst mir nen Sourcode der beim kompilieren den EP in die Datasection legt?
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#22

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 21. Jun 2006, 17:19
Zitat von Lillebrohr:
Bei Delphi liegt der EP oft auch in der DATA-Section also wars das mit CODE-Section.
Wenn du auf die Namen der Sektionen anspielst, die haben keine, aber absolut keine, Bedeutung für den PE-Loader!!!

Sie sagen also nicht, wie häufig fälschlich angenommen, etwas über den Inhalt aus. Die Attribute einer Sektion geben mehr Aufschluß als der Name, da kann man sich nämlich gewaltig irren. Übrigens: Sektionsnamen können jegliche 8bit-Zeichen enthalten, nicht nur anzeigbare.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#23

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 21. Jun 2006, 18:13
Ich denk mal er meint

TImageNtHeaders.OptionalHeader.BaseOfData sowie
TImageNtHeaders.OptionalHeader.BaseOfCode

Diese setzt Delphi aber (von D2-D7) immer auf die DATA sowie CODE section (da mein ich jetzt den Namen) und die DATA section hat nicht das Executableflag gesetzt. Somit kann der Entrypoint nicht in BaseOfData/Datasection zeigen. Und eben für diese Behauptung hätte ich gerne nen Source + Delphi Version, wo das möglich sein soll.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#24

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 21. Jun 2006, 18:44
Hi,

Vielleicht kann man sich ja anschauen, wie PEID arbeitet: http://peid.has.it/ ...

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#25

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 21. Jun 2006, 19:38
Hab ich doch schon geschriebn, des schaut sich die Daten am EP an.
  Mit Zitat antworten Zitat
Metal_Snake2

Registriert seit: 19. Nov 2004
134 Beiträge
 
Delphi 7 Personal
 
#26

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 21. Jun 2006, 19:41
Peid selbst arbeit mit mehreren ansätzen um herauszufinden ob eine ausführbare gepackt ist.


Man kann nun folgende ansetze geschickt kombinieren um eine gute Chance zu haben ob eine exe gepackt ist.

1. Entropie. Diese methode scheint wohl die best geeignetste zu sein. Leider habe ich keine ahnung wie ich das jetzt in Delphi umsetzen könnte. Ich hab das internet durchsucht und folgendes gefunden(Leider kein Code).

Link
Benötigte Entopie- Formel

Wie kann man jetzt z.B. ca 10000 bytes einer PE mit hilfe der Entropie untersuchen?



2. Man untersucht den EP Eintrit. Ist er in der ersten Sektion(Code-Sektion)?
3. Geängige Sektionsnamen wie Code,Data usw. upx z.B. erstellt 2 Sektionen namens upx0 und upx1.
4. Ist die RawData Größe = 0 einer Sektion?
5. Naja ansonsten nach bestimmten strings durchsuchen.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#27

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 22. Jun 2006, 01:20
Metal_Snake2 fragte mich per PN:

Zitat:
hi,

falls ich störe einfach ignorieren.

Meine Frage: Hast du villeicht eine idee wie ich die Entropie einer Datei(exe datei) berechnen kann.
Mein ziel ist es damit herauszufinden ob eien exe gepackt/komprimiert wurde.
Da ja die zeichen in einer Komprimierten datei wesentlich Chaotischer(mehr nach dem zufall) geordnet sind
als bei einer unkomprimierten(eher mit mehr ordnung) kann man da ja eigentlich die Entropie anwenden.

Wie müßte ich deinen Code aus der libary umändern??


danke für eine antwort.
Ich stelle mal hier meine Antwort rein, hoffe Metal_Sbake2 hat nichts dagegen.

Hi

Fragende stören nie

Also erstmal: welcher Code aus welcher Library ?

Ich habe den Thread der DP mit Spannung mitgelesen.

Technisch gesehen gibt es nur eine Möglichkeit mit 100% Sicherheit eine ausführbare Datei zu klassifizieren. Dazu benötigt man eine SandBox und einen teil-softwarebasierten Emulator. Das ist eine Machine die quasi jeden Befehl der gestarteten EXE emuliert und somit die absolute Kontrolle darüber hat was der Code der EXE macht. Dies funktioniert deshalb weil ja das Ziel der EXE es ist ausgeführt zu werden. Dagegen gibt es auf Hackerseite keinen "Schutz" Der Emulator kann nun erkennen wie die EXE geladen wird und die notwenigen Codesegment Manipulationen, eg. das Entpacken/Entschlüsseln in das Codesegment im Speicher, erkennen.

Leider ist dies sehr aufwendig

Bleiben noch zwei Wege übrig:

1.) Klassifikation über selektierte Merkmale. Man versucht also das was zb. Himitsu im Thread vorschlug, nämlich die Eigenheiten aller bekannten Packer/Crypter zu ermitteln und quasi wie bei einem Virenscanner auf bekannte Signaturen in einer Datenbank zurückzugreifen. Das funktioniert im Falle von Viren sehr gut, benötigt aber eine ständig auf aktuellem Stand gehaltene Datenbank.

2.) der mathematische Weg wie Olli ihn vorschlug. Entropie bzw. mal größer gefasst Mustererkennung ist das Stichwort. Es gibt dabei mehrere Möglichkeiten:

a.) packe die EXE mit einem ZIPer. Eine gepackte EXE lässt sich logischerweise weit weniger packen als eine ungepackte EXE. Durch ein Preprozessing, sprich Zerlegung des EXE Images in seine Sektionen und Resourcen, kannst du jeden relevanten Teil einer EXE separat packen. Als Indiz ergibt sich das Bild das das CODE und RESOURCE Segment meistens gepackt wurden und die Relocationtable entfernt wurde.

b.) neben dem Zippen die einfache Entropie ermitteln. Man geht dabei davon aus das eine EXE auf Grund der Opcodes/Jump etc. eine Struktur aufweist die sich deutlich von anderen Daten unterscheidet. Tja, leider muß dies nicht so sein. Zb. die Entropie (Verteilung/Anzahl von Symbolen) von Text ist deutlich unterschiedlich von ausführbarem Code. Aber in jeder heutigen EXE werden Stringkonstanten, ja ganze Texte ebenfalls im Codesegment gespeichert. Oder die Entropie von gepacktem zu verschlüsseltem Code im Vergleich: beide haben die gleiche Entropie, diejenige die Zufall entspricht. Und beide sollte nicht weiter komprimierbar sein.

c.) höhere Mathematik und reale Mustererkennungen. Auf diesem Gebiet habe ich selber längere Zeit ge-hobby-forscht Ich kann hier aber nur über das reden was ich selber als Idee verfolgt hatte.
Als erstes wird die Datei in ein 2D Frequenzspektrum umgewandelt, quasi einer zeitlicher Spektralanalyse unterzogen und die Bytedaten der Datei dient als sequentieller Datenstrom als Input.

Warum macht man diesen Schritt ?
1.) Quantisierung der Datenmenge. Jede Datei ist unterschiedlich groß, hat unterschieldiche Anordnungen der Segmente und Dateninhalte. Man muß nun einen Weg finden der diese unterschiedlichen Datenmenge auf eine Zischendatenmenge reduziert die immer gleiche Größe und Struktur besitzt. D.h. aus einem komplexen Fingerabdruck wird mithilfe eines komplexen Verfahrens nur wenige wichtige Vergleichspunkte errechnet die dann für alle Fingerabdrücke immer die gleiche Größe/Anzahl an Punkten und Strukur besitzt. Durch die Quantisierung werden also unterschiedliche Dateien in einen immer gleichgroßen "Fingerabdruck" umgewandelt.
2.) Spektralanalyse. Dabei geht es darum quasi die Art und Weise des Vorkommenes aller 256 möglichen Symbole in der Datei zu ermitteln. Man ermittelt also wie oft und wie periodisch (Amplitude und Frequenz) die einzelnen Symbole auftauchen. Bei Texten wird man feststellen das ganze Symbole fast niemals auftreten, bei EXEs wird man feststellen das 0 sehr oft vorkommt.
3.) 2D Spektralanalyse. Man macht nun sequientiell für zb. von Daten-scheiben a 256b-16Kb an Daten nacheinander eine Spektralanalyse. Das hast du schon öfters in Filmen gesehen, bei Sprachanalysen von Agentenfilmchens. Meistens ist das ein sich von Links nach Rechts bewegendes farbiges Band das von rot nach gelb über grün nach blau geht. Darin kann man zb. die Basstakte einer Musik erkennen.
In unserem Falle ist das von Vorteil da wir davon ausgehen können das eine EXE einen sequientiellen Aufbau haben wird der ja nach Segment unterschiedliche Dateninhalte speichert und somit auch unterschiedliche Spektren erzeugen wird. Eine 2D Spektralanalyse mancht nun auch eine Spektralanalyse über den kompletten Zeitraum.

Was heist das immer "Spektralanalyse" ?
Wichtiger ist das WIE, und das ist ganz einfach machbar über Fourier Transformationen, genauer gesagt die FFTs Fast Fourier Transformationen. Wenn wir uns eine Musik anhöheren dann wird eine FFT diese komplexe Schallwelle der Musik in all ihre Sinusfrequenzen die dieses komplexe Schallmuster ergeben, zerlegen. Je nach Stärke = Amplitude der einzelnen Frequenzen wird die FFT in ihrem Resultat einen stärkeren "Ausschlag" erzeugen. Die FFT liefert uns also ein Bild darüber wie sich eine komplexe Schallwelle aus den verschiedenen Frequenzen zusammensetzt und zeigt auch noch deren Stärke an. Nun, simple Bytes aus einer EXE kann man auch als "Schallwelle" ansehen, man kann sogar mit einer FFT zwei Zahlen multplizieren (sogar höchst effizient wenn diese Zahlen enorm groß sind, aber das ist ein anderes Hobby von mir )
Eine 2D FFT macht nun viele Einzel-FFT sequientiell über die Datenblöcke einer EXE. Wie in einem Musikstück werden wir dann den zeitlichen Verlauf der Schallwellenänderungen analysieren, wir sehen dann den Beat, den Bass, das Einsetzen des Sängers und zusätzlich natürlich immer auch all die Frequenzen der Schallwellen. Wir sehen also wann und mit welchem Bass der Beat komponiert wurde, mit welcher Stimmlage der Sänger singt etc. pp.
All das ist 1 zu 1 übertragbar auf jeden beliebigen Datenstrom ja sogar Chemischer Substanzen und Stoffe.

Nun, aber wie erkennen wir jetzt an Hand dieser Daten eine EXE ?
In meinem Projekt benutzte ich dazu Neuronale Netzwerke. Das sind quasi lernfähige Computer"hirne" (ein sehr naiver Vergleich allerdings). Wichtig ist nur: die NN's können von uns trainiert werden und sie können auf Mustererkennungen trainiert werden (Spracherkennungen, Bilderkennungssysteme, Gesichtserkennungen usw. usw.) Aber am wichtigsten ist es zu wissen das ein NN Muster erlernt indem es autom. und selbständig diese klassifizieren lernt OHNE das wir als Menschen wissen welche markanten Merkmale das NN für diese Klassifizierung real heranzieht. D.h. wir sagem dem NN was es klssifizieren lernen soll und es lernt Merkmale zu finden ohne das wir wissen wollen welche Merkmale es gefunden hat. Wir sind also nur am Ziel interessiert.

Einem NN müssen wir aber erstmal die Datenmengen vorverdauen, zurechtbiegen so das es die Aufgabe überhaupt lösen kann. Und dazu müssen die Daten quantisiert werden, quasi auf einen Einheitsvektor abgebildet werden. Denn ein NN hat nur eine feste und begrenzte Anzahl von Eingabeneuronen (quasi der Input in das Netz).

Wir führen also zb. eine 256 Punkte FFT durch, ermitteln also die Amplitudenwerte von maximal 128 Frequenzen/Symbolen. Diese 128 Punkte der FFT dienen dem NN als Input. Bei der Trainigsphase lassen wir einfach alle Dateien einer großen Festplatte per FFT umrechnen. Wir ordnen dann diese Dateien in eine Datenbank ein, zb. sortiert nach Textdateien,binären Dateien,komprimierten Dateien etc.pp. Nun haben wir eine Trainingsdatenbank und trainieren unser NN. Das NN wird nun autom. aus einem 2D Spektrum einer Datei die Antwort liefern ob sie eher eine Textdatei, binäre Datei etc. pp. ist.

Nungut, exakt damit habe ich rumgespielt und doch sehr gute Erfolge erzielen können. EXE Dateien hat er zuverlässig erkannt und auch ob sie komprimiert und oder verschlüsselt waren. Allerdings konnte mein NN eben nicht zwischen gepackten EXE und verschlüsselten EXEen unterscheiden lernen. Einfach weil es da meistens keinen Unterschied gibt in den Daten. Leider war diese Unterscheidung, bzw. das Erkennen kryptographisch geschützter Daten mein eigentliches Ziel.


Fazit: Ich stimme grundsätzlich Ollis Ansatz über die Entropie zu gehen zu, allerdings im weiterem Sinne gefasst. Ich würde Mustererkennungssysteme benutzen da die einfache Entropie zu wenig aussagekräftig sein wird, ja sogar wenn man die EXE vorher in ihre einzelne Segmente zerlegt und diese separat analysiert. Das liegt einfach daran das Code heut auch viel an Daten enthalten wird.

Als technisch leichter und denoch relativ effizienter Weg wäre noch wie oben angedeutet die Test-Komprimierung der Daten möglich. Zufallsdaten, verschlüsselte Daten und komprimierte Daten lassen sich weit weniger nochmals komprimieren als andere Daten. Aber Vorsicht auch hier gilt das in einer unkomprimierten EXE große Portionen an zb. Bildern wie JPPEGs, PNGs, GIFs sogar Bitmaps enthalten sein können und diese sind meistens alle komprimiert. ALso auch hier keine wirkliche Sicherheit in der Erkennung.

So, mal wieder ein langer Beitrag, sorry

Gruß Hagen
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#28

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 22. Jun 2006, 02:04
Zitat von negaH:
Dagegen gibt es auf Hackerseite keinen "Schutz"
Leider doch. Das Timing ist der Hinkefuß des Emulators, kann aber über eine Art Profiling an echtem Code wieder behoben werden ...

Leider sind sogar die Emulatoren der AV-Firmen relativ langsam (trotz dynamischer Emulation) und meist auf bestimmte Befehle beschränkt.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#29

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 2. Jul 2006, 11:51
Ein Packer Detector:
http://www.rdgsoft.8k.com/RDG%20Packer%20Detector.htm


PE Compact, unten ist ein Schema vor und nach der Kompression.
http://www.bitsum.com/pec2.asp
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  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 22:58 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