RCE – SFT Loader 2008 – Teil 1


Manually Unpacking DotFix NiceProtect 3
Vor kurzem erschien der Loader 2008 in der Final (verbuggten) Version. Mit dem Update von 2006 -> 2008 wurde auch der Protector sehr verbessert. Es kommt nicht mehr Yoda’s Protector zum Einsatz, sondern ein anderer auch eher unbekannter Protector mit dem (lustigen) Namen DotFix NiceProtect.

DotFix NiceProtect ist ein kommerzieller Protector ($85 Developer License) mit, im Vergleich zum Yoda’s Protector, sehr viel besseren Schutz-Methoden. Welche Version genau zum Einsatz kommt, kann man nicht genau sagen. Das ist aber auch eher egal, weil ab Version 3 die einzelnen Versionen sich nicht mehr stark unterscheiden.

In diesem ersten Teil beschäftigen wir uns mit dem Original Entry Point (OEP). Bei diesem Protector wurde das OEP, so wie es mal war, komplett auseinander gepflückt. Im der RCE Scene nennt man sowas „Stolen OEP“ oder „Stolen bytes“ oder eben „Virtual machine“ (VM). Auf der Homepage des Protectors kann man dieses Feature genauer nachlesen:
http://niceprotect.com/index.php?p=help/stolen_bytes
http://niceprotect.com/index.php?p=help/virtual_machine
Hört sich im ersten Moment vielleicht schwer an, ist es aber eigentlich nicht ;-)

Für diesen ersten Teil brauchen wir nur OllyDbg und das HideDebugger Plugin. Wie auch bei Yoda benutzen wir nicht alle Features des Plugins. Das Häkchen sollten ihr also nur bei „Unhandled exception tricks“ setzen.
Wenn ihr den Leecher in Olly reinladet, werdet ihr vielleicht den Error „Bad or unknown format….“ bekommen. Macht aber nichts einfach OK klicken.
Zurerst kümmern wir uns wieder um die Anti-Debug Tricks.

IsDebuggerPresent
Um die API zu finden benutzen wird das Go to -> Expression (STRG+G) Feature in Olly. Einfach die API eingeben und wir landen bei ihr. Wie schon bei Yoda, NOP’en wir alles bis zum RETN und schreiben „MOV EAX, 0“ rein. Klick

FindWindowA
Diese API wird benutzt um das OLLYDBG Fenster zu finden. Wir gehen zu der API und setzen ein Breakpoint an den Anfang. Wir starten den Leecher (F9) und sollten in der API halten. Wir sehen unten rechts im Stack auch den Namen OLLYDBG -> Debugger check Klick. Wir steppen bis zum RETN durch (F8) und verändern den EAX Wert auf Null (Einfach Doppelklick rechts oben auf den EAX Wert). Danach entfernen wir den Breakpoint von der API.

Virtual Machine Anfang finden
Es gibt viele Möglichkeiten wie man den VM Anfang finden kann. Unser Loader benutzt in dem ersten CALL die API GetModuleHandleA und dies Nutzen wir einfach aus. Wir gehen also zu der API GetModuleHandleA und setzen ein Breakpoint Klick. Wir starten wieder den Loader (F9) und halten wie erwartet in der API. Wir steppen durch (F8). Nach dem RETN laden wir in dem leecher Code Klick. Genauer gesagt in dem 1. CALL nach dem OEP Anfang. Wir setzen ein Breakpoint auf das nächste RETN (bei 00407248) und starten wieder mit F9. Sollte bei euch ein „Exception“ auftauchen, einfach mit SHIFT+F9 ignorieren. Wir halten am RETN Klick und steppen auch noch eins weiter. Schon sind wir in dem VM Code (bei 00B3780B). Kein schöner Anblick, weil alles obfuscated wurde. Wir steppen durch mit „step into“ (F7) bis wir folgende Stelle erreichen:
00B37991 PUSH leecher.0061326D
00B37996 RETN

PUSH + RETN = wie ein JMP nach 61326D. Genau da wollten wir hin. Bei 61326D fängt die Virtual Machine an. Wir gehen nach 61326D (einfach weitersteppen) und setzen ein Hardware Breakpoint. Nun starten wir die leecher.exe neu (Anti-Debug Checks wieder ausschalten) und wir halten im Hardware Breakpoint bei 61326D.

OEP Code finden
Wir sind am Anfang der VM und müssen jetzt die OEP Commands finden, die der Protector gestohlen hat. Als erstes setzen wir 4 Breakpoints, so wie auf dem Screenshot. Danach leecher starten und wir halten im 4. JMP von oben gesehen. Wir steppen durch bis:
0061414F MOV EAX,DWORD PTR SS:[EBP-C]
00614152 JMP leecher.0061327E

Klick Hier steht jetzt schon unser erster OEP Befehl: MOV EAX, Value. Den Wert könnt ihr unten ablesen:
Stack SS:[0012FF80]=0059B2D0 (leecher.0059B2D0)
EAX=00000000

Unser OEP Befehl lautet also: MOV EAX, 0059B2D0
Natürlich ist das nicht der allererste OEP Befehl. Wer weiss wie ein Delphi OEP aussieht wird auch keine Probleme haben die vorherigen Befehle zu erraten, unser OEP sieht bisher so aus:
PUSH EBP
MOV EBP,ESP
ADD ESP,-10
MOV EAX,59B2D0

Weiter geht es mit der VM. Wir führen die EXE wieder aus und landen im 1. JMP von oben. Wir steppen wieder durch mit F7. Nach diesem Sprung: 0061334B JMP DWORD PTR SS:[EBP-8] landen wir wieder in schönem unleserlichen Code… macht aber nichts. Wir steppen fröhlich weiter bis wir zu diesen PUSHs kommen:

00B377FA PUSH leecher.00B3780B
00B37802 PUSH leecher.00407208
00B3780A RETN

Was will uns das hier sagen? Ganz einfach hier sehen wir einen CALL. Zuerst wird die Rücksprungadresse in den Stack gepusht: 00B3780B, danach wird die Sprungadresse gepusht: 00407208 und schliesslich wird mit dem RETN zu der Adresse gesprungen. Übersetzt heisst das: CALL 00407208. Das ist also der nächste OEP Code. Unser OEP sieht jetzt so aus:
PUSH EBP
MOV EBP,ESP
ADD ESP,-10
MOV EAX,59B2D0
CALL 00407208

Wir setzen ein Breakpoint auf die Rücksprungadresse 00B3780B, damit wir nicht in den leecher code reinmüssen, und starten F9 (Falls exception: shift+F9) und landen in dem gesetzten BP. Wir steppen weiter im Code. Plötzlich sehen wir sowas:
00B378F1 MOV EAX,DWORD PTR DS:[5A4D08]
00B378F6 PUSH EAX
00B378F7 PUSH ECX

Und haben schon den nächsten OEP Befehl gefunden. Danach kommt nichts mehr wichtiges ausser natürlich der PUSH+RETN der wieder zum VM Anfang springt. F9 und wir landen im 3. JMP von oben. Durchsteppen und OEP Code aufschreiben:
00613B4C MOV EAX,DWORD PTR DS:[EAX]

Ich könnt jetzt noch 1000 Wörter weiterlabbern, aber ich will euch nicht langweilen. Ihr müsst natürlich jeden OEP Befehl so suchen wie oben beschrieben. Die 4 Jumps am Anfang der VM sind eine sehr guten Orientierungshilfe, also immer schön die BP gesetzt lassen. Am besten wäre es wenn man sich ein Script schreibt, dass alles automatisch macht. Das fertige OEP sieht dann so aus:

PUSH EBP
MOV EBP,ESP
ADD ESP,-10
MOV EAX,0059B2D0
CALL 00407208
MOV EAX,DWORD PTR DS:[5A4D08]
MOV EAX,DWORD PTR DS:[EAX]
CALL 00473974
MOV ECX,DWORD PTR DS:[5A4C5C]
MOV EAX,DWORD PTR DS:[5A4D08]
MOV EAX,DWORD PTR DS:[EAX]
MOV EDX,DWORD PTR DS:[593F6C]
CALL 0047398C
MOV EAX,DWORD PTR DS:[5A4C5C]
MOV EAX,DWORD PTR DS:[EAX]
MOV EDX,DWORD PTR DS:[5A4D08]
MOV EDX,DWORD PTR DS:[EDX]
MOV DWORD PTR DS:[EDX+0EC],EAX
MOV DWORD PTR DS:[EDX+0E8],00598660
MOV EAX,DWORD PTR DS:[5A4D08]
MOV EAX,DWORD PTR DS:[EAX]
MOV EDX,0059BF08
CALL 00473454
MOV EAX,DWORD PTR DS:[5A4D08]
MOV EAX,DWORD PTR DS:[EAX]
CALL 00473A0C
CALL 004049F4

Das OEP hätten wir also schon erfolgreich wiederhergestellt. Jetzt fehlt noch ein Dump und die IAT und mit „Stolen Functions“ müssen wir uns auch noch rumschlagen.

Seid gespannt auf Teil 2 :-) oder arbeitet schon mal vor…

Ein Gedanke zu „RCE – SFT Loader 2008 – Teil 1“

  1. Pingback: SFT Decrypter 2009

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *