Mich hat es immer gewundert, warum RunPE basierende Crypter fast immer so viele "unnötige" Funktionen verwenden (z.B ZwUnmapViewOfSection und natürlich das Reservieren des Speichers in "einzelschritten" - für jede Section einzeln).
Denn in vielen Fällen braucht man nur die "Stub" beim Cryptvorgang etwas anzupassen und spart sich dann 5-6 "verdächtige" API Aufrufe.
Kurzum - RunPE war imho eher ein PoC. Und der wurde in 90% aller Fälle einfach stumpf kopiert. Ich hab damit ein bisschen rumgespielt und ein "Crypter"+Binder in einem ist fast fertig ;). Da das eigentlich anschmei�?en der Exe ziemlich einfach ist, konnte ich meine Aufmerksamkeit viel interessanteren Dingen widmen.
1. Es gibt keine "feste" Stub.
Eine "Wirt" Anwendung wird ausgewählt. Sofern diese mit dem "Ziel" kompatibel ist (ImageBase + Vorhanden sein von LoadLibarary oder GetModuleHandle API) werden beide zusammengebunden.
Der Wirt wird so modifiziert, dass er die "Zielanwendung" startet - allerdings selber weiterhin vollständig funktionsfähig bleibt (man braucht also keine Fake-Meldungen).
Um das als Bsp auf die üblichen 90% der Crypter anzuwenden: jedesmal, wenn man einen neuen "Wirt" auswählt, hat man praktisch eine neue Stub ;).
PE-mä�?ig wird ein "richtiger" Rebuild vorgenommen - die letze Section wird zwar vergrö�?ert, allerdings werden einige Codeteile in Codecaves geschrieben, so dass heuristikmä�?ig die Modifikation bei allen AVs als unverdächtig durchgeht.
2. Es werden soviele Parameter wie möglich im vornherein ausgelsen und ausgewertet. Denn so gut wie immer kann man sich z.B das Einlesen der Exe von der Platte sparen, wenn man den Anhang einfach richtig an die letze Section dranhängt und ImageSize erhöht - dann kann man den ganzen Anhängsel direkt im Speicher lesen. Dasselbe gilt für ImageSize &Co. Dadurch bleibt der eigentliche "Launchcode" sehr übersichtlich und klein.
3. Natürlich ist der "Launchcode" nicht nur klein, sondern auch komplett adressunabhängig (erst dadurch ist das verzichten auf die "klassische" Exe-Stub möglich. Wie gesagt - Exen sind nur Wirt/Ziel vorhanden+etwas hinzugefügten Code für den Launch)
Dadurch eignet sich dieser auch besonders gut, mit Junkcode vermengt zu werden :D.Und damit meine ich nicht
Sondern:
- 004046D3 55 PUSH EBP
- 004046D4 8BEC MOV EBP,ESP
- 004046D6 2BCD SUB ECX,EBP
- 004046D8 1945 B4 SBB DWORD PTR SS:[EBP-4C],EAX
- 004046DB 85D0 TEST EAX,EDX
- 004046DD 85D5 TEST EBP,EDX
- 004046DF 6A 61 PUSH 61
- 004046E1 83CB DC OR EBX,FFFFFFDC
- 004046E4 83CB EA OR EBX,FFFFFFEA
- 004046E7 85C5 TEST EBP,EAX
- 004046E9 5A POP EDX
- 004046EA 83EA 61 SUB EDX,61
- 004046ED 7D 0F JGE SHORT EBFEsRun.004046FE
- 004046EF 6A 21 PUSH 21
- 004046F1 57 PUSH EDI
- 004046F2 52 PUSH EDX
- 004046F3 6A 2D PUSH 2D
- 004046F5 6A 96 PUSH -6A
- 004046F7 6A 43 PUSH 43
- 004046F9 E8 C4CBFFFF CALL EBFEsRun.004012C2
- 004046FE 83E8 97 SUB EAX,-69
- 00404701 6A 5F PUSH 5F
- 00404703 09D3 OR EBX,EDX
- 00404705 83E3 6C AND EBX,6C
- 00404708 03D8 ADD EBX,EAX
- 0040470A 5E POP ESI
- 0040470B 83CE 5F OR ESI,5F
- 0040470E 79 0F JNS SHORT EBFEsRun.0040471F
- 00404710 6A 41 PUSH 41
- 00404712 53 PUSH EBX
- 00404713 68 C047757C PUSH 7C7547C0
- 00404718 56 PUSH ESI
- 00404719 FF15 A4304000 CALL DWORD PTR DS:[<&user32.wsprintfA>] ; user32.wsprintfA
- 0040471F 031D B8224000 ADD EBX,DWORD PTR DS:[4022B8]
- 00404725 83C6 5D ADD ESI,5D
- 00404728 6A 2A PUSH 2A
- 0040472A 8BC8 MOV ECX,EAX
- 0040472C 83C2 4E ADD EDX,4E
- 0040472F 8BF5 MOV ESI,EBP
- 00404731 5E POP ESI
- 00404732 83EE 2A SUB ESI,2A
- 00404735 73 11 JNB SHORT EBFEsRun.00404748
- 00404737 68 E4F1461E PUSH 1E46F1E4
- 0040473C 6A 90 PUSH -70
- 0040473E 68 8EDE3D88 PUSH 883DDE8E
- 00404743 E8 DACAFFFF CALL EBFEsRun.00401222
- 00404748 BF 0D52A100 MOV EDI,0A1520D
- 0040474D 57 PUSH EDI
- 0040474E 83C6 43 ADD ESI,43
- 00404751 015D BC ADD DWORD PTR SS:[EBP-44],EBX
- 00404754 21F3 AND EBX,ESI
- 00404756 8BC5 MOV EAX,EBP
- 00404758 85F7 TEST EDI,ESI
- 0040475A 03DD ADD EBX,EBP
- 0040475C 83C6 D4 ADD ESI,-2C
- 0040475F 83C8 AA OR EAX,FFFFFFAA
- 00404762 8515 01214000 TEST DWORD PTR DS:[402101],EDX
- 00404768 03DA ADD EBX,EDX
- 0040476A 853D 6C214000 TEST DWORD PTR DS:[40216C],EDI
- 00404770 8BDB MOV EBX,EBX
- 00404772 2305 34234000 AND EAX,DWORD PTR DS:[402334]
- 00404778 850D 9A214000 TEST DWORD PTR DS:[40219A],ECX
- 0040477E 09E1 OR ECX,ESP
- 00404780 0B0D A8204000 OR ECX,DWORD PTR DS:[4020A8]
- 00404786 85CC TEST ESP,ECX
- 00404788 295D D0 SUB DWORD PTR SS:[EBP-30],EBX
- 0040478B 83CF 03 OR EDI,3
- 0040478E 03C0 ADD EAX,EAX
- 00404790 83EF 32 SUB EDI,32
- 00404793 83CA 94 OR EDX,FFFFFF94
- 00404796 215D 88 AND DWORD PTR SS:[EBP-78],EBX
- 00404799 21D0 AND EAX,EDX
- 0040479B 231D 6C214000 AND EBX,DWORD PTR DS:[40216C]
- 004047A1 2BC3 SUB EAX,EBX
- 004047A3 2955 88 SUB DWORD PTR SS:[EBP-78],EDX
- 004047A6 851D 4B204000 TEST DWORD PTR DS:[40204B],EBX
- 004047AC 2155 B8 AND DWORD PTR SS:[EBP-48],EDX
- 004047AF 83E6 9C AND ESI,FFFFFF9C
- 004047B2 8955 C0 MOV DWORD PTR SS:[EBP-40],EDX
- 004047B5 83C3 86 ADD EBX,-7A
- 004047B8 83C0 06 ADD EAX,6
- 004047BB 03F2 ADD ESI,EDX
- 004047BD 83D3 83 ADC EBX,-7D
- 004047C0 5F POP EDI
- 004047C1 4F DEC EDI
- 004047C2 ^ 75 89 JNZ SHORT EBFEsRun.0040474D
- 004047C4 6A 78 PUSH 78
- 004047C6 850D 81214000 TEST DWORD PTR DS:[402181],ECX
- 004047CC 5E POP ESI
- 004047CD 83E6 78 AND ESI,78
- 004047D0 75 0E JNZ SHORT EBFEsRun.004047E0
- 004047D2 6A CC PUSH -34
- 004047D4 56 PUSH ESI
- 004047D5 68 53316DF8 PUSH F86D3153
- 004047DA FF15 24304000 CALL DWORD PTR DS:[<&kernel32.WriteFile>>; kernel32.WriteFile
- 004047E0 83C6 2D ADD ESI,2D
- 004047E3 BB 1B57E000 MOV EBX,0E0571B
- 004047E8 53 PUSH EBX
- 004047E9 1305 C3234000 ADC EAX,DWORD PTR DS:[4023C3]
- 004047EF 09C1 OR ECX,EAX
- 004047F1 03C6 ADD EAX,ESI
- 004047F3 83C2 18 ADD EDX,18
- 004047F6 2BDD SUB EBX,EBP
- 004047F8 83D3 19 ADC EBX,19
- 004047FB 83E6 29 AND ESI,29
- 004047FE 115D 84 ADC DWORD PTR SS:[EBP-7C],EBX
- 00404801 230D 77224000 AND ECX,DWORD PTR DS:[402277]
- 00404807 894D D0 MOV DWORD PTR SS:[EBP-30],ECX
- 0040480A 0155 B8 ADD DWORD PTR SS:[EBP-48],EDX
- 0040480D 2BC3 SUB EAX,EBX
- 0040480F 2945 A0 SUB DWORD PTR SS:[EBP-60],EAX
- 00404812 095D A8 OR DWORD PTR SS:[EBP-58],EBX
- 00404815 8955 B8 MOV DWORD PTR SS:[EBP-48],EDX
- 00404818 851D FB224000 TEST DWORD PTR DS:[4022FB],EBX
- 0040481E 83C9 B6 OR ECX,FFFFFFB6
- 00404821 0B0D 0A234000 OR ECX,DWORD PTR DS:[40230A]
- 00404827 83CE 78 OR ESI,78
- 0040482A 8945 D0 MOV DWORD PTR SS:[EBP-30],EAX
- 0040482D 215D BC AND DWORD PTR SS:[EBP-44],EBX
- 00404830 8945 84 MOV DWORD PTR SS:[EBP-7C],EAX
- 00404833 83EE 57 SUB ESI,57
- 00404836 0155 B0 ADD DWORD PTR SS:[EBP-50],EDX
- 00404839 2335 64204000 AND ESI,DWORD PTR DS:[402064]
- 0040483F 8515 3D234000 TEST DWORD PTR DS:[40233D],EDX
- 00404845 83C6 1D ADD ESI,1D
- 00404848 8515 88214000 TEST DWORD PTR DS:[402188],EDX
- 0040484E 297D C0 SUB DWORD PTR SS:[EBP-40],EDI
- 00404851 85C0 TEST EAX,EAX
- 00404853 5B POP EBX
- 00404854 4B DEC EBX
- 00404855 ^ 75 91 JNZ SHORT EBFEsRun.004047E8
Klar, die Qualität ist nicht sooo toll, aber um diesen Code wirklich programmiertechnisch als Junk zu klassifizieren, muss man sich imho ziemlich anstrengen ;).
Als Bonus: wer das genauer betrachtet, sieht "eingebaute" Schleifen:
z.B 004047E8 bis 00404855 (ist ja nur ein ausschnitt). Es werden mehere Schleifen generiert, die dann eine "Mindestlaufzeit" haben. Da der Code imho schon eine gewisse Qualität hat, wird er von einem AV Code-Emulator eventuell nicht direkt als Junk/Junkschleife erkannt ;).
Im moment bin ich dabei, die richtige decryptroutine in den Junkcode einzubeziehen. Dann generiert jeder Cryptvorgang wirklich eine "unique" Anwendung
Zum Release: es wird erstmal eine Demo geben. Ich überlege es mir noch, das ganze nur für Secondleveluser zugänglich zu machen (einfach weil man von denen nicht per PM mit blöden Fragen ala "mein BIFI wird zerstört!!!" zugepostet wird ).