Untuk melaksanakan analisis statik perisian hasad, anda perlu memahami format fail Windows PE, yang menerangkan program Windows hari ini seperti .exe, .dll dan .sys The struktur fail dan mentakrifkan cara ia menyimpan data. Fail PE mengandungi arahan x86, data seperti imej dan teks, serta metadata yang diperlukan untuk program berjalan.
Format PE pada asalnya direka untuk melaksanakan operasi berikut.
1) Beritahu Windows cara memuatkan atur cara ke dalam memori
Format PE menerangkan blok fail mana yang harus dimuatkan ke dalam memori dan di mana. Ia juga memberitahu anda di mana dalam kod program Windows harus mula melaksanakan program dan perpustakaan kod yang dipautkan secara dinamik harus dimuatkan ke dalam memori.
2) Sediakan program yang sedang berjalan dengan media (atau sumber) yang boleh digunakan semasa pelaksanaan
Sumber ini boleh termasuk rentetan, seperti dialog GUI atau konsol Rentetan output, serta imej atau video.
3) Sediakan data keselamatan, seperti tandatangan kod digital
Windows menggunakan data keselamatan ini untuk memastikan kod itu datang daripada sumber yang dipercayai.
Format PE melaksanakan kerja di atas dengan menggunakan satu siri struktur yang ditunjukkan dalam Rajah 1-1.
▲Rajah 1-1 Format fail PE
Seperti yang ditunjukkan dalam Rajah 1-1, format fail PE termasuk satu siri pengepala untuk Memberitahu operasi sistem bagaimana untuk memuatkan atur cara ke dalam ingatan. Ia juga mengandungi satu siri bahagian yang mengandungi data program sebenar. Windows memuatkan bahagian ini ke dalam memori supaya pengimbangannya dalam memori sepadan dengan tempat ia muncul pada cakera.
Mari kita teroka struktur fail ini dengan lebih terperinci, bermula dengan pengepala PE. Kami akan melangkau perbincangan pengepala DOS, yang merupakan penahanan daripada sistem pengendalian Microsoft DOS 1980-an dan wujud semata-mata atas sebab keserasian.
1. Pengepala PE
Seperti yang ditunjukkan di bahagian bawah Rajah 1-1, di atas pengepala DOS ❶ ialah pengepala PE ❷, yang mentakrifkan sifat umum bagi atur cara seperti kod binari, imej, data termampat dan sifat atur cara lain. Ia juga memberitahu kami sama ada program ini direka untuk sistem 32-bit atau 64-bit.
Pengepala PE menyediakan maklumat kontekstual asas tetapi berguna untuk penganalisis perisian hasad. Sebagai contoh, pengepala termasuk medan cap masa yang memberikan masa pengarang perisian hasad menyusun fail. Biasanya pengarang perisian hasad akan menggantikan medan ini dengan nilai palsu, tetapi kadangkala pengarang perisian hasad terlupa untuk menggantikannya dan ini berlaku.
2. Pengepala pilihan
Pengepala pilihan ❸ sebenarnya terdapat di mana-mana dalam boleh laku PE hari ini, betul-betul bertentangan dengan maksud nama mereka. Ia mentakrifkan lokasi titik masuk program dalam fail PE, yang merujuk kepada arahan pertama yang dijalankan selepas program dimuatkan.
Ia juga mentakrifkan saiz data yang dimuatkan oleh Windows ke dalam memori semasa memuatkan fail PE, subsistem Windows, program sasaran (seperti GUI Windows atau baris arahan Windows) dan butiran peringkat tinggi lain tentang program. Memandangkan titik masuk program memberitahu jurutera terbalik tempat untuk memulakan kejuruteraan terbalik, maklumat pengepala ini amat berharga kepada jurutera terbalik.
3. Pengepala bahagian
Pengepala bahagian ❹ menerangkan bahagian data yang terkandung dalam fail PE. Bahagian dalam fail PE ialah sekeping data yang akan dipetakan ke dalam memori apabila sistem pengendalian memuatkan atur cara, atau mengandungi arahan tentang cara memuatkan atur cara ke dalam memori.
Dalam erti kata lain, bahagian ialah jujukan bait pada cakera yang sama ada menjadi rentetan bait bersebelahan dalam ingatan atau memberitahu sistem pengendalian tentang beberapa aspek proses pemuatan.
Pengepala bahagian juga memberitahu Windows kebenaran yang perlu diberikan kepada bahagian tersebut, seperti sama ada ia harus boleh dibaca, boleh ditulis atau boleh dilaksanakan apabila program dilaksanakan. Sebagai contoh, bahagian .text yang mengandungi kod x86 selalunya ditanda boleh dibaca dan boleh dilaksanakan, tetapi tidak boleh ditulis, untuk mengelakkan kod atur cara daripada mengubah suai dirinya secara tidak sengaja semasa pelaksanaan.
Rajah 1-1 menggambarkan beberapa bahagian, seperti .text dan .rsrc. Apabila fail PE dilaksanakan, ia dipetakan ke dalam ingatan. Bahagian khas lain seperti bahagian .reloc tidak dipetakan ke dalam ingatan dan kami akan membincangkan bahagian ini juga. Mari kita terokai bahagian yang ditunjukkan dalam Rajah 1-1.
1).bahagian teks
Setiap program PE mengandungi sekurang-kurangnya satu bahagian kod x86 yang ditandakan sebagai boleh laku dalam pengepala bahagiannya hampir selalu Namakannya .text❺ .
2).bahagian idata
.bahagian idata❻, juga dikenali sebagai bahagian import, mengandungi jadual alamat import (IAT), yang menyenaraikan pustaka pautan dinamik dan fungsi mereka. IAT ialah salah satu struktur PE yang paling penting untuk dilihat semasa analisis awal perduaan PE, kerana ia menunjukkan perpustakaan yang dipanggil oleh program, namun panggilan ini mungkin mendedahkan fungsi lanjutan perisian hasad.
3) Bahagian data
Bahagian data dalam struktur fail PE boleh termasuk bahagian .rsrc, .data dan .rdata, yang menyimpan kursor tetikus yang digunakan oleh Imej program, ikon butang, audio dan media lain, dsb. Sebagai contoh, bahagian .rsrc dalam Rajah 1-1 mengandungi rentetan boleh cetak yang digunakan oleh atur cara untuk menjadikan teks sebagai rentetan.
Maklumat dalam bahagian.rsrc (sumber) sangat penting kepada penganalisis perisian hasad kerana dengan memeriksa rentetan boleh cetak, imej grafik dan aset lain dalam fail PE, mereka boleh mendapatkan petunjuk penting tentang kefungsian fail.
Dalam Bahagian 03, anda akan mempelajari cara menggunakan kit alat icoutils (termasuk icotool dan wrestool) untuk mengekstrak imej grafik daripada bahagian sumber perduaan perisian hasad. Kemudian, dalam Bahagian 04, anda akan belajar cara mengekstrak rentetan boleh cetak daripada bahagian sumber perisian hasad.
4).bahagian reloc
Kod perduaan PE tidak bebas kedudukan, bermakna jika ia dialihkan dari lokasi memori yang dijangkakan ke memori baharu lokasi, ia tidak akan dilaksanakan dengan betul. .reloc❽ menyelesaikan masalah ini dengan membenarkan kod dialihkan tanpa memecahkannya.
Jika kod fail PE telah dialihkan, ia memberitahu sistem pengendalian Windows untuk menterjemah alamat memori dalam kod fail supaya kod itu masih boleh berjalan dengan betul. Penukaran ini biasanya melibatkan penambahan atau penolakan offset pada alamat memori.
Pefile modul Python yang ditulis dan diselenggara oleh Ero Carerra telah menjadi perpustakaan analisis perisian hasad standard industri untuk menghuraikan fail PE. Dalam bahagian ini, saya akan menunjukkan kepada anda cara menggunakan pefile untuk menghuraikan ircbot.exe. Penyenaraian Kod 1-1 menganggap bahawa ircbot.exe telah pun terletak dalam direktori kerja semasa anda.
Masukkan arahan berikut untuk memasang perpustakaan pefile supaya kita boleh mengimportnya dalam Python:
$ pip install pefile
Sekarang, mulakan Python menggunakan arahan dalam Penyenaraian 1-1, import modul pefile, dan kemudian gunakan pefile Buka dan parse fail PE ircbot.exe.
Penyenaraian Kod 1-1 Muatkan modul pefile dan parsing fail PE (ircbot.exe)
$ python >>> import pefile >>> pe = pefile.PE("ircbot.exe")
Contoh kami Tukar pefile.PE, iaitu kelas teras yang dilaksanakan oleh modul PE. Ia menghuraikan fail PE supaya kita boleh melihat sifatnya. Dengan memanggil pembina PE, kami memuatkan dan menghuraikan fail PE yang ditentukan, dalam kes ini ircbot.exe. Memandangkan kami telah memuatkan dan menghuraikan fail ini, jalankan kod dalam Penyenaraian 1-2 untuk mengekstrak maklumat daripada medan pe ircbot.exe.
Penyenaraian Kod 1-2 Lelaran melalui pelbagai bahagian fail PE dan cetak maklumat tentangnya
Penyenaraian 1-3 menunjukkan output bercetak.
Penyenaraian Kod 1-3 Gunakan modul pefile Python untuk mengekstrak data bahagian daripada ircbot.exe
Kami mengekstrak data bahagian daripada PE fail 5 Data diekstrak daripada tiga bahagian berbeza: .text, .rdata, .data, .idata dan .reloc. Output diberikan dalam bentuk lima tuple, satu elemen untuk setiap bahagian PE yang diekstrak. Entri pertama pada setiap baris mengenal pasti bahagian PE. (Anda boleh mengabaikan siri \x00 null byte, yang merupakan penamat rentetan kosong gaya C.) Medan selebihnya memberitahu kami penggunaan memori setiap bahagian apabila ia dimuatkan ke dalam memori dan di mana ia berada dalam ingatan akan ditemui setelah dimuatkan.
Sebagai contoh, 0x1000❶ ialah alamat memori maya asas tempat bahagian ini dimuatkan, yang juga boleh dianggap sebagai alamat memori asas bahagian tersebut. 0x32830❷ dalam medan saiz maya menentukan saiz memori yang diperlukan selepas bahagian tersebut dimuatkan. 207360❸ dalam medan ketiga menunjukkan jumlah data yang akan diduduki oleh bahagian ini dalam blok memori ini.
Selain menggunakan pefile untuk menghuraikan bahagian program, kami juga boleh menggunakannya untuk menyenaraikan fail DLL yang akan dimuatkan oleh binari, dan fungsi memanggilnya akan diminta dalam fail DLL tersebut. Kita boleh mencapai ini dengan mencerminkan (melambakkan) IAT fail PE. Penyenaraian Kod 1-4 menunjukkan cara menggunakan pefile untuk mencerminkan IAT ircbot.exe.
Penyenaraian Kod 1-4 Ekstrak maklumat import daripada ircbot.exe
#基于 Ero Carrera的示例代码(pefile库的作者) for section in pe.sections: print(section.Name, hex(section.VirtualAddress), hex(section.Misc_VirtualSize), section.SizeOfRawData)
Penyenaraian Kod 1-4 akan Menghasilkan output yang ditunjukkan dalam Penyenaraian 1-5 (output dipotong untuk ringkas).
Penyenaraian Kod 1-5 Kandungan jadual IAT ircbot.exe, yang menunjukkan fungsi perpustakaan yang digunakan oleh perisian hasad ini
Seperti yang ditunjukkan dalam Penyenaraian 1-5, output ini berharga untuk analisis perisian hasad kerana ia menyenaraikan pengisytiharan perisian hasad dan pelbagai fungsi yang akan dirujuk.
Sebagai contoh, beberapa baris pertama output memberitahu kami bahawa perisian hasad akan menggunakan WriteFile❶ untuk menulis ke fail, CreateFileA❷ untuk membuka fail dan CreateProcessA❸ untuk mencipta proses baharu. Walaupun ini hanyalah maklumat asas tentang perisian hasad, ia adalah permulaan untuk memahami kelakuannya yang lebih terperinci.
Untuk memahami cara perisian hasad direka bentuk untuk menipu sasarannya, mari lihat ikon yang terkandung dalam bahagian .rsrcnya. Sebagai contoh, fail perduaan perisian hasad sering direka untuk menyamarkan ikon perisian yang biasa digunakan seperti dokumen Word, pemasang permainan, fail PDF, dll. untuk menipu pengguna supaya mengklik padanya.
你还可以在恶意软件中找到攻击者自己感兴趣程序中的图像,例如攻击者为远程控制受感染机器而运行的网络攻击工具和程序。
回到我们的样本图像分析,你可以在本文的数据目录中找到名为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文件中提取图像和图标相对简单,可以快速显示与恶意软件二进制文件相关的有趣且又有用的信息。同样地,我们可以轻松地从恶意软件中提取可打印字符串来获取更多信息,我们接下来会做这项工作。
字符串是程序二进制文件中可打印字符的序列。恶意软件分析师通常依赖恶意样本中的字符串来快速了解其中可能发生的情况。这些字符串通常包含下载网页和文件的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 显示恶意软件可以将攻击者指定的文件下载到目标计算机的字符串输出
这些行表示ircbot.exe将尝试把攻击者指定的文件下载到目标计算机上。
我们来尝试分析另一个。代码清单1-8所示的字符串镜像表明ircbot.exe可以起到Web服务器的作用,在目标机器上侦听来自攻击者的连接。
Penyenaraian Kod 1-8 menunjukkan bahawa perisian hasad mempunyai output rentetan pelayan HTTP yang boleh disambungkan oleh penyerang
Penyenaraian Kod 1-8 menunjukkan pelbagai atur cara plat dandang HTTP yang digunakan oleh ircbot.exe untuk melaksanakan pelayan HTTP. Pelayan HTTP ini boleh membenarkan penyerang menyambung ke mesin sasaran melalui HTTP untuk mengeluarkan arahan, seperti mengambil tangkapan skrin desktop mangsa dan menyerahkannya kembali kepada penyerang.
Kami melihat bukti kefungsian HTTP sepanjang penyenaraian kod. Contohnya, kaedah GET ❶ yang meminta data daripada sumber Internet. HTTP/1.0 200 OK❷Baris ini ialah rentetan HTTP yang mengembalikan kod status 200, menunjukkan bahawa transaksi rangkaian HTTP berjalan dengan baik, dan Server:myBot❸ menunjukkan bahawa nama pelayan HTTP ialah myBot, iaitu pelayan HTTP terbina dalam yang dilampirkan pada ircbot.exe.
Semua maklumat ini membantu memahami dan menyekat sampel perisian hasad atau aktiviti berniat jahat tertentu. Contohnya, mengetahui bahawa sampel perisian hasad mempunyai pelayan HTTP yang mengeluarkan rentetan tertentu apabila anda menyambung kepadanya boleh membolehkan anda mengimbas rangkaian anda untuk mengenal pasti hos yang dijangkiti.
Atas ialah kandungan terperinci Bagaimana Python mengenal pasti perisian hasad. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!