教你用Python制作一款自己的杀毒程序

教你用Python制作一款自己的杀毒程序

2023年8月1日发(作者:)

教你⽤Python制作⼀款⾃⼰的杀毒程序在本⽂中,我们将介绍恶意软件静态分析的基础知识。静态分析是对程序⽂件的反汇编代码、图形图像、可打印字符串和其他磁盘资源进⾏分析,是⼀种不需要实际运⾏程序的逆向⼯程。虽然静态分析技术有⽋缺之处,但是它可以帮助我们理解各种各样的恶意软件。通过细致的逆向⼯程,你将能够更好地理解恶意软件⼆进制⽂件在攻击⽬标后为攻击者提供的好处,以及攻击者可以隐藏并继续攻击受感染计算机的⽅式。正如你将看到的,本⽂结合了描述和实例,每个部分都介绍了静态分析技术,然后说明其在实际分析中的应⽤。本⽂的代码和数据,可以在公众号后台回复恶意软件获取下载⽅式。你将在数据⽬录/ch1中找到本⽂⽰例中使⽤的恶意软件⽰例。为了演⽰本⽂讨论的技术,我们在演⽰中使⽤,这是⼀个互联⽹中继聊天(Internet Relay Chat,IRC)机器⼈,也在⽇常⼴泛监测中最常见的恶意软件的⽰例之⼀。严格来说,当连接到IRC服务器时,这个程序被设计常驻在⽬标计算机上。在控制⽬标后,攻击者可以通过IRC控制⽬标计算机,执⾏控制指令,例如打开⽹络摄像头偷偷捕获视频、提取⽬标的地理位置和桌⾯的截图,以及从⽬标机器中提取相关⽂件等。01 微软Windows可移植可执⾏⽂件格式要进⾏恶意软件静态分析,你需要了解Windows PE⽂件格式,该格式描述了如.exe、.dll和.sys等当今Windows程序⽂件的结构,并定义了它们存储数据的⽅式。PE⽂件包含x86指令、图像和⽂本等数据,以及程序运⾏所需的元数据。PE格式最初的设计是⽤来进⾏下⾯的操作。1)告诉Windows如何将程序加载到内存中PE格式描述了⽂件的哪些块应该加载到内存中,以及在哪⾥加载。它还告诉你,Windows应该在程序代码⾥的哪个位置开始执⾏程序,以及哪些动态链接代码库应该加载到内存中。2)为运⾏程序提供在执⾏过程中可能使⽤的媒体(或资源)这些资源可以包括字符串,如GUI对话框或控制台输出的字符串,以及图像或视频。3)提供安全数据,例如数字代码签名Windows使⽤这些安全数据来确保代码出⾃受信任的来源。PE格式通过利⽤图1-1中所⽰的⼀系列结构来完成以上⼯作。▲图1-1 PE⽂件格式如图1-1所⽰,PE⽂件格式包括⼀系列头(header),⽤来告诉操作系统如何将程序加载到内存中。它还包括⼀系列节(section)⽤来包含实际的程序数据。Windows将这些节加载到内存中,使其在内存中的偏移量与它们在磁盘上的显⽰位置相对应。让我们从PE头开始,来更详细地探讨这个⽂件结构。我们将略过对DOS头的讨论,这是20世纪80年代微软DOS操作系统的遗留产物,仅仅出于兼容性原因⽽存在。1. PE头如图1-1底部所⽰,在DOS头❶的上⾯是PE头❷,它定义了程序的⼀般属性,如⼆进制代码、图像、压缩数据和其他程序属性。它还告诉我们程序是否是针对32位或64位系统⽽设计的。PE头为恶意软件分析师提供了基本但有⽤的情景信息。例如,头⾥包括了时间戳字段,这个字段可以给出恶意软件作者编译⽂件的时间。通常恶意软件作者会使⽤伪造的值替换这个字段,但是有时恶意软件作者会忘记替换,就会发⽣这种情况。2. 可选头可选头❸实际上在今天的PE可执⾏程序中⽆处不在,恰恰与其名称的含义相反。它定义了PE⽂件中程序⼊⼝点的位置,该位置指的是程序加载后运⾏的第⼀个指令。它还定义了Windows在加载PE⽂件、Windows⼦系统、⽬标程序(例如Windows GUI或Windows命令⾏)时加载到内存中的数据⼤⼩,以及有关该程序其他的⾼级详细信息。由于程序的⼊⼝点告诉了逆向⼯程师该从哪⾥开始进⾏逆向⼯程,这个头信息对逆向⼯程师来说是⾮常宝贵的。3. 节头节(section)头❹描述了PE⽂件中包含的数据节。PE⽂件中的⼀个节是⼀块数据,它们在操作系统加载程序时将被映射到内存中,或者包含有关如何将程序加载到内存中的指令。换句话说,⼀个节是磁盘上的字节序列,它要么成为内存中⼀串连续字节的字符串,要么告知操作系统关于加载过程的某些⽅⾯。节头还告诉Windows应该授予节哪些权限,⽐如程序在执⾏时,是否应该可读、可写或可执⾏。例如,包含x86代码的.text节通常被标记为可读和可执⾏的,但是不可写的,以防⽌程序代码在执⾏过程中意外修改⾃⾝。图1-1描述了许多节,如.text和.rsrc。执⾏PE⽂件时,它们会被映射到内存中。其他如.reloc节的特殊节不会被映射到内存中,我们也将讨论这些节。下⾯我们来浏览图1-1中显⽰的节。1).text节每个PE程序在其节头中包含了⾄少⼀个标记为可执⾏的x86代码节;这些节⼏乎总是命名为.text❺。2).idata节.idata节❻,也被称为导⼊节,包含导⼊地址表(IAT),它列出了动态链接库和它们的函数。IAT是最重要的PE结构之⼀,在对PE⼆进制⽂件进⾏最初的分析时需要查看它,因为它指出了程序所调⽤的库,然⽽这些调⽤反过来⼜可能会泄露恶意软件的⾼级功能。3)数据节在PE⽂件结构中的数据节可以包括.rsrc、.data和.rdata等节,它们存储程序使⽤的⿏标光标图像、按钮图标、⾳频和其他媒体等。例如,图1-1中的.rsrc节❼包含了程序⽤于将⽂本呈现为字符串的可打印字符串。.rsrc(资源)节中的信息对恶意软件分析师是⾮常重要的,因为通过检查PE⽂件中的可打印字符串、图形图像和其他资产,他们可以获得关于⽂件功能的重要线索。在03节中,你将了解如何使⽤icoutils⼯具包(包括icotool和wrestool)从恶意软件⼆进制⽂件的资源节中提取图形图像。然后,在04节中,你将学习如何从恶意软件资源节中提取可打印的字符串。4).reloc节PE⼆进制⽂件的代码并⾮是与位置独⽴的,这意味着如果将它从预期的内存位置移动到新的内存位置,它将⽆法正确执⾏。.reloc❽在不破坏代码的情况下通过允许移动代码来解决这个问题。如果⼀个PE⽂件的代码已被移动,它就告诉Windows操作系统将该⽂件的代码中进⾏内存地址转换,这样代码仍可以正确运⾏。这些转换通常涉及在内存地址中添加或减去偏移量。02 使⽤pefile解析PE⽂件格式由Ero Carerra编写和维护的Python模块pefile已经成为解析PE⽂件的⼀个⾏业标准的恶意软件分析库。在本节中,我将向你展⽰如何使⽤pefile来解析。代码清单1-1假设已位于你当前的⼯作⽬录中。输⼊以下命令安装pefile库,以便我们可以在Python中导⼊它:$ pip install pefile

