NoFuser, Inline Patching und neuer Partner
Hallo zusammen,
in der Blogroll hat sich ein neue neue Verlinkung eingefügt. Der Blog von Tr4ceflow! Er beschäftigt sich mit nativen RE und krazt dabei nicht nur an der Oberfläche, sondern taucht tiefer ein und deckt weiterführende Themen wie Kryptografie ab. Es gibt eh so wenige (deutsche) Blogs, die sich mit solchen Themen befassen, daher bin ich sehr begeistert, dass die Blogpartnerschaft zu Stande gekommen ist. Schaut mal vorbei, es lohnt sich!
Gestern lief mir eine Binary, gepackt mit Confuser 1.9 und so ziemlich allen Protections über den Weg. Der Code war verschlüsselt und nicht in den Methoden zu finden, die ganzen Funktionsaufrufe durch Proxy-Calls geschützt. Also die perfekte Gelegenheit NoFuser auszuprobieren. Und das Resultat war erstaunlich! Der Coder dieses Tools hat meinen vollen Respekt!
Das eigentliche Programm beendete sich sofort nach dem Programmaufruf, deswegen direkt mal zum EntryPoint gesprungen und dort rumgesucht. Nach ein paar Consolenausgaben war ein einzelnen Call zu finden, der direkt zum Ziel führt:
string a = Class3.smethod_2(Class3.smethod_1("c")); if (a != "105f5cde81c1868f98cf225b10c50f9e") { Environment.Exit(0); } |
smethod2 generiert einen MD5 Hash, smethod1 ruft die VolumeSerialNumber vom Laufwerk C:\ ab, eine typische HWID. Die Protection ist einfach, also warum Reflexil anwerfen und so mit Kanonen auf Spatzen schießen? Zeit für Inline-Patching!
// Method begins at RVA 0x2cd0 // Code size 353 (0x161) // bisschen Code weggeschnitten IL_0020: call void [mscorlib]System.Console::WriteLine(string) IL_0025: ldstr "-----------------------------------" IL_002a: call void [mscorlib]System.Console::WriteLine(string) IL_002f: call void Class3::smethod_0() <====== HWID CHECK IL_0034: ldc.i4.5
Springen wir mit CFF Explorer an den RVA 2cd0 und fügen wir erstmal 0xD Zeichen dazu, um den Methodenheader (meinst 13 Bytes beim Fat Header) zu überspringen. Dann fügen wir 0x2F hinzu und landen so beim RVA 2D0C.
Der Call-Opcode beginnt mit 0×28, der ldstr-Opcode mit 0×72 und der ldc.i4.5 Opcode ist 0x1B. Somit scheinen wir wohl an der richtigen Stelle zu sein. Und das schwarz Markierte ist der Call zu unserer Lizenzcheck-Funktion. Füllen wir diese 5 Byte mit 0×00, so haben wir ein lizenzensiertes Programm.
Mit etwas Übung sind solche Patches leichter und schneller zu vollziehen. Gerade bei Programmen, die nach einem Rebuild den Dienst verweigern, ist Inline-Patching die beste Methode. Und lernt man dabei auch etwas über das .NET Framework
Greez
Welches Programm wird denn hier gepatched und wie bist du auf den NoFuser gekommen? Ich habe von NoFuser jedenfalls noch nicht etwas gehört?
Gruß,
Pain
Darf das Tool selbst leider nicht veröffentlichen, aber ging um einen Exploitfixxer in irgend einem MMORPG.
NoFuser hab ich von BlackStorm, der orignale Thread ist wohl auf Hackforums. Download ist aber in dem o.g. Link zu finden. Greez
Modul.exe:
http://www.files.fm/u/suqqfss
gefunden hier:
http://www.hackerboard.de/cryptography-encryption/48616-bypass-hardwareid-hardwareid-umgehen-entfernen.html
Hey,
Wenn die datei nach dem deobfuscaten den dienst verweigert liegt das daran, dass sie nich vollständig/rixhtig deobfuscated wurde. Razorx hat zwar gute arbeit geleistet, aber sein tool ist auch nicht perfekt. Patchen mit dnlib klappt im.vergleich zu monocecil da besser, da es hier moeglich is, quasi byte patching durch zu fuehren .ps. anmerkung in eigener sache: rtn-team.cc