Laden...

Analyse einer .Net/CLR basierten Malware

Erstellt von gelöschtem Konto vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.088 Views
Gelöschter Account
vor 9 Jahren
Analyse einer .Net/CLR basierten Malware

Hallo Community,

Ich bin gerade dabei eine Schadsoftware zu untersuchen die einen besonderen Trick drauf hat und um den eigentlichen Kern des Codes vor den Augen anderer zu verbergen.

Grob gesagt führt die Malware ein festes byte Array mit das bösärtigen Code enthält. Dieses wird nun in einen Speicherbereich kopiert wird der vorher mittels der API Funktion VirtualAlloc reserviert wurde. Anschliessend wird sich ein Methodenzeiger auf den Speicherbereich besorgt und ausgeführt.

Das ganze sieht in etwa wie folgt aus.


public delegate void CallerDelegate();

private static void Main()
{
   byte[] fixedArray = new byte[]{11,24,13,4,6,...} // 4274 insgesamt
   IntPtr handleMemory = VirtualAlloc(IntPtr.Zero, 65536u, 4096u, 64u);
   Marshal.Copy(fixedArray, 0, handleMemory, 4274);
   CallerDelegate malicousMethod = (CallerDelegate)
   Marshal.GetDelegateForFunctionPointer(intPtr, typeof(CallerDelegate));
   malicousMethod(); // das wars... 
}

(Natürlicht nicht der Originalcode, dieser enthält jede Menge Nebelkerzen und wurde durch einen Obfuscator geschickt.)

Mir gelingt es derzeit nicht den Code im fixen byte Array lesbar zu machen. Ich gehe dabei im Moment davon aus das es sich um nativen IL Code handelt der mittels der Methode MethodBody.GetILAsByteArray in ein byte Array gewandelt wurde. (Evtl. ist diese Annahme jedoch falsch?) Diese Byte Sequenz in irgendeiner Form zurück zu transformieren(egal in was, IL String, AST, MethodInfo, etc.) ist jedoch scheinbar unmöglich. Die gängigen Decompiler schlucken nur ganze Assemblies, die Framework Methoden brauchen mitgelieferte Typeninformationen und Mono.Cecil ist dazu scheinbar auch nicht in der Lage. Sieht noch jemand einen Weg wie ich den Inhalt dieses byte Arrays freilegen kann ohne einen ganz neuen Dissambler zu schreiben?

1.346 Beiträge seit 2008
vor 9 Jahren

Das ist kein IL, sondern Machinencode der da drin steht. Da musst du einen x86 Disassembler bemühen.

LG pdelvo

Gelöschter Account
vor 9 Jahren

Das war auch mein erster Ansatz/Gedanke. Der Dump des byte Arrays hat aber keine brauchbaren Daten für meinen Dissambler ergeben(ich nutze IDA) Wie gesagt, sicher bin ich mir in der Frage aber tatsächlich nicht. Bist du dir sicher das IL Code hier definitiv ausscheidet also nicht funktionieren würde? (Wenn nicht, würde ich das morgen einfach mal selbst ausprobieren, schon allein aus Interesse)

1.346 Beiträge seit 2008
vor 9 Jahren

Ja ich bin mir da sicher. Ich hab vor Jahren mal kurz damit rumgespielt. Man kann so nativen Machinencode ausführen. Bei Aufruf des delegates wird einfach an den Anfang des Speicherbereiches gesprungen und ausgeführt. Ist es vielleicht 64bit Code?

Gelöschter Account
vor 9 Jahren

Ja wie das funktioniert war mir klar ^^. (Und vor allem welche Probleme dadurch entstehen...)

Ich habe sowohl 32Bit als auch das 64Bit Profil für den 8086 Prozessor probiert. Das Ergebniss war das gleiche. Evtl. ist mein Dissambler mit einzelnen Code Snippets einfach überfordert. 2. Möglichkeit ist das ich was übersehen habe, ich habe diese letzte Methode auf meinen Systemen bisher nie zur Ausführung gebracht. Evtl. habe ich beim entfernen des Fake Codes der sich sicher ständig verändert und Anti-Viren Datenbanken täuschen soll, vielleicht etwas zu viel entfernt. Ich glaube es zwar nicht aber ich sollte mal in einer VM testen ob der bösartige Code so überhaupt läuft und ich nicht einer Fata Morgana hinterher renne. (Wär auch nicht mein erster Schadcode der von Anfang an nicht läuft(

BTW: Wen's interessiert, es handelt sich bei der Schadsoftware um Tribalism

1.346 Beiträge seit 2008
vor 9 Jahren

Ich habe gerade ODA - The Online Disassembler gefunden der wohl einzelne Anweisungen ohne Dateiheader dekompilieren können soll. Die Frage ist dann ob man mit dem Assember weiterkommt

3.825 Beiträge seit 2006
vor 9 Jahren

Hallo Sebastian,

bist Du sicher dass die Werte im Array der ausführbare Code sind ?

Kann es sein dass die Werte vor dem Speichern oder vor dem Ausführen noch arithmetisch irgendwie verändert werden ?

Nur so ein Verdacht.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Sebastian.Lange,

ich gehe ebenfalls davon aus, dass die Bytefolge in dem Array verschlüsselt oder wie BerndFFm es ausdrückt "arithmetisch irgendwie verändert" ist. Ich denke, darin liegt gerade der Sinn der ganzen Aktion. Wenn ein Anti-Viren-Hersteller eine Signatur gefunden hat, an das Byte-Array sicher erkannt werden kann, muss der Angreifer nur den Schlüssel verändern und schon stimmt das Byte-Array nicht mehr mit der Signatur in dem Antiviren-Programmen überein. Bzw. muss ein Anti-Viren-Programm für jeden Schlüssel ein neue Signatur enthalten, die ja alle erstmal gefunden werden sein wollen.

herbivore