现在,使⽤代码清单1-1中的命令启动Python,导⼊pefile模块,然后使⽤pefile打开并解析PE⽂件。代码清单1-1 加载pefile模块并解析PE⽂件()$ python

>>> import pefile

>>> pe = ("")

我们实例化,它是PE模块实现的核⼼类。它解析PE⽂件,以便我们可以查看它们的属性。通过调⽤PE构造函数,我们加载并解析指定的PE⽂件,在本例中为。现在我们已经加载并解析了这个⽂件,运⾏代码清单1-2中的代码从的pe字段中提取信息。代码清单1-2 遍历PE⽂件的各个节并打印有关它们的信息#基于 Ero Carrera的⽰例代码(pefile库的作者)

for section in ns:

print(, hex(lAddress),

hex(_VirtualSize), RawData)

代码清单1-3显⽰了打印输出的内容。代码清单1-3 使⽤Python的pefile模块从中提取节数据如代码清单1-3所⽰,我们从PE⽂件五个不同的节中提取了数据:.text、.rdata、.data、.idata和.reloc。输出是以五元组的形式给出,每提取⼀个PE节对应⼀个元素。每⼀⾏的第⼀个条⽬标识PE节。(你可以忽略⼀系列的x00空字节,它们只是C语⾔样式的空字符串终⽌符。)其余字段告诉我们,⼀旦将每个节被加载到内存中,它的内存利⽤率将是多少,以及⼀旦被加载,它将在内存中的何处被找到。例如,0x1000❶是加载这些节的虚拟内存地址基址,也可以将其视为节的内存地址基址。在虚拟⼤⼩(virtual size)字段中的0x32830❷指定了节被加载后所需的内存⼤⼩。第三个字段中的207360❸表⽰该节将在该内存块中所占⽤的数据量。除了使⽤pefile解析程序的节之外,我们还可以使⽤它列出⼆进制⽂件将加载的DLL⽂件,以及它将在这些DLL⽂件中所请求的函数调⽤。我们可以通过镜像(dump)PE⽂件的IAT来实现这⼀点。代码清单1-4显⽰了如何使⽤pefile镜像的IAT。代码清单1-4 从中提取导⼊信息$ python

pe = ("")

for entry in ORY_ENTRY_IMPORT:

print

for function in s:

print 't',

代码清单1-4会⽣成如代码清单1-5所⽰的输出(为了简洁起见,输出进⾏了截断)。代码清单1-5 的IAT表内容,其显⽰了这个恶意软件使⽤的库函数如代码清单1-5所⽰,这个输出对于恶意软件分析很有价值,因为它列出了恶意软件声明和将引⽤的丰富的函数数组。例如,输出的前⼏⾏告诉我们,恶意软件将使⽤WriteFile❶写⼊⽂件,使⽤CreateFileA❷打开⽂件,并使⽤CreateProcessA❸创建新的进程。虽然这些只是关于恶意软件的基本信息,但它们是了解恶意软件更为详细⾏为的开始。03 检查恶意软件的图⽚要了解恶意软件是如何设计来捉弄攻击⽬标的,让我们看看在它的.rsrc节中所包含的图标。例如,恶意软件⼆进制⽂件常常被设计成伪装的Word⽂档、游戏安装程序、PDF⽂件等常⽤软件的图标来欺骗⽤户点击它们。你还可以在恶意软件中找到攻击者⾃⼰感兴趣程序中的图像,例如攻击者为远程控制受感染机器⽽运⾏的⽹络攻击⼯具和程序。回到我们的样本图像分析,你可以在本⽂的数据⽬录中找到名为的这个恶意软件样本。这个样本使⽤Adobe Acrobat图标诱骗⽤户认为它是⼀个Adobe Acrobat⽂档,⽽实际上它是⼀个恶意的PE可执⾏⽂件。在我们使⽤Linux命令⾏⼯具wrestool从⼆进制⽂件中提取图像之前,我们⾸先需要创建⼀个⽬录来保存我们将提取的图像。代码清单1-6显⽰了如何完成所有这些操作。代码清单1-6 从恶意软件样本中提取图像的Shell命令$ mkdir images

$ wrestool -x -output=images

$ icotool -x -o images images/*.ico

我们⾸先使⽤mkdir images创建⼀个⽬录来保存提取的图像。接下来,我们使⽤wrestool从中提取图像资源(-x)到/images⽬录,然后使⽤icotool提取(-x)并将Adobe中.ico图标格式中的所有资源转换(-o)为.png图形,以便我们可以使⽤标准的图像浏览⼯具查看们。如果你的系统上没有安装wrestool,你可以从这⾥下载:⼀旦你使⽤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. 分析镜像字符串现在我们镜像了⼀个恶意软件程序的可打印字符串,但是挑战在于要理解这些字符串的含义。例如,假设我们将中的字符串镜像到⽂件中,这在本⽂前⾯的内容中,我们使⽤pefile库已经进⾏了探讨,如下所⽰:$ strings >

的内容包含数千⾏⽂本,但其中⼀些⾏应该突出显⽰出来。例如,代码清单1-7显⽰了从字符串镜像中提取出来的⼀串以单词DOWNLOAD开头的⾏。代码清单1-7 显⽰恶意软件可以将攻击者指定的⽂件下载到⽬标计算机的字符串输出这些⾏表⽰将尝试把攻击者指定的⽂件下载到⽬标计算机上。我们来尝试分析另⼀个。代码清单1-8所⽰的字符串镜像表明可以起到Web服务器的作⽤,在⽬标机器上侦听来⾃攻击者的连接。代码清单1-8 显⽰恶意软件有⼀个攻击者可以连接的HTTP服务器的字符串输出代码清单1-8显⽰了⽤于实现HTTP服务器的各种HTTP样板程序。此HTTP服务器可能允许攻击者通过HTTP连接到⽬标计算机以发出命令,例如获取受害者桌⾯的屏幕截图并将其回传给攻击者的命令。我们在整个代码清单中看到了HTTP功能的证据。例如,从Internet资源请求数据的GET⽅法❶。HTTP/1.0 200 OK❷这⼀⾏是⼀个返回状态代码200的HTTP字符串,表明HTTP⽹络事务都运⾏良好,⽽Server:myBot❸表明HTTP服务器的名称是myBot,这是附加的⼀个内置HTTP服务器。所有这些信息都有助于理解和阻⽌特定的恶意软件样本或恶意活动。例如,知道恶意软件样本有⼀个HTTP服务器,当你连接到它时,它会输出特定的字符串,这样你就可以借此扫描你的⽹络来识别受感染的主机。05 ⼩结在本⽂中,你⼤致对静态恶意软件分析有了⼀定的认识,其中包括在不实际运⾏的情况下检查恶意软件程序。你了解了定义Windows操作系统.exe和.dll⽂件的PE⽂件格式,还了解了如何使⽤Python库pefile解析实际场景中的恶意软件⼆进制⽂件。你还使⽤图像分析和字符串分析等静态分析技术,从恶意软件样本中提取更多的信息

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690874264a452254.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信