Heim  >  Artikel  >  Backend-Entwicklung  >  Wie Python Malware identifiziert

Wie Python Malware identifiziert

WBOY
WBOYnach vorne
2023-05-09 13:28:321148Durchsuche

01 Microsoft Windows Portable Executable File Format

Um eine statische Analyse von Malware durchzuführen, müssen Sie das Windows PE-Dateiformat verstehen, das die Struktur heutiger Windows-Programmdateien wie .exe, .dll und .sys beschreibt und definiert die Art und Weise, wie sie Daten speichern. PE-Dateien enthalten x86-Anweisungen, Daten wie Bilder und Text sowie Metadaten, die für die Ausführung des Programms erforderlich sind.

Das PE-Format wurde ursprünglich für die Durchführung der folgenden Vorgänge entwickelt.

1) Teilen Sie Windows mit, wie ein Programm in den Speicher geladen werden soll.

Das PE-Format beschreibt, welche Blöcke der Datei wo in den Speicher geladen werden sollen. Außerdem erfahren Sie, wo im Programmcode Windows mit der Ausführung des Programms beginnen soll und welche dynamisch verknüpften Codebibliotheken in den Speicher geladen werden sollen.

2) Stellen Sie dem laufenden Programm Medien (oder Ressourcen) zur Verfügung, die während der Ausführung verwendet werden können.

Diese Ressourcen können Zeichenfolgen umfassen, z. B. Zeichenfolgen für GUI-Dialogfelder oder Konsolenausgaben, sowie Bilder oder Videos.

3) Stellen Sie Sicherheitsdaten wie digitale Codesignaturen bereit.

Windows verwendet diese Sicherheitsdaten, um sicherzustellen, dass der Code aus einer vertrauenswürdigen Quelle stammt. Das

PE-Format erfüllt die oben genannte Aufgabe, indem es eine Reihe von Strukturen verwendet, die in Abbildung 1-1 dargestellt sind.

Wie Python Malware identifiziert

▲ Abbildung 1-1 PE-Dateiformat

Wie in Abbildung 1-1 dargestellt, enthält das PE-Dateiformat eine Reihe von Headern, die dem Betriebssystem mitteilen, wie das Programm in den Speicher geladen werden soll. Es enthält außerdem eine Reihe von Abschnitten, die die eigentlichen Programmdaten enthalten. Windows lädt diese Abschnitte in den Speicher, sodass ihre Offsets im Speicher der Stelle entsprechen, an der sie auf der Festplatte erscheinen.

Lassen Sie uns diese Dateistruktur genauer untersuchen, beginnend mit dem PE-Header. Wir überspringen die Diskussion des DOS-Headers, der ein Überbleibsel aus dem Microsoft-DOS-Betriebssystem der 1980er Jahre ist und ausschließlich aus Kompatibilitätsgründen existiert.

1. PE-Header

Wie unten in Abbildung 1-1 gezeigt, befindet sich über dem DOS-Header ❶ der PE-Header ❷, der die allgemeinen Eigenschaften des Programms definiert, wie z. B. Binärcode, Bilder, komprimierte Daten und andere Programmeigenschaften. Außerdem erfahren wir, ob das Programm für 32-Bit- oder 64-Bit-Systeme konzipiert ist. Der

PE-Header bietet grundlegende, aber nützliche Kontextinformationen für Malware-Analysten. Der Header enthält beispielsweise ein Zeitstempelfeld, das den Zeitpunkt angibt, zu dem der Malware-Autor die Datei kompiliert hat. Normalerweise ersetzen Malware-Autoren dieses Feld durch einen falschen Wert, aber manchmal vergessen Malware-Autoren, es zu ersetzen, und das passiert.

2. Optionale Header

Optionale Header ❸ sind in heutigen PE-Programmen praktisch allgegenwärtig, genau das Gegenteil von dem, was ihr Name andeutet. Es definiert den Ort des Programmeinstiegspunkts in der PE-Datei, der sich auf die erste Anweisung bezieht, die nach dem Laden des Programms ausgeführt wird.

Es definiert auch die Größe der Daten, die Windows in den Speicher lädt, wenn PE-Dateien, Windows-Subsysteme, Zielprogramme (z. B. Windows-GUI oder Windows-Befehlszeile) und andere allgemeine Details zum Programm geladen werden. Da der Einstiegspunkt des Programms dem Reverse Engineer mitteilt, wo er mit dem Reverse Engineering beginnen soll, sind diese Header-Informationen für den Reverse Engineer äußerst wertvoll.

3. Abschnittsüberschrift

Die Abschnittsüberschrift ❹ beschreibt die in der PE-Datei enthaltenen Datenabschnitte. Ein Abschnitt in einer PE-Datei ist ein Datenelement, das in den Speicher abgebildet wird, wenn das Betriebssystem ein Programm lädt, oder der Anweisungen zum Laden des Programms in den Speicher enthält.

Mit anderen Worten, ein Abschnitt ist eine Folge von Bytes auf der Festplatte, die entweder zu einer Folge zusammenhängender Bytes im Speicher wird oder das Betriebssystem über einen Aspekt des Ladevorgangs informiert.

Die Abschnittsüberschrift teilt Windows auch mit, welche Berechtigungen dem Abschnitt gewährt werden sollen, z. B. ob er lesbar, beschreibbar oder ausführbar sein soll, wenn das Programm ausgeführt wird. Beispielsweise werden .text-Abschnitte, die x86-Code enthalten, häufig als lesbar und ausführbar, aber nicht als beschreibbar markiert, um zu verhindern, dass sich der Programmcode während der Ausführung versehentlich selbst ändert.

Abbildung 1-1 zeigt viele Abschnitte, wie z. B. .text und .rsrc. Wenn PE-Dateien ausgeführt werden, werden sie im Speicher abgebildet. Andere spezielle Abschnitte wie der .reloc-Abschnitt werden nicht im Speicher abgebildet und wir werden diese Abschnitte ebenfalls besprechen. Sehen wir uns die Abschnitte in Abbildung 1-1 an.

1) .text-Abschnitt

Jedes PE-Programm enthält mindestens einen Abschnitt von x86-Code, der in seiner Abschnittsüberschrift als ausführbar markiert ist; diese Abschnitte tragen fast immer den Namen .text❺.

2).idata-Abschnitt

.idata-Abschnitt❻, auch Importabschnitt genannt, enthält die Importadresstabelle (IAT), die dynamische Linkbibliotheken und ihre Funktionen auflistet. Der IAT ist eine der wichtigsten PE-Strukturen, die bei der ersten Analyse einer PE-Binärdatei berücksichtigt werden sollten, da er auf die vom Programm aufgerufenen Bibliotheken hinweist, die wiederum die erweiterten Funktionen der Malware offenbaren können.

3) Datenabschnitt

Der Datenabschnitt in der PE-Dateistruktur kann Abschnitte wie .rsrc, .data und .rdata enthalten, in denen Mauszeigerbilder, Schaltflächensymbole, Audio und andere vom Programm verwendete Medien gespeichert werden. Beispielsweise enthält der Abschnitt .rsrc in Abbildung 1-1 druckbare Zeichenfolgen, die das Programm verwendet, um Text als Zeichenfolge darzustellen.

Die Informationen im Abschnitt

.rsrc (Ressourcen) sind für Malware-Analysten sehr wichtig, da sie durch die Untersuchung druckbarer Zeichenfolgen, grafischer Bilder und anderer Assets in PE-Dateien wichtige Hinweise auf die Funktionalität der Datei gewinnen können.

In Abschnitt 03 erfahren Sie, wie Sie mit dem icoutils-Toolkit (einschließlich icotool und wrestool) grafische Bilder aus dem Ressourcenabschnitt einer Malware-Binärdatei extrahieren. Anschließend erfahren Sie in Abschnitt 04, wie Sie druckbare Zeichenfolgen aus Malware-Ressourcenabschnitten extrahieren.

4).reloc-Abschnitt

Der Code der PE-Binärdatei ist nicht positionsunabhängig, was bedeutet, dass er nicht korrekt ausgeführt wird, wenn er vom erwarteten Speicherort an einen neuen Speicherort verschoben wird. .reloc❽ löst dieses Problem, indem es das Verschieben von Code ermöglicht, ohne ihn zu beschädigen.

