Extraktion bestimmter Wörter aus .json Dokument

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
apt1978
User
Beiträge: 3
Registriert: Sonntag 13. Juni 2021, 21:58

Hallo zusammen,
ich schreibe hier rein, da ich im Rahmen meiner Forschung zum Thema Malware-Analyse aktuell nicht weiterkomme und zu meinem Problem weder im Internet noch hier im Forum etwas fand. Kurz zusammengefasst, möchte ich eine Malware-Klassifizierung mittels verschiedener Machine Learning Klassifikatoren vornehmen. Die Klassifiikation soll auf N-Grams der API Call Sequenz basieren. Nachdem ich in einem ersten Schritt die Malware habe ausführen können, habe ich nun Logdateien, die aus tausenden solcher Blöcke bestehen:

"category": "file",
"status": 1,
"stacktrace": [],
"api": "NtCreateFile",
"return_value": 0,
"arguments": {
"create_disposition": 1,
"file_handle": "0x00000080",
"filepath": "C:\\Users\\Administrator\\AppData\\Local\\Temp\\vbc.exe",
"desired_access": "0x80100080",
"file_attributes": 0,
"filepath_r": "\\??\\C:\\Users\\Administrator\\AppData\\Local\\Temp\\vbc.exe",
"create_options": 100,
"status_info": 1,
"share_access": 1

Ziel ist nun, für jedes Malware File lediglich die API Calls in einem Dokument zu haben und nicht die ganzen weiteren Informationen wie Status, Arguments etc. Ich denke, dass ein mögliches Vorgehen so wäre: Mittels einer Schleife über die Logdateien iterieren und nur die Zeilen behalten, in denen "api:" steht. Jedoch sollen nur die API Calls selber behalten werden (nicht die ganze Zeile), also in diesem Block wäre das: NtCreateFile. Eine weitere Möglichkeit, die ich mir bezüglich der Umsetzung vorstellen könnte, wäre es ein Dictionary mit allen API Calls zu haben und dann dieses auf die Logdateien so anzuwenden, dass nur noch Wörter, die in dem Dictionary enthalten sind, behalten werden.
Ich hoffe mein Problem ist verständlich und ihr könnt mir bezüglich der Umsetzung mittels Python (bin leider noch nicht so erfahren) helfen bzw. den ein oder anderen Tipp geben.
Besten Dank im Voraus!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, das ist ja nicht die gesamte Datei, da fehlen ja wichtige Zeilen, nämlich die, die das zu gültigem JSON machen, und das ist dann auch die Lösung: nimm den JSON-Parser und such dann den richtigen Schlüssel heraus.
apt1978
User
Beiträge: 3
Registriert: Sonntag 13. Juni 2021, 21:58

Das hat schonmal weitergeholfen, vielen Dank. Nun bekomme ich es hin die Werte auszulesen. Jedoch immer nur an einer Stelle.
Beispiel: print(data["signatures"][3]["marks"][0]["call"]["api"])

Frage ist nun, wie ich nicht einen Wert auslesen kann sondern alle. Also möchte ich alle Werte, die der Schlüssel "api" in der gesamten json enthält. Das ist für mich nicht einfach, da sich die api calls an unterschiedlichen "Tiefen" der Verschachtelung befinden und es viel zu viele sind, um immer den genauen index rauszusuchen. Gibt es da eine Möglichkeit, in der json global alle Einträge beim Schlüssel "api" auf einmal auszulesen?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür benutzt man Rekursion, in dem man alle Liste und Wörterbücher durchgeht.
Antworten