Welcome sex queens, live out your wildest dreams - ^DAEMON^ in 2k2 General Unpacking Game: So also Leutz, Keyboard hat mich um nen Tutorial gebeten und meine Wenigkeit konnte ihm das nicht abschlagen... Ich versuche euch das Spiel mit den Protectoren/Cruncher ein bischen näher zu bringen! Erstmal ein paar grundlegende Dinge: Q: So woran erkennt man denn ob ne exe encrypted wurde ???? A: Es gibt mehrere typische Anzeichen hierfür, zum einen sieht der Code disassembled nur nach Müll aus und auch wenn man ihn in nem Hexeditor betrachtet, kann man das sofort erkennen, zum anderen adden Protectoren/Cruncher immer einen LOADER-CODE, der normalerweise (ist in 90% der Fall) eine neue Section einfügt... anhand des Namens lässt sich hier auch schon oft einiges sagen (Peheader)... z.b. wenn man eine Section sieht mit dem Namen "petite" kann man davon ausgehen dass es petite ist! 100% Sichergehen kann man da nicht, da z.b. tE!lock eine Funktion besitzt die extra Namen von anderen Systemen einfügt... um euch zu confusen..... Q: Worin liegt der Unterschied zwischen einem Protector und nem Cruncher(Packer) A: Ein Packer komprimiert die Sections des Files lediglich und fügt meist am Ende den Loader-Code hinzu... ein Protector hingegen encrypted die Sections und hat Tricks die es schwer machen sollen den Code zu tracen, der Cracker soll so wenig Code wie möglich inspizieren können... Commercial Protections haben hier aber leider ein sehr spärliches repartoi - die meisten implementieren lediglich ein paar Soft-ice Detections und sind wirklich der Meinung: SO jetzt ist es CRACK-PROOF! und verlangen auch noch hunderte von Mark/EURO dafür... sad but true :))) Q: Wie kann man die Protection nun leichter erkennen ??? A: Es gibt tausende von File Identifiers da draussen! einige besser, einige schlechter PEid is ganz gut... aber ehrlich gesagt verwende ich sowas nie und tutors lesen tu ich normalerweise auch nicht! denn wer liest bescheisst sich nur selbst :))) ja ja ich weiß ich widerspreche mir grad selbst weil ich ja hier auch nen Tut schreib aber is einfach so.... Q: Wer zum Teufel bist du eigentlich ???? A: gute Frage! -> ^DAEMON^ von den Unpacking Gods (aka Cyber Daemon) Okay dann beginnen wir mal mit der Struktur und wie man diese Protections am besten attackiert! 1. Da die meisten Protectoren/Cruncher auch die Import Table encrypten, müssen sie sie nach dem decrypten auch laden.... das ist schon einmal ein Angriffspunkt... (99% adden selbst eine neue Import Table für ihre eigenen Funktionen) Ihr werdet mit nahezu absoluter Sicherheit folgende Imports finden können, "LoadLibraryA" "GetModuleHanldeA" "GetProcAddress" (eine der Funktionen is bestimmt dabei) Ich will das aber hier nicht erklären wozu GetProcAddress dient... etc... (selten benutzen sie eine andere Methode.... dennoch existiert sie: das Export-Table-Scanning) naja ein netter Punkt, den ich meist auch benutze ist ganz einfach nen bpm loadlibrarya zu setzen oder bpm getprocaddress (ihr werdet in den meisten Fällen fündig werden, da nahezu niemand die debug register killed) 2. Was auch noch gut ist, wenn ihr nen bpm cs:401000 w (je nachdem wo die erste section liegt abändern) setzt! Ihr landet dann nämlich bei der decryption Routine bzw. decrunching (ihr könnt auch anstatt des "w" (write) auch "r" (read) bzw. beide "rw" lassen... 3. Ihr könnt allerdings auch BPR benutzen (vor allem bei HLL Programmen sehr nützlich!) danach versucht den jump zum oep (original entry point) zu finden, meist passiert das durch nen "ret" opcode oder einen "jmp" ersteinmal dort angelangt ist es am besten zu dumpen, dies kann man per icedump erledigen bzw. über nen memory dumper (ich bevorzuge icedump! aber das ist wohl Geschmacksache) es kann aber auch durchaus nützlich sein vorher schon ein paar Dumps zu machen! Von der Import Table zum Beispiel: wenn Sie decrypted wurde! (es kann natürlich auch sein dass ihr sofort dumpen könnt wenn das File komplett decrypted worden ist, das ist oft sogar besser und einfacher!) Kurzer-break: Q: Was nun muss ich denn genau alles haben damit die geunpackte .exe wieder läuft? A: - Ihr müsst den Original Entrypoint ausfindig machen! und den Wert an PE-Header+028h eintragen - Ihr müsst dasselbe mit dem Import Table Pointer machen! und den Wert an PE-Header+080h eintragen - Die Resources werden zwar oft verschoben (z.b. tElock) aber wenn ihr die letzte Section des .exe files nicht wegschneidet! - Die Relocations könnt ihr in 99% vernachlässigen... (bei .exe files anders wäre das bei .dlls!) okay kommen wir nocheinmal zurück, also obriges gilt natürlich nur wenn der Code nicht gemangled wurde, d.h. der Code durch den Protector nicht verändert worden ist siehe Asprotect, K-Kryptor, Trial Wrap oder ähnliche.... (z.b. api calls im code verändert) naja auf alle Fälle benutzen fast alle Protections heute Anti-Debugging-Code, der sehr unterschiedlich Aussehen kann! Viele schwören auf Bogus-code (einfach garbage instructions)! Ich hingegen bin da anderer Meinung, ich meine klar wird es schwieriger den Code zu verstehen, wenn ständig unützer Code um dich herumschwirrt, aber die Leute sollten sich mehr auf die CORE der Protection konzentrieren, das ermöglicht viel mehr als zu versuchen den cracker mit garbage instructions aus der ruhe zu bringen, die klappt nämlich eh kaum! Es gibt ja tools wie MOW die so etwas in windeseile beseitigen... ----------------- Soft-Ice-Detections sind auch schon so durchgekaut dass es in wirklich 99,999% ausreicht Icedump zu laden um Soft-ice unsichtbar werden zu lassen... Was Sie natürlich auch noch benutzen ist der Check ob sich irgendwo das Byte 'CC' befindet, was nichts anderes ist als ein "INT 3", meist verursacht durch das setzen von nem BPX... ziemlich leicht zu erkennen... (besser BPM benutzen!) Dies wird auch sehr simpel durch crc zu erkennen sein, (da Soft-Ice an der RVA einfach das byte gegen 'CC'=int3 austauscht) Leute seit auf der hut und vergesst am besten diesn bpx Befehl,der taugt nicht viel wenn es um diese Protections geht! was zur Zeit allerdings auch immer beliebter wird ist das Auslösen von gezielten Exceptions (SEH - Structured Exception Handling)... da man hier z.b. die debug register ohne weiteres auf 0 setzen kann (und die bpms in Sice verloren gehen!) ----------------- Am besten üben wir mal an ein paar Praktischen Beispielen: REVERSING ARMADILLO TOOLS USED : SOFT-ICE V4.0 ICEDUMP 6.0.1.7 PROCDUMP SOME LITTLE PROGGYS TO PROTECT FROGSICE V1.0.8.5 TARGET : ARMADILLO V1.83 BETA 2 LETS GO TO WORK ..... K NOTHING FOR BEGINNERS TRACE IT A LITTLE BIT, YES! PLAY WITH IT!!!! THEN COME BACK TO REALITY..... PROTECT A PROGRAM (I CHOOSED ALSO THE DEBUGGER BLOCKER...) WOW THE FILE INCREASED REALLY MUCH!!! SO FUCK IT!!! SET A BPX @ RESUMETHREAD..... THE BREAK SHOULD OCCOUR 3 TIMES... BUT HALT ON THE SECOND ONE...... TRACE A FEW LINES DOWN TILL U COME TO THIS POINT..... EAX=004021ED EBX=0064FB6C ECX=0064F61C EDX=BFFBFA00 ESI=00000000 EDI=0040C1D0 EBP=0064FB7C ESP=0064F600 EIP=004060BA o d I s z a P c CS=014F DS=0157 SS=0157 ES=0157 FS=2F0F GS=0000 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄbyteÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROTÄÄÄ(1)ÄÄ 0030:00000000 9E 01 00 00 00 04 70 00-16 00 0B 00 00 00 70 00 ......p.......p. 0030:00000010 65 04 70 00 54 FF 00 F0-79 EA 00 F0 21 EA 00 F0 e.p.T...y...!... 0030:00000020 00 00 00 CA D2 08 B1 23-3A 00 15 18 52 00 15 18 .......#:...R... 0030:00000030 6A 00 15 18 82 00 15 18-9A 00 15 18 65 04 70 00 j...........e.p. 0030:00000040 07 00 70 CA 4D F8 00 F0-41 F8 00 F0 82 25 56 FD ..p.M...A....%V. 0030:00000050 39 E7 00 F0 40 02 8B 02-2D 04 70 00 28 0A 18 12 9...@...-.p.(... 0030:00000060 00 E0 00 F0 2F 00 D8 18-6E FE 00 F0 04 06 18 12 ..../...n....... 0030:00000070 1D 00 00 CA A4 F0 00 F0-22 05 00 00 3A 54 00 C0 ........"...:T.. 0030:00000080 A8 0F C8 00 2F 04 B0 28-F2 2F AF FC 22 24 6C FD ..../..(./.."$l. 0030:00000090 0C 00 44 29 BC 0F C8 00-22 25 5C FD D0 0F C8 00 ..D)...."%\..... 0030:000000A0 6C 10 C8 00 66 04 70 00-B4 05 18 12 6C 10 C8 00 l...f.p.....l... 0030:000000B0 6C 10 C8 00 6C 10 C8 00-62 01 E7 18 F6 03 B0 28 l...l...b......( 0030:000000C0 EA E4 0F C8 00 6E 00 F0-6C 10 C8 00 01 00 37 29 .....n..l.....7) 0030:000000D0 6C 10 C8 00 6C 10 C8 00-6C 10 C8 00 6C 10 C8 00 l...l...l...l... 0030:000000E0 6C 10 C8 00 6C 10 C8 00-6C 10 C8 00 6C 10 C8 00 l...l...l...l... 0030:000000F0 6C 10 C8 00 6C 10 C8 00-6C 10 C8 00 6C 10 C8 00 l...l...l...l... 0030:00000100 59 EC 00 F0 40 00 00 F0-65 F0 00 F0 DC DB FF FF Y...@...e....... 0030:00000110 08 6E 00 F0 08 6E 00 F0-50 00 00 F0 08 6E 00 F0 .n...n..P....n.. 0030:00000120 08 6E 00 F0 08 6E 00 F0-08 6E 00 F0 72 26 47 FD .n...n...n..r&G. 0030:00000130 08 6E 00 F0 08 6E 00 F0-08 6E 00 F0 FC 04 70 00 .n...n...n....p. 0030:00000140 08 6E 00 F0 08 6E 00 F0-08 6E 00 F0 08 6E 00 F0 .n...n...n...n.. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROT32Ä 014F:0040607F 8B0D90DD4000 MOV ECX,[0040DD90] 014F:00406085 51 PUSH ECX 014F:00406086 FF1558C04000 CALL [KERNEL32!VirtualProtectEx] 014F:0040608C 85C0 TEST EAX,EAX 014F:0040608E 7523 JNZ 004060B3 014F:00406090 C705D8E040000A000000 MOV DWORD PTR [0040E0D8],0000000A 014F:0040609A 6870D34000 PUSH 0040D370 014F:0040609F 68DCE04000 PUSH 0040E0DC 014F:004060A4 E807210000 CALL 004081B0 014F:004060A9 83C408 ADD ESP,08 014F:004060AC 33C0 XOR EAX,EAX 014F:004060AE E917010000 JMP 004061CA 014F:004060B3 6A04 PUSH 04 014F:004060B5 E85F0A0000 CALL 00406B19 <== EAX HOLDS THE CORRECT ENTRYPOINT AFTER THIS CALL 014F:004060BA 83C404 ADD ESP,04 014F:004060BD 89855CFBFFFF MOV [EBP+FFFFFB5C],EAX 014F:004060C3 8D95A4FAFFFF LEA EDX,[EBP+FFFFFAA4] 014F:004060C9 52 PUSH EDX 014F:004060CA A194DD4000 MOV EAX,[0040DD94] 014F:004060CF 50 PUSH EAX 014F:004060D0 FF1550C04000 CALL [KERNEL32!SetThreadContext] 014F:004060D6 85C0 TEST EAX,EAX 014F:004060D8 7523 JNZ 004060FD 014F:004060DA C705D8E040000A000000 MOV DWORD PTR [0040E0D8],0000000A 014F:004060E4 687CD34000 PUSH 0040D37C 014F:004060E9 68DCE04000 PUSH 0040E0DC 014F:004060EE E8BD200000 CALL 004081B0 014F:004060F3 83C408 ADD ESP,08 014F:004060F6 33C0 XOR EAX,EAX ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄMAIN!.text+507FÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ :\SCREENDUMP E:\SCR1 SO TRACE TO THIS CALL AND STEP OVER IT EAX HOLDS THE CORRECT ENTRYPOINT!!!! WRITE IT DOWN.... NOW I SET: BPM 014F:004021ED X k, clear the other breakpoint and press F5.... so now u should be on the oep!!! yup assemble a jmp eip (write down the bytes u overwrite) f5 start procdump choose the target file but be sure u take the one with the suffix .tmp0 and do a full dump..... open the new file with procdump change the entrypoint and don't forget to fix the bytes we have overwritten..... thats it! bye bye Armadillo, i won't miss u (I love this animal) ------ Hier hab ich auch noch einen sehr alten Tutorial von mir... (werdet ihr allein schon an der Versionsnummer von Clonecd erkennen können! (das hier ist lediglich ein Auszug aus dem Tutorial) Entpacken von Clonecd: Tools used: - A BRAIN!!!!! - Soft-Ice V4.00 - Procdump V1.6.2 Ultra Final - W32dsm89 (ich benutze meistens zwei oder mehr disassembler, man weiss ja nie!!!!) - IDA Pro V4.04 - IceDump V6.0.1.5 (SOME-TIMES BETTER THAN 6.0.1.6!) - Hview V?.? - Hex-Workshop V?.? - manchmal ein paar ~geile~ MUSCHIS um einen herum (as Xoanino pointed out: CrackerS need LOVE!) (lenken jedoch oft ab..... ;-) ...GRINS..SMILE...) Target: CloneCD V2.3.1.1 (english) Location: www.elaboratebytes.com Skill: Intermediate-Advanced Lets start it... Nunja starten wir das Programm mal, hmmm wir sehen dass das Programm eine Nag öffnet REG or ABORT..... Vorweg schon mal eine gültige SERIAL zu reversen wäre krankhaft..... tja wenn wir in das programm verzeichnis mal schauen dann können wir folgende dateien sehen. UNINST.ISU CLONECDen.CHM - Sprachfile CLONECDT.DAT - sieht interressant aus CLONECD.EXE - tja unser opfer SUCCESS.WAV ERROR.WAV nach einigem herumspielen sehen wir dass das file CLONECD.EXE nur als loader dient. Diese lädt nämlich clonecdt.dat. CLONECDT.DAT ist in wirklichkeit das Hauptprogramm.... Ok soviel dazu dann steigen wir mal ein... zuerst packen wir procdump aus und schauen uns die sections mal etwas genauer an. Entrypoint: 0000B001 ---- hmmm naja der Entrypoint ist also 40B001 da wir eine image base von 400000 haben und der entrypoint B001 ist.... daraus ergibt sich 400000+B001 => RVA: 40B001 unter den sections finden wir DREIMAL!!! data das kann ja wohl nicht sein (aus vorherigen versionen weiss ich aber dass es sich hier um den PACKER/CRYPTOR --- ASprotect handelt). BTW: Asprotect ist eine modifizierte Fassung von Aspack... Wurde übrigens vor ein paar tagen offiziell released (V1.0 available at protools.cjb.net) (bevor wir nun zum unpacken kommen noch zwischen durch was: eigentlich müssten wir clonecd gar nicht entpacken bzw. wir könnten danach einen inline patcher schreiben wie ich es schon bei Awave 6.0 getan habe.... vielleicht nehme ich mir noch die Zeit....) 1. UNPACKING CLONECD Bevor wir irgendwas anderes versuchen entpacken wir die ganze scheisse doch einfach mal hierzu notieren wir uns die infos der sectionen (clonecd.exe): (unsere Import Table ist entweder in .RDATA oder in .IDATA das ist von target zu target verschieden... Ihr seid auf euch alleine gestellt OH NEIN!!! ;-) hier befindet sie sich aber in der .RDATA section darum müssen wir uns folgendes merken (brauchen wir für später...) VIRTUAL SIZE VIRTUAL OFFSET RDATA : 00001000 00006000 ladet am besten jetzt ICEDUMP... setzen wir nen breakpoint bei LoadLibraryA und schauen ob er unsere Import Table schon geladen hat hierzu tippen wir "D 406000" wenn die Fragezeichen verschwunden sind müssen wir den ganzen shit nur noch auf die Platte ziehen PAGEIN D 406000 1000 C:\CLONE.RDA danach zum entrypoint zurücktracen (ich setze voraus dass das jeder alleine kann!!!) (RVA: 401A04 ;-) wenn ihr hier angelangt seid dann dumpt den ganzen mist mit PAGEIN D 400000 1F000 C:\CLONEFIX.EXE tja nun reparieren wir erst einmal die CLONEFIX.EXE (welche nichts anderes als unser loader ist) procdump starten => PE Editor und CLONEFIX.EXE auswählen: folgende Dinge abändern: Entrypoint : 0000B001 => 00001A04 PSIZE OLD PSIZE NEW CHARACTERISTICS NEW OFFSET .text 00002E00 00005000 E0000060 00001000 .rdata 00000800 00001000 E0000060 00006000 .data 00000400 00003000 E0000060 00007000 .rsrc 00000400 00001000 E0000060 0000A000 .data 00012C00 00013000 E0000060 0000B000 .data 00000000 00001000 E0000060 0001E000 wow, naja jetzt wird es zeit unsere zwei dump files zu vereinigen. ganz kurz hex-workshop gestartet und CLONE.RDA komplett markiert und an offset 00006000 eingefügt.... okay, hex-workshop wieder schliessen und mit hiew clonefix.exe öffnen. jetzt suchen wir nach "kernel" TREFFER 1 bei 406992 sieht gut aus..... suchen nach 92 69 00 wieder ein TREFFER diesmal bei 406700 nun gut 24 BYTES zurück 4066FC, testen..... Procdump starten => PE Editor => Clonefix.exe => Directories und bei Import Table C464 gegen 66FC austauschen.... tja soweit so gut jetzt sollte sie eigentlich laufen starten und yippie..... Hmmmm, was ist das ???? Wir sehen zwar das Logo "CloneCD is loading.... Please wait!" aber es tut sich nichts..... erst mal den process mit procdump killen.... gut..... THE DEAD-LISTING: es wird langsam Zeit für unseren W32 => starten und sehen doch hoffentlich diesen interresanten Teil: :004011D1 55 push ebp :004011D2 8BEC mov ebp, esp :004011D4 81EC80010000 sub esp, 00000180 :004011DA 53 push ebx :004011DB 56 push esi :004011DC 57 push edi :004011DD 6A04 push 00000004 :004011DF 6AFF push FFFFFFFF * Reference To: KERNEL32.GetProcAddress, Ord:013Eh | :004011E1 FF1518604000 Call dword ptr [00406018] :004011E7 85C0 test eax, eax :004011E9 A36C7C4000 mov dword ptr [00407C6C], eax :004011EE 0F8449010000 je 0040133D > ARE WE BAD GUYS? :004011F4 68E19D2139 push 39219DE1 * Possible StringData Ref from Data Obj ->"Once in a while, there is a copy " ->"protection, that needs to be fooled" | :004011F9 6830704000 push 00407030 :004011FE 8D4580 lea eax, dword ptr [ebp-80] * Possible StringData Ref from Data Obj ->"%s %8.8x!" | :00401201 68E4704000 push 004070E4 :00401206 50 push eax :00401207 E81F070000 call 0040192B :0040120C 8D4580 lea eax, dword ptr [ebp-80] :0040120F 50 push eax :00401210 E89B060000 call 004018B0 :00401215 83C414 add esp, 00000014 :00401218 50 push eax * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401244(C) | :00401219 8D4580 lea eax, dword ptr [ebp-80] :0040121C 50 push eax :0040121D FF156C7C4000 call dword ptr [00407C6C] > PHAT ROUTINE WHICH DE - :00401223 85C0 test eax, eax > CRYPT NEXT CODE !!!! :00401225 0F840D010000 je 00401338 > IF JMP => WE DIE!!! :0040122B EB04 jmp 00401231 :0040122D EB05 jmp 00401234 hmmm, setzen wir mal nen Breakpoint bei GetProcAddress nach einigem herumstöbern bin ich auf folgendes gekommen wenn wir bei RVA: 4011EE jumpen dann sterben wir also noppen wir es heraus aber was machen wir mit unserer DECRYPTION ROUTINE ???? SCHEISSE !!!!!!!!!!! Ok zurück zum original file ihr müsst nun schauen dass ihr bis zu dem punkt oben traced !!!! und abwartet dass er alles korrekt entschlüsselt (nicht so schwer) und dann dumpen.... hier können wir entweder die komplette .text section austauschen oder nur einen Teil.... Ich z.b. habs so gemacht..... bei RVA 401225 (in dem original FILE!!!!!!!!) PAGEIN D 401000 1000 C:\CLONE.TXT diesen part dann wieder (in clonefix.exe) mit Hex-Workshop eingefügt.... tja nun patchen wir diese HURE !!!!!!!! * Reference To: KERNEL32.GetProcAddress, Ord:013Eh | :004011E1 FF1518604000 Call dword ptr [00406018] :004011E7 85C0 test eax, eax :004011E9 A36C7C4000 mov dword ptr [00407C6C], eax :004011EE 90 nop > 1. PATCH :004011EF 90 nop > (HIER SCHON GEPATCHED) :004011F0 90 nop :004011F1 90 nop :004011F2 90 nop :004011F3 90 nop :004011F4 68E19D2139 push 39219DE1 * Possible StringData Ref from Data Obj ->"Once in a while, there is a copy " ->"protection, that needs to be fooled" | :004011F9 6830704000 push 00407030 :004011FE 8D4580 lea eax, dword ptr [ebp-80] * Possible StringData Ref from Data Obj ->"%s %8.8x!" | :00401201 68E4704000 push 004070E4 :00401206 50 push eax :00401207 E81F070000 call 0040192B :0040120C 8D4580 lea eax, dword ptr [ebp-80] :0040120F 50 push eax :00401210 E89B060000 call 004018B0 :00401215 83C414 add esp, 00000014 :00401218 90 nop > TÖTE DEN PUSH! > (HIER SCHON GEPATCHED) :00401219 8D4580 lea eax, dword ptr [ebp-80] :0040121C 90 nop > VERNICHTE DEN PUSH! :0040121D 90 nop > UND AUCH DEN CALL :0040121E 90 nop > (HIER SCHON GEPATCHED) :0040121F 90 nop :00401220 90 nop :00401221 90 nop :00401222 90 nop :00401223 85C0 test eax, eax :00401225 90 nop > ZUR SICHERHEIT :00401226 90 nop > (HIER SCHON GEPATCHED) :00401227 90 nop :00401228 90 nop :00401229 90 nop :0040122A 90 nop :0040122B EB04 jmp 00401231 :0040122D EB05 jmp 00401234 :0040122F 8989E9000000 mov dword ptr [ecx+000000E9], ecx :00401235 00BE747C4000 add byte ptr [esi+00407C74], bh :0040123B 6800010000 push 00000100 :00401240 56 push esi :00401241 6A00 push 00000000 * Reference To: KERNEL32.GetModuleFileNameA, Ord:0124h | :00401243 FF1514604000 Call dword ptr [00406014] :00401249 85C0 test eax, eax :0040124B 0F84E7000000 je 00401338 :00401251 BF687B4000 mov edi, 00407B68 :00401256 56 push esi :00401257 57 push edi :00401258 E863050000 call 004017C0 :0040125D 57 push edi :0040125E E800010000 call 00401363 :00401263 83C40C add esp, 0000000C :00401266 85C0 test eax, eax :00401268 90 nop > SO EINE DRECKSAU :00401269 90 nop > HIER WÜRDEN WIR :0040126A 90 nop > SCHON WIEDER DRAUFGEHEN :0040126B 90 nop > (HIER SCHON GEPATCHED) :0040126C 90 nop :0040126D 90 nop :0040126E 56 push esi :0040126F E83C060000 call 004018B0 :00401274 59 pop ecx :00401275 B35C mov bl, 5C * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401280(U) | :00401277 3898747C4000 cmp byte ptr [eax+00407C74], bl :0040127D 7403 je 00401282 :0040127F 48 dec eax :00401280 EBF5 jmp 00401277 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0040127D(C) | :00401282 8DB8757C4000 lea edi, dword ptr [eax+00407C75] * Possible StringData Ref from Data Obj ->"CloneCD.exe" | :00401288 68D8704000 push 004070D8 :0040128D 57 push edi :0040128E E88D400000 call 00405320 :00401293 59 pop ecx :00401294 85C0 test eax, eax :00401296 59 pop ecx :00401297 7431 je 004012CA > AN EURER STELLE WÜRDE ICH DIESE > STELLE HIER AUCH PATCHEN !!! "EB" :00401299 57 push edi :0040129A 8D8580FEFFFF lea eax, dword ptr [ebp+FFFFFE80] * Possible StringData Ref from Data Obj ->"Please be so kind not to rename " ->"CloneCD.exe to %s!" | :004012A0 68A4704000 push 004070A4 :004012A5 50 push eax :004012A6 E880060000 call 0040192B :004012AB 83C40C add esp, 0000000C :004012AE 8D8580FEFFFF lea eax, dword ptr [ebp+FFFFFE80] :004012B4 6A10 push 00000010 * Possible StringData Ref from Data Obj ->"CloneCD" | :004012B6 689C704000 push 0040709C :004012BB 50 push eax :004012BC FF35687C4000 push dword ptr [00407C68] * Reference To: USER32.MessageBoxA, Ord:01BEh | :004012C2 FF1514614000 Call dword ptr [00406114] :004012C8 EB6E jmp 00401338 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401297(C) | :004012CA 56 push esi :004012CB E8E0050000 call 004018B0 :004012D0 59 pop ecx :004012D1 8D80747C4000 lea eax, dword ptr [eax+00407C74] * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004012DF(U) | :004012D7 3818 cmp byte ptr [eax], bl :004012D9 7406 je 004012E1 :004012DB 802000 and byte ptr [eax], 00 :004012DE 48 dec eax :004012DF EBF6 jmp 004012D7 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004012D9(C) | :004012E1 56 push esi :004012E2 BE607A4000 mov esi, 00407A60 :004012E7 56 push esi :004012E8 E8D3040000 call 004017C0 * Possible StringData Ref from Data Obj ->"CloneCDT.dat" | :004012ED 688C704000 push 0040708C :004012F2 56 push esi :004012F3 E8D8040000 call 004017D0 :004012F8 56 push esi :004012F9 E865000000 call 00401363 :004012FE 83C414 add esp, 00000014 :00401301 85C0 test eax, eax :00401303 742D je 00401332 YOOOOOO, der loader ist nun endgültig fertig...... entpackt und läuft,,,,,,nun können wir endlich das file clonecdt.dat (eigentlich die main.exe!) uns ein wenig näher anschauen.... 2. UNPACKING CLONECDT.DAT naja dann nehmen wir mal CLONECDT.DAT unter die Lupe...... das entpacken ist genau wie bei unserer CLONECD.EXE......... unsere Import Table befindet sich in .idata also bpx loadlibrarya F5 bis er sie geladen hat dumpen... PAGEIN D 4E2000 3000 C:\CLDTA.IDA zum entrypoint tracen welcher sich diesmal bei 401000 befindet und wieder dumpen: PAGEIN D 400000 161000 C:\CLDTA.EXE ok, wieder analog mit Procdump unser file fixen.... Import Tabelle : 000E2000 mit procdump eintragen tja dann noch nach clonecdt.dat umbennen und clonefix.exe starten..... was soll denn das jetzt ???? unser file quittet ganz einfach ...... ;-() QUICK FIXING CLONEFIX.EXE: :004012E1 56 push esi :004012E2 BE607A4000 mov esi, 00407A60 :004012E7 56 push esi :004012E8 E8D3040000 call 004017C0 * Possible StringData Ref from Data Obj ->"CloneCDT.dat" | :004012ED 688C704000 push 0040708C :004012F2 56 push esi :004012F3 E8D8040000 call 004017D0 :004012F8 56 push esi :004012F9 E865000000 call 00401363 > SCHEINT AN CLONECDT.DAT > EINEN CRC -CHECK DURCHZUFÜHREN :004012FE 83C414 add esp, 00000014 :00401301 85C0 test eax, eax :00401303 742D je 00401332 > BAD_BOY THEN JUMP!!!!! deshalb noppen wir den obrigen jmp einfach raus........ Jetzt drückt die Daumen und startet das File nochmal...... YEAH, es läuft ist aber nun vollkommen (hoffentlich!) entpackt!!!! ---------------------------- Fazit: Normale Packer sind aber nicht schwer zu tracen... anders hingegen sieht es bei Execrypter aus die natürlich gezielt versuchen unseren Code zu schützen dem einem gelingt dies besser dem anderen schlechter so sieht das ganze auch nacher beim decrypten oder entpacken aus... für die einen ist es ein Kinderspiel und für die anderen ein einziger Alptraum... damit muss man leben... Zum Schluss gibts noch ne kleine Tabelle (lediglich meine Meinung :) Name Description Debugging-level (Difficulty) ================================================================ Pecompact Packer *......... Pklite Packer *......... PeProt Protector ****...... Coder: Chris's Protector :) PeLockNt Protector *******... Aspack Packer/*Prot* ***....... Asprotect Packer/Protector ********** tElock Packer/Protector ******.... SoftSentry Protector *......... Zcode Protector ******.... PeProtector Protector ********.. Coder: Ni2 BitArts Prod. Packer/Protector *****..... Das neue Titanium ist gar nicht mehr so schlecht ;) (Dennoch zu einfach) Armadillo Packer/Protector ******.... Das neue soll ganz anständig sein! Petite Packer **........ Peshield Protector ?????????? Upx Packer ?????????? Peninja Protector ***....... NoodleCrypt Protector ****...... Vbox Protector *******... PcGuard Protector ****...... .... ....