Wenn der Code einer PE-Datei verschoben wurde, weist es das Windows-Betriebssystem an, die Speicheradresse im Code der Datei zu übersetzen, damit der Code weiterhin korrekt ausgeführt werden kann. Diese Konvertierungen umfassen typischerweise das Addieren oder Subtrahieren von Offsets zu Speicheradressen.

02 Pefile zum Parsen des PE-Dateiformats verwenden

Das von Ero Carerra geschriebene und gepflegte Python-Modul pefile hat sich zu einer branchenüblichen Malware-Analysebibliothek zum Parsen von PE-Dateien entwickelt. In diesem Abschnitt zeige ich Ihnen, wie Sie pefile zum Parsen von ircbot.exe verwenden. In der Codeauflistung 1-1 wird davon ausgegangen, dass sich ircbot.exe bereits in Ihrem aktuellen Arbeitsverzeichnis befindet.

Geben Sie den folgenden Befehl ein, um die Pefile-Bibliothek zu installieren, damit wir sie in Python importieren können:

$ pip install pefile

Starten Sie nun Python mit dem Befehl in Listing 1-1, importieren Sie das Pefile-Modul und verwenden Sie dann Pefile, um es zu öffnen und zu analysieren PE-Datei ircbot.exe .

  • Codeliste 1-1 Laden Sie das Pefile-Modul und analysieren Sie die PE-Datei (ircbot.exe)

$ python >>> import pefile >>> pe = pefile.PE("ircbot.exe")

Wir instanziieren pefile.PE, die vom PE-Modul implementierte Kernklasse. Es analysiert PE-Dateien, damit wir ihre Eigenschaften anzeigen können. Durch Aufrufen des PE-Konstruktors laden und analysieren wir die angegebene PE-Datei, in diesem Fall ircbot.exe. Nachdem wir diese Datei nun geladen und analysiert haben, führen Sie den Code in Listing 1-2 aus, um die Informationen aus dem PE-Feld von ircbot.exe zu extrahieren.

  • Codeauflistung 1-2 Durchläuft die Abschnitte der PE-Datei und druckt Informationen darüber aus.

#基于 Ero Carrera的示例代码(pefile库的作者) for section in pe.sections:   print(section.Name, hex(section.VirtualAddress),     hex(section.Misc_VirtualSize), section.SizeOfRawData)
  • Codeauflistung 1-3 zeigt, wie der Ausdruck aussieht.

Codeauflistung 1-3 Verwendung des Pefile-Moduls von Python zum Extrahieren von Abschnittsdaten aus ircbot.exe

Wir haben Daten aus fünf verschiedenen Abschnitten der PE-Datei extrahiert: .text, .rdata, .data, .idata und .reloc. Die Ausgabe erfolgt in Form eines Fünffachs, ein Element für jeden extrahierten PE-Abschnitt. Der erste Eintrag in jeder Zeile identifiziert den PE-Abschnitt. (Sie können die Reihe von \x00-Nullbytes ignorieren, bei denen es sich lediglich um leere Zeichenfolgenabschlusszeichen im C-Stil handelt.) Die verbleibenden Felder geben an, wie hoch die Speichernutzung jedes Abschnitts ist, sobald er in den Speicher geladen wird, und wo er sich im Speicher befindet wird nach dem Laden gefunden.

Zum Beispiel ist 0x1000❶ die Basisadresse des virtuellen Speichers, in die diese Abschnitte geladen werden, was auch als Basisspeicheradresse des Abschnitts betrachtet werden kann. Der Wert 0x32830❷ im Feld „Virtuelle Größe“ gibt die Speichergröße an, die nach dem Laden des Abschnitts erforderlich ist. 207360❸ im dritten Feld gibt die Datenmenge an, die dieser Abschnitt in diesem Speicherblock belegen wird.

Zusätzlich zur Verwendung von pefile zum Parsen der Programmabschnitte können wir es auch verwenden, um die DLL-Dateien aufzulisten, die die Binärdatei lädt, und die Funktionsaufrufe, die sie in diesen DLL-Dateien anfordert. Dies erreichen wir durch Spiegelung (Dumping) des IAT der PE-Datei. Codeauflistung 1-4 zeigt, wie die Pefile zum Spiegeln des IAT von ircbot.exe verwendet wird.

  • Codeauflistung 1-4 Importinformationen aus ircbot.exe extrahieren

$ python pe = pefile.PE("ircbot.exe") for entry in pe.DIRECTORY_ENTRY_IMPORT:     print entry.dll     for function in entry.imports:         print '\t', function.name

Codeauflistung 1-4 generiert die in Codeauflistung 1-5 gezeigte Ausgabe (die Ausgabe wurde der Kürze halber gekürzt).

  • Codeauflistung 1-5 Der Inhalt der IAT-Tabelle von ircbot.exe, die die von dieser Malware verwendeten Bibliotheksfunktionen zeigt für die Malware Die Analyse ist wertvoll, da sie Malware-Deklarationen und eine Vielzahl von Funktionen auflistet, auf die verwiesen wird.

    Zum Beispiel sagen uns die ersten paar Zeilen der Ausgabe, dass die Malware WriteFile❶ verwendet, um in die Datei zu schreiben, CreateFileA❷, um die Datei zu öffnen, und CreateProcessA❸, um einen neuen Prozess zu erstellen. Dabei handelt es sich lediglich um grundlegende Informationen über die Malware, sie sind jedoch ein erster Schritt, um ihr detaillierteres Verhalten zu verstehen.
03 Untersuchen Sie das Malware-Image
Wie Python Malware identifiziert Um zu verstehen, wie die Malware ihr Ziel austricksen soll, schauen wir uns die Symbole im .rsrc-Abschnitt an. Beispielsweise werden Malware-Binärdateien häufig dazu entwickelt, Symbole häufig verwendeter Software wie Word-Dokumente, Spieleinstallationsprogramme, PDF-Dateien usw. zu verschleiern, um Benutzer dazu zu verleiten, darauf zu klicken.

你还可以在恶意软件中找到攻击者自己感兴趣程序中的图像,例如攻击者为远程控制受感染机器而运行的网络攻击工具和程序。

回到我们的样本图像分析,你可以在本文的数据目录中找到名为fakepdfmalware.exe的这个恶意软件样本。这个样本使用Adobe  Acrobat图标诱骗用户认为它是一个Adobe Acrobat文档,而实际上它是一个恶意的PE可执行文件。

在我们使用Linux命令行工具wrestool从二进制文件fakepdfmalware.exe中提取图像之前,我们首先需要创建一个目录来保存我们将提取的图像。代码清单1-6显示了如何完成所有这些操作。

  • 代码清单1-6 从恶意软件样本中提取图像的Shell命令

$ mkdir images $ wrestool -x fakepdfmalware.exe -output=images $ icotool -x -o images images/*.ico

我们首先使用mkdir  images创建一个目录来保存提取的图像。接下来,我们使用wrestool从fakepdfmalware.exe中提取图像资源(-x)到/images目录,然后使用icotool提取(-x)并将Adobe中.ico图标格式中的所有资源转换(-o)为.png图形,以便我们可以使用标准的图像浏览工具查看们。

如果你的系统上没有安装wrestool,你可以从这里下载:

http://www.nongnu.org/icoutils/

一旦你使用wrestool将目标可执行文件中的图像转换为PNG格式,你就可以在你喜欢的图像浏览工具中打开它们,并以各种分辨率查看Adobe  Acrobat图标。

正如我在这里给出的例子所示,从PE文件中提取图像和图标相对简单,可以快速显示与恶意软件二进制文件相关的有趣且又有用的信息。同样地,我们可以轻松地从恶意软件中提取可打印字符串来获取更多信息,我们接下来会做这项工作。

04 检查恶意软件的字符串

字符串是程序二进制文件中可打印字符的序列。恶意软件分析师通常依赖恶意样本中的字符串来快速了解其中可能发生的情况。这些字符串通常包含下载网页和文件的HTTP和FTP命令,用于告诉你恶意软件连接到的地址的IP地址和主机名等类似信息。

有时,即使用于编写字符串的语言也有可能暗示恶意软件二进制文件的来源国,尽管这可能是伪造的。你甚至可以在一个字符串中找到一些文本,它们用网络用语解释了恶意二进制文件的用途。

字符串还可以显示有关二进制文件的更多技术信息。例如,你可能会发现有关用于创建二进制文件的编译器、编写二进制文件所使用的编程语言、嵌入式脚本或HTML等信息。

虽然恶意软件作者可以对所有这些痕迹进行混淆、加密和压缩等处理,但是即便是高水平的恶意软件作者也经常会暴露并留下一些痕迹,因此在分析恶意软件时,对镜像的字符串进行细致检查显得尤为重要。

1. 使用字符串程序

查看文件中所有字符串的标准方法是使用命令行工具strings,按照以下语法进行使用:

$ strings filepath | less

该命令将文件中的所有字符串逐行打印到终端上。在末尾添加 |  less可以防止字符串在终端上跨屏显示。默认情况下,strings命令查找所有最小长度为4字节的可打印字符串,但是你可以设置不同的最小长度并更改“命令手册”中所列各种其他参数。

我建议只使用默认的最小字符串长度4,但是你可以使用-n选项更改最小字符串长度。例如,“string -n 10  filepath”只提取最小长度为10字节的字符串。

2. 分析镜像字符串

现在我们镜像了一个恶意软件程序的可打印字符串,但是挑战在于要理解这些字符串的含义。例如,假设我们将ircbot.exe中的字符串镜像到ircbotstring.txt文件中,这在本文前面的内容中,我们使用pefile库已经进行了探讨,如下所示:

$ strings ircbot.exe > ircbotstring.txt

ircbotstring.txt的内容包含数千行文本,但其中一些行应该突出显示出来。例如,代码清单1-7显示了从字符串镜像中提取出来的一串以单词DOWNLOAD开头的行。

  • 代码清单1-7 显示恶意软件可以将攻击者指定的文件下载到目标计算机的字符串输出

Wie Python Malware identifiziert

这些行表示ircbot.exe将尝试把攻击者指定的文件下载到目标计算机上。

我们来尝试分析另一个。代码清单1-8所示的字符串镜像表明ircbot.exe可以起到Web服务器的作用,在目标机器上侦听来自攻击者的连接。

  • Codeauflistung 1-8 zeigt, dass die Malware über eine Zeichenfolgenausgabe eines HTTP-Servers verfügt, mit dem der Angreifer eine Verbindung herstellen kann.

Wie Python Malware identifiziert

Codeauflistung 1-8 zeigt die verschiedenen Komponenten, die von ircbot.exe verwendet werden Implementieren Sie das HTTP-Boilerplate-Programm des HTTP-Servers. Dieser HTTP-Server könnte es einem Angreifer ermöglichen, über HTTP eine Verbindung zum Zielcomputer herzustellen, um Befehle zu erteilen, beispielsweise einen Screenshot des Desktops des Opfers zu erstellen und ihn an den Angreifer zurückzusenden.

Wir sehen in der gesamten Codeliste Hinweise auf HTTP-Funktionalität. Zum Beispiel die GET-Methode ❶, die Daten von einer Internetressource anfordert. HTTP/1.0 200 OK❷Diese Zeile ist eine HTTP-Zeichenfolge, die den Statuscode 200 zurückgibt, was angibt, dass HTTP-Netzwerktransaktionen gut laufen, und Server:myBot❸ gibt an, dass der Name des HTTP-Servers myBot ist, bei dem es sich um einen integrierten HTTP-Server handelt, mit dem er verbunden ist ircbot.exe.

All diese Informationen helfen dabei, bestimmte Malware-Beispiele oder böswillige Aktivitäten zu verstehen und zu blockieren. Wenn Sie beispielsweise wissen, dass ein Malware-Beispiel über einen HTTP-Server verfügt, der beim Herstellen einer Verbindung eine bestimmte Zeichenfolge ausgibt, können Sie Ihr Netzwerk scannen, um infizierte Hosts zu identifizieren.

Das obige ist der detaillierte Inhalt vonWie Python Malware identifiziert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen