Maison  >  Article  >  développement back-end  >  Comment Python identifie les logiciels malveillants

Comment Python identifie les logiciels malveillants

WBOY
WBOYavant
2023-05-09 13:28:321209parcourir

01 Format de fichier exécutable portable Microsoft Windows

Pour effectuer une analyse statique des logiciels malveillants, vous devez comprendre le format de fichier Windows PE, qui décrit la structure des fichiers de programme Windows actuels tels que .exe, .dll et .sys, et définit la façon dont ils stockent les données. Les fichiers PE contiennent des instructions x86, des données telles que des images et du texte, ainsi que des métadonnées nécessaires à l'exécution du programme.

Le format PE a été initialement conçu pour effectuer les opérations suivantes.

1) Indiquez à Windows comment charger un programme en mémoire

Le format PE décrit quels blocs du fichier doivent être chargés en mémoire et où. Il vous indique également où dans le code du programme Windows doit commencer à exécuter le programme et quelles bibliothèques de codes liées dynamiquement doivent être chargées en mémoire.

2) Fournissez au programme en cours d'exécution des médias (ou des ressources) qui peuvent être utilisés pendant l'exécution

Ces ressources peuvent inclure des chaînes, telles que des chaînes pour les boîtes de dialogue de l'interface graphique ou la sortie de la console, ainsi que des images ou des vidéos.

3) Fournissez des données de sécurité telles que des signatures de code numérique

Windows utilise ces données de sécurité pour garantir que le code provient d'une source fiable.

Le format PE accomplit le travail ci-dessus en utilisant une série de structures illustrées à la figure 1-1.

Comment Python identifie les logiciels malveillants

▲ Figure 1-1 Format de fichier PE

Comme le montre la figure 1-1, le format de fichier PE comprend une série d'en-têtes qui indiquent au système d'exploitation comment charger le programme en mémoire. Il contient également une série de sections contenant les données réelles du programme. Windows charge ces sections en mémoire afin que leurs décalages en mémoire correspondent à l'endroit où elles apparaissent sur le disque.

Explorons cette structure de fichier plus en détail, en commençant par l'en-tête PE. Nous passerons la discussion sur l'en-tête DOS, qui est un vestige du système d'exploitation Microsoft DOS des années 1980 et existe uniquement pour des raisons de compatibilité.

1. En-tête PE

Comme le montre le bas de la figure 1-1, au-dessus de l'en-tête DOS ❶ se trouve l'en-tête PE ❷, qui définit les propriétés générales du programme, telles que le code binaire, les images, les données compressées. et d'autres propriétés du programme. Il nous indique également si le programme est conçu pour les systèmes 32 bits ou 64 bits.

L'en-tête PE fournit des informations contextuelles basiques mais utiles pour les analystes de logiciels malveillants. Par exemple, l’en-tête comprend un champ d’horodatage qui indique l’heure à laquelle l’auteur du logiciel malveillant a compilé le fichier. Habituellement, les auteurs de logiciels malveillants remplacent ce champ par une fausse valeur, mais parfois les auteurs de logiciels malveillants oublient de le remplacer et cela se produit.

2. En-têtes facultatifs

Les en-têtes facultatifs ❸ sont pratiquement omniprésents dans les exécutables PE d'aujourd'hui, exactement le contraire de ce que leur nom implique. Il définit l'emplacement du point d'entrée du programme dans le fichier PE, qui fait référence à la première instruction exécutée après le chargement du programme.

Il définit également la taille des données que Windows charge en mémoire lors du chargement de fichiers PE, de sous-systèmes Windows, de programmes cibles (tels que l'interface graphique Windows ou la ligne de commande Windows) et d'autres détails de haut niveau sur le programme. Étant donné que le point d’entrée du programme indique à l’ingénierie inverse par où commencer l’ingénierie inverse, ces informations d’en-tête sont extrêmement précieuses pour l’ingénierie inverse.

3. En-tête de section

L'en-tête de section ❹ décrit les sections de données contenues dans le fichier PE. Une section d'un fichier PE est un élément de données qui sera mappé en mémoire lorsque le système d'exploitation chargera un programme, ou qui contient des instructions sur la façon de charger le programme en mémoire.

En d'autres termes, une section est une séquence d'octets sur le disque qui devient soit une chaîne d'octets contigus en mémoire, soit informe le système d'exploitation de certains aspects du processus de chargement.

L'en-tête de section indique également à Windows quelles autorisations doivent être accordées à la section, par exemple si elle doit être lisible, inscriptible ou exécutable lorsque le programme est exécuté. Par exemple, les sections .text contenant du code x86 sont souvent marquées comme étant lisibles et exécutables, mais pas inscriptibles, pour empêcher le code du programme de se modifier accidentellement pendant l'exécution.

La figure 1-1 représente de nombreuses sections, telles que .text et .rsrc. Lorsque les fichiers PE sont exécutés, ils sont mappés en mémoire. D'autres sections spéciales telles que la section .reloc ne sont pas mappées en mémoire et nous discuterons également de ces sections. Explorons les sections présentées dans la figure 1-1.

1) Section .text

Chaque programme PE contient au moins une section de code x86 marquée comme exécutable dans son en-tête de section ; ces sections sont presque toujours nommées .text❺. Section

2).idata La section

.idata❻, également connue sous le nom de section d'importation, contient la table d'adresses d'importation (IAT), qui répertorie les bibliothèques de liens dynamiques et leurs fonctions. L'IAT est l'une des structures PE les plus importantes à examiner lors de l'analyse initiale d'un binaire PE, car elle indique les bibliothèques appelées par le programme, mais ces appels peuvent à leur tour révéler les fonctionnalités avancées du malware.

3) Section de données

La section de données dans la structure du fichier PE peut inclure des sections telles que .rsrc, .data et .rdata, qui stockent les images du curseur de la souris, les icônes de boutons, l'audio et d'autres médias utilisés par le programme. Par exemple, la section .rsrc de la figure 1-1 contient des chaînes imprimables que le programme utilise pour restituer le texte sous forme de chaîne.

Les informations contenues dans la section

.rsrc (ressources) sont très importantes pour les analystes de logiciels malveillants, car en examinant les chaînes imprimables, les images graphiques et d'autres éléments contenus dans les fichiers PE, ils peuvent obtenir des indices importants sur la fonctionnalité du fichier.

Dans la section 03, vous apprendrez à utiliser la boîte à outils icoutils (y compris icotool et wrestool) pour extraire des images graphiques de la section ressources d'un binaire de malware. Ensuite, dans la section 04, vous apprendrez comment extraire des chaînes imprimables à partir des sections de ressources de logiciels malveillants.

4).section reloc

Le code du binaire PE n'est pas indépendant de la position, ce qui signifie que si vous le changez par rapport à l'attendu L'emplacement mémoire est déplacé vers un nouvel emplacement mémoire et il ne s'exécutera pas correctement. .reloc❽ résout ce problème en permettant au code d'être déplacé sans le casser.

Si le code d'un fichier PE a été déplacé, il indique au système d'exploitation Windows de traduire l'adresse mémoire dans le code du fichier afin que le code puisse toujours s'exécuter correctement. Ces conversions impliquent généralement l'ajout ou la soustraction de décalages aux adresses mémoire.

02 Utilisez pefile pour analyser le format de fichier PE

Le module Python pefile écrit et maintenu par Ero Carerra est devenu une bibliothèque d'analyse de logiciels malveillants standard de l'industrie pour analyser les fichiers PE. Dans cette section, je vais vous montrer comment utiliser pefile pour analyser ircbot.exe. La liste de codes 1-1 suppose que ircbot.exe se trouve déjà dans votre répertoire de travail actuel.

Entrez la commande suivante pour installer la bibliothèque pefile afin que nous puissions l'importer dans Python :

$ pip install pefile

Maintenant, démarrez Python en utilisant la commande du listing 1-1 et importez le module pefile , puis utilisez pefile pour ouvrir et analyser le fichier PE ircbot.exe.

  • Liste de codes 1-1 Chargez le module pefile et analysez le fichier PE (ircbot.exe)

    #🎜🎜 ## 🎜🎜#
    $ python >>> import pefile >>> pe = pefile.PE("ircbot.exe")
  • Nous instancions pefile.PE, qui est la classe principale implémentée par le module PE. Il analyse les fichiers PE afin que nous puissions visualiser leurs propriétés. En appelant le constructeur PE, nous chargeons et analysons le fichier PE spécifié, dans ce cas ircbot.exe. Maintenant que nous avons chargé et analysé ce fichier, exécutez le code du listing 1-2 pour extraire les informations du champ pe de ircbot.exe.

  • Liste de codes 1-2 Parcourez les différentes sections du fichier PE et imprimez les informations les concernant

    #🎜🎜 ## 🎜🎜#

    #基于 Ero Carrera的示例代码(pefile库的作者) for section in pe.sections:   print(section.Name, hex(section.VirtualAddress),     hex(section.Misc_VirtualSize), section.SizeOfRawData)

Le listing 1 à 3 montre la sortie imprimée.
  • Liste de codes 1-3 Utilisation du module pefile de Python pour extraire les données de section d'ircbot.exe

# 🎜🎜# Nous avons extrait les données de cinq sections différentes du fichier PE : .text, .rdata, .data, .idata et .reloc. La sortie est donnée sous la forme de cinq tuples, un élément pour chaque section PE extraite. La première entrée de chaque ligne identifie la section PE. (Vous pouvez ignorer la série d'octets nuls \x00, qui ne sont que des terminateurs de chaîne vides de style C.) Les champs restants nous indiquent quelle sera l'utilisation de la mémoire de chaque section une fois chargée en mémoire, et où elle se trouve en mémoire. sera trouvé une fois chargé.

Par exemple, 0x1000❶ est l'adresse de base de l'adresse mémoire virtuelle où ces sections sont chargées, qui peut également être considérée comme l'adresse mémoire de base de la section. Le 0x32830❷ dans le champ de taille virtuelle spécifie la taille de mémoire requise après le chargement de la section. 207360❸ dans le troisième champ indique la quantité de données que cette section occupera dans ce bloc mémoire.
En plus d'utiliser pefile pour analyser les sections du programme, nous pouvons également l'utiliser pour lister les fichiers DLL que le binaire chargera, et les appels de fonction qu'il demandera dans ces fichiers DLL. Nous pouvons y parvenir en reflétant (vidant) l'IAT du fichier PE. La liste de codes 1 à 4 montre comment utiliser le fichier pe pour refléter l'IAT de ircbot.exe.

Code Listing 1-4 Extraire les informations d'importation de ircbot.exe

  • $ 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
    # 🎜🎜# Le listing 1-4 produit le résultat affiché dans le listing 1-5 (le résultat a été tronqué par souci de concision).
Code Listing 1-5 Contenu de la table IAT de ircbot.exe, qui montre les fonctions de la bibliothèque utilisées par ce malware

#🎜 🎜 #

  • Comme le montre le listing 1-5, cette sortie est précieuse pour l'analyse des logiciels malveillants car elle répertorie la déclaration du logiciel malveillant et les informations riches. tableau de fonctions qui seront référencées.

  • Par exemple, les premières lignes du résultat nous indiquent que le malware utilisera WriteFile❶ pour écrire dans le fichier, CreateFileA❷ pour ouvrir le fichier et CreateProcessA❸ pour créer un nouveau processus. Bien qu’il ne s’agisse que d’informations de base sur le malware, elles constituent un début pour comprendre son comportement plus détaillé.
03 Examinez l'image du malware Comment Python identifie les logiciels malveillants
Pour comprendre comment le malware est conçu pour tromper sa cible, regardons les icônes contenues dans sa section .rsrc. Par exemple, les fichiers binaires de logiciels malveillants sont souvent conçus pour masquer les icônes de logiciels couramment utilisés tels que les documents Word, les programmes d'installation de jeux, les fichiers PDF, etc. afin d'inciter les utilisateurs à cliquer dessus.

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

回到我们的样本图像分析,你可以在本文的数据目录中找到名为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 显示恶意软件可以将攻击者指定的文件下载到目标计算机的字符串输出

Comment Python identifie les logiciels malveillants

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

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

  • La liste de codes 1 à 8 montre que le malware a une sortie de chaîne d'un serveur HTTP auquel l'attaquant peut se connecter

    #🎜🎜 ## 🎜🎜#
Comment Python identifie les logiciels malveillants La liste de codes 1 à 8 montre divers programmes passe-partout HTTP utilisés par ircbot.exe pour implémenter un serveur HTTP. Ce serveur HTTP pourrait permettre à un attaquant de se connecter à la machine cible via HTTP pour émettre des commandes, comme prendre une capture d'écran du bureau de la victime et la renvoyer à l'attaquant.

Nous voyons des preuves des capacités HTTP tout au long de la liste des codes. Par exemple, la méthode GET ❶ qui demande des données à une ressource Internet. HTTP/1.0 200 OK❷Cette ligne est une chaîne HTTP qui renvoie le code d'état 200, indiquant que les transactions réseau HTTP s'exécutent correctement, et Server:myBot❸ indique que le nom du serveur HTTP est myBot, qui est un serveur HTTP intégré attaché à ircbot.exe.

Toutes ces informations peuvent aider à comprendre et à bloquer des échantillons de logiciels malveillants ou des activités malveillantes spécifiques. Par exemple, savoir qu'un échantillon de malware dispose d'un serveur HTTP qui génère une chaîne spécifique lorsque vous vous y connectez peut vous permettre d'analyser votre réseau pour identifier les hôtes infectés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer