Programme vor dem Debugger "verstecken"?



  • Wieso ist er es denn noch von Windows, wenn man ihn ausführt und von einem anderen Programm verschlüsselt wurde? Wo wird da etwas vorher entschlüsselt, damit es lesbar wird?

    naja, bei jedem packer woanders 😉 Im prinzip wird die Exe "veschlüsselt" aber es wird auch eine "entschlüsselungsroutine" beigelegt - sonst würde es nicht funktionieren. Dabei gibts verschiedene Ansätze - einfach http://www.codeproject.com/file/packersfx.asp schauen... wobei das natürlich ein simpler packer wäre.Also einen Packer in C++ zu schreiben finde ich sowieso keine gute Idee :troll:
    PS: ich kenne so einige packer, allerdings wurden alle in asm geschrieben...
    hier findest du ein paar: http://spiff.tripnet.se/~iczelion/source.html
    im Prinzip brauchst du dich eigentlich nur mit dem PE-Format zu beschäftgien - Wenn man weiß wie eine Exe aufgebaut ist, kann man sie auch manipulieren 😉
    PPS: ein gutest PE-tut ist hier: http://spiff.tripnet.se/~iczelion/tutorials.html
    und so einfach von heute auf morgen geht das auch nicht ;).
    Was mir sonst noch einfällt: selbstmodifizierende exen - leider wohl mit C++ nicht durchführbar :D.



  • Danke für die guten Infos...mit dem PE Zeugs und der Struktur habe ich mich glücklicherweise schon beim API-Hooking auseinandergesetzt! 😃



  • so....mal ein bisschen gelesen. Also sind diese Anwendungen wie Powerstrip eigentlich nur ein Selfunpacker, welche ihre Dateien wieder entschlüsseln und dann irgendwo speichern, um sie zu öffnen? Ist es irgendwie möglich rauszufinden wo die Dateien gespeichert werden, nachdem sie entpackt wurden, um eben an die tatsächliche Datei zu kommen? Weil jeder Packmechanismus kann ja anders geschrieben sein...und wie könnte man hier bei einem fremden Programm an die wahren Dateien kommen?
    Kevin



  • Da wundert mich dann doch noch was 🙂
    Anscheinend entpackt hier Powerstrip kein eigenes Programm, denn das gestartete ist immernoch die pstrip.exe aus dem Ordner \PowerStrip...wie ist denn das dann möglich? Es leuchtet mir ja noch ein, dass die pstrip.exe Code enthält, die die tatsächliche Anwendung, die ebenfalls verschlüsselt in der pstrip.exe steckt als eigene Datei abspeichert und dann ausführt, aber das scheint ja nich der Fall zu sein....wie dann? 🙂



  • die datei wird einfach im speicher entpackt und dann ausgeführt



  • Hallo!
    Es gibt ja einige Programme wie zum Beispiel PowerStrip, die haben angeblich keinerlei importierter oder exportierter Funktionen. Ist das überhaupt möglich?? Ich meine, auch diese müssen doch CreateWindow etc. aufrufen...zum Mindest GetProcAddress müsste doch verfügbar sein...darüber könnte man sich ja die Addressen aller anderen Funktionen suchen...aber wie wird das in diesen Programmen gemacht? Nichtmal die Daten (Strings etc.) erkennt ein Debugger wie W32DASM...wisst ihr wie man so etwas in seinem eigenen Programm ebenfalls verstecken kann?
    Kevin

    ich habe mal einen virus(kling schlimm is es aber nicht 😉 ) in visual c geschrieben also ohne assembler, der auch seine imports selbst berechnet ohne den win peloader zunutzen...
    vieleicht kannst du dir da ja was abschauen 😉

    www.delikon.de
    und dann ab auf die virus section



  • esskar schrieb:

    die datei wird einfach im speicher entpackt und dann ausgeführt

    Welche Möglichkeiten gibts da außer wenns ne DLL is als DLL laden oder den Code als neuen Thread ausführen?

    Danke Mart, werds mir mal ansehen!



  • wieso dll oder thread???

    schau dir mal dem morphine packer an....
    der nimmt eine zupackende file, verschlüsselt sie und erstellt eine neue exe legt dort die verschlüsselte file in einer section ab, und in dem .code teil der neuen exe ist jetzt der pe-loader er allokiert speicher....füllt die imports...der alten file und wenn er damit fertig ist
    jmp entry-point

    morphine ist open source



  • gut, das mit der DLL oder dem Thread war wohl ein Denkfehler :> *schäm*

    Schau mir das Zeug ma an...ist ja recht interessant 😃

    Danke!
    Kevin



  • So nun mal ne Frage...angenommen ich möchte ein Programm so patchen, dass es vor dem Aufrufen des eigentlichen Programms eine MessageBox aufruft und den Code des kompletten eigentlichen Programms um 1 erniedrigt (also jedes Byte). Denn er wurde (Hammer 256Bit Verschlüsselung :>) wurde um 1 erhöht (also jedes Byte), außer es ist 0xFF. Also ich dachte mir das so:

    Hui ja....wie macht man das am besten...
    erstmal das Prog in den Speicher laden und jedes Byte um 1 erhöhen (außer es 0xFF). So ab jetzt gibts keine Tables mehr die gültig wären...also setze ich an das Ende des sehr gut verschlüsselten Programms eine Funktion. Diese ruft jetzt eine MessageBox auf, läd alle Daten vom Anfang des Programms bis zum Entrypoint in den Speicher und erniedrigt sie um 1. und springt zum alten Entrypoint. Nun wird noch der Entrypoint zum Anfang meines Codes gesetzt.
    Aber erstmal...wie kann die Decryptfunktion überhaupt eine MessageBox ohne die MessageBoxA Import aufrufen? Wie kann ich hier (zu testzwecken) noch eine MessageBoxImport behalten? In wie weit darf ich überhaupt Code "verschlüsseln"? Ist es getan, wenn ich wieder alle Daten "entschlüssel" oder muss ich da noch irgendwas machen? Werden die entschlüsselten Daten denn überhaupt als Imports (und alle anderen Dinge, die das PE Format so in sich trägt) dann direkt erkannt?

    Also ich nehme mal an, was ich gerade sagt hat niemand verstanden 🙂 Also sagt mal am Besten einfach, wie ihr das aufbauen würdet, wenn ihr alle Daten so billig verschlüsseln wolltet, dass alle Bytes (bis aufs 0xFF) um eins erhöht werden und das neue wirkliche Stück Code einfach wieder alles entschlüsselt und aufruft...denk da wohl irgendwie zu kompliziert 😕

    Danke,
    Gruß,
    Kevin



  • wenn es nur um "addieren "geht dann ist es mehr als billing...

    www.delikon.de
    da findest du ein tool das heißt upolyx

    dieses tool macht genau das selbe es nimmt eine upx gepackte exe, und
    addiert zu jedem von entrypoint bis (entrypoint+100) immer auf jedes byte einen wert, dann kopiert es eine asm decrypter routine unter den alren code und
    der alte entrypoint zeigt jetzt auf diese routine.

    und wenn du jetzt die exe startest "entschlüsselt" diese rountine den code und springt dann rein...

    billig billig ........

    aber anti-debuging is halt net dabei 😉



  • was willst du damit eigentlich erreichen?
    und warum?



  • und wenn ich nicht nur von entrypoint - entrypoint+100 "verschlüssle" sondern komplett alles, samt Daten und ImportTable....weil da ist das Problem...oder gibts da überhaupt eins? 🙂 Wenn ich in der Entschlüsselroutine eine MessageBox aufrufen will und dazu eine importierte Funktion brauche (MessageBoxA :>) dann muss er die ja aus der ImportTable lesen....diese ist jedoch verschlüsselt....geht das dann überhaupt?

    Ich will das machen, um mal zu verstehen, wie andere ihre Programme verschlüsseln 🙂 CrackMes zu knacken ist ziemlich schwer wie ich finde und damit lernt man gut mit Exe Dateien umzugehen 🙂

    Viele Grüße,
    Kevin



  • Also ich probiers einfach ma so, könnt ja sagen obs tut oder net...
    ich hab 2 Anwendungen vorerst....einmal die, die verschlüsselt werden "will" und die andere ist der Unpackerstub. Jetzt verschlüssel ich erstmal die Anwendung von A-Z. Dann setze ich den MS-DOS Header des Stubs + PE Signature + NT Header + Optional Header + Section Tables + data +edata +idata Section unverschlüsselt an den Anfang der alten Anwendung. Den Code klebe ich ganz hinten dran und BaseOfCode des Optional Headers setze ich neu auf das Ende der verschlüsselten Anwendung und somit auf den Anfang meiner neuen Anwendung. Den Entrypoint setze ich noch hinten auf den Entrypoint meines Stubs. Das ist jetzt alles nur zu Testzwecken! Dass so ein Unpackerstub normalerweise in ASM geschrieben ist, weiß ich auch...wills aber auch mit C++ Code und allen tollen Sections können 😃

    Habe ich was vergessen/nicht beachtet/zu viel gemacht?

    Danke,
    Kevin



  • Wenn der Unpackerstub geladen wurde, den Code entschlüsselt hat...wie kann ich ihn dann in den Speicher laden, um ihn auszuführen?

    Ich habe mal zum Test eine Map auf eine Datei gelegt und die per MapViewOfFile in den Speicher geladen. Dann einen Jump zu dessen Entrypoint gemacht, aber es funktioniert nicht...wundert mich auch nicht wirklich...oder sollte so etwas funktionieren? Wie macht man das dann?

    Bitte um Antwort!
    Kevin



  • Wenn der Unpackerstub geladen wurde, den Code entschlüsselt hat...wie kann ich ihn dann in den Speicher laden, um ihn auszuführen?

    häää?
    irgendwie hast du da etwas falsche vorstellungen

    ch habe mal zum Test eine Map auf eine Datei gelegt und die per MapViewOfFile in den Speicher geladen. Dann einen Jump zu dessen Entrypoint gemacht, aber es funktioniert nicht...wundert mich auch nicht wirklich...oder sollte so etwas funktionieren? Wie macht man das dann?

    wie soll das gehen bitte ? die file liegt am falschen speicherbereich, und die imports sind nicht aufgelöst!!!

    wenn du nur entschlüsselst musst du einfach in die entschlüsselten daten springen

    wenn du aber entpackst, musst du die import auflössen an der base.addr speicher allokieren etc... was eben ein loader macht 😉

    für das erstere schau dir upolyx an
    für den loader morphine...

    sonst noch eine c++ programmierter crypter ist yoda's crypter ....ein sehr gut zulesender code...

    aber das habe ich ihr a schon 3 mal gepostet aber scheinbar willst du dir das nicht ansehen ...........



  • Doch habs mir angesehen...so weit will ich aber noch nicht gehen! Noch gibt es keinen Packer, bisher nur Spielereien um zu sehen wie weit ich mit dem PE Format gehen kann...nur leider scheitert jede Spielerei!

    Erkläre mir mal einfach bitte wie ich NUR das schaffen kann:
    Anwendung A und Anwendung B. Ich kopiere komplett AA vor AB. Die .text Section kopiere ich zusätzlich noch HINTER AB. Anstatt der alten .text Section möchte ich die NEUE HINTER AB aufrufen. Dazu setzte ich zuerst VirtualAddress von der .text Section auf SizeAA + SizeAB (also da wo die CodeSection liegt) und die BaseOfCode im Opt.-Header änderte ich ebenfalls.
    Den EntryPoint änderte ich auch auf:
    EPOLD-OldBaseOfCode+SizeAA+SizeAB.

    Leider ändert alles in nem Crash.
    Dachte das liegt evtl. daran, dass viele Teile in der Anwendnung außerhalb von Sections liegen. Also wollte ich diese Teile in Sections fassen und machte mir eine Funktion, die SectionHeader hinter den letzten SectionHeader klebt. Funktioniert auch perfekt...nur leider, selbst wenn ich den SectionHeader von der .text Section kopiere, ihn umbenenne in .test zB und hinten anklebe ist die Anwendung ungültig. An die richtige Stelle habe ich den Header jedoch gestellt, da mir jeder PE-Inspector sagt, dass ich ebenfalls diese Section habe!
    Wie weit kann ich eigentlich hinter die SectionHeaders weitere SectionHeaders kleben, bis ich wichtige Daten überschreibe?

    Ich habe mal zum Testen den SectionHeader hinter den letzten anderen SectionHeader geklebt und NICHT NumberOfSections erhöht...da ging die Anwendung noch, also hier überschreibe ich noch nichts wichtiges...doch wieso passt ihm das nicht wenn ich ihm noch eine Section schenke?

    Was mache ich nur falsch? *verzweifel* 😞

    Viele Grüße,
    Kevin


Anmelden zum Antworten