Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Analyse einer .Net/CLR basierten Malware
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1201

Themenstarter:

Analyse einer .Net/CLR basierten Malware

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von user8744 am .
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1407

beantworten | zitieren | melden

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

LG pdelvo
private Nachricht | Beiträge des Benutzers
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1201

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1407

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1201

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von user8744 am .
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1407

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3795
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers