基于数据科学的恶意软件分析(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-23 00:41:23

点击下载

作者:(美)约书亚·萨克斯,(美)希拉里·桑德斯

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

基于数据科学的恶意软件分析

基于数据科学的恶意软件分析试读:

前言

中看到的,应用于安全领域的数据科学是使用机器学习、数据挖掘和数据可视化等技术来检测发现网络威胁的艺术和科学。虽然你会发现很多来自市场驱动的关于机器学习和人工智能的夸大其词,但事实上,这些技术确实已经在当前的网络安全产品中得到了很好的应用。

例如,在当前恶意软件检测的场景中,无论是恶意软件的制作规模还是攻击者在修改恶意软件特征方面的成本,都使得基于特征的恶意软件检测方法已经过时了。相反,反病毒公司现在正在训练神经网络或其他类型的机器学习算法,使用庞大的恶意软件数据集来让这些模型和算法学习它们的特征,这样就可以在不必天天更新模型算法的情况下实现新型恶意软件变种的检测。通过结合基于特征检测和机器学习检测两方面的技术方法,就可以同时覆盖已知和未知恶意软件的检测范围。本书的两位作者Josh和Hillary都是这方面的专家,他们都有丰富的经验。

但是,恶意软件检测只是数据科学的一个用例。事实上,当我们要在网络空间中发现威胁时,老练的攻击者通常是不会遗留下可执行程序文件的。相反,他们会利用已有的软件进行初始访问,通过漏洞利用获得的用户权限,然后使用系统工具从一台机器跳转到下一台机器。从攻击的角度来看,这种方法不会留下反病毒软件能检测到的恶意软件等工具。但是,一个好的终端日志系统或终端检测和响应(EDR)系统会捕获系统级行为日志并将日志发送到云端,分析师可以从云端尝试拼接还原入侵者的数字足迹。这种需要梳理海量数据流并不断寻找入侵模式的过程是非常适合使用数据科学来解决的问题,特别是使用统计算法的数据挖掘技术和数据可视化技术来实现。未来你可以看到越来越多的安全运营中心(SOC)采用数据挖掘和人工智能技术。这确实是剖析海量系统事件数据集来识别实际攻击的唯一方法。

网络安全正在经历技术和运营的巨大转变,而数据科学正在引领这个转变。我们很幸运,有像Joshua Saxe和Hillary Sanders这样的专家,他们不仅与我们分享他们的专业知识,并且以这样一种引人入胜的、易于理解的方式进行分享。这是你了解他们知识经验的机会,同时也是将这些知识应用到自身工作中的机会,这样你就可以领先于技术的变革和那些你有责任打败的攻击者。Anup K.Ghosh博士,Invincea公司创始人于美国华盛顿特区前言

如果你是在网络安全领域工作,你很可能比以往更多地使用了数据科学,即使你可能还没有意识到这一点。例如,你的反病毒产品使用数据科学算法来检测恶意软件。你的防火墙供应商可能利用数据科学算法来检测可疑的网络行为。你的安全信息和事件管理(SIEM)软件很可能使用数据科学来识别数据中的可疑趋势。不管是不是明显,整个安全产业正在越来越多地将数据科学应用于安全产品中。

高级IT安全专业人员正在将他们自己定制的机器学习算法集成到他们的工作流程中。例如,在最近的会议报告和新闻文章中,Target百货公司、万事达(Mastercard)和富国银行(Wells Fargo)的安全分析师都讲述了开发定制化的数据科学技术,并将其作为安全工作的[1]一部分。如果你还没有赶上数据科学的潮流,那么现在就是将数据科学纳入你的安全实践来提升能力的最佳时机。什么是数据科学

数据科学是一个不断增长的算法工具集合,它可以让我们通过使用统计学、数学和巧妙的统计数据可视化技术来理解和预测数据。虽然有更具体的定义,但一般来说,数据科学有三个组成部分:机器学习、数据挖掘和数据可视化。

在网络安全的场景下,机器学习算法通过学习训练数据来检测新的安全威胁。这些方法已经被证明可以检测出那些能被基于特征的传统检测技术检测出的恶意软件。数据挖掘算法通过搜索安全数据来找出一些有趣的模式(例如,有威胁的攻击者之间的关系),这些模式可能有助于我们辨别针对自身组织的攻击活动。最后,数据可视化技术将枯燥无味的表格数据转换成图像的形式,帮助人们轻松发现有趣和可疑的趋势。我将在本书中深入讨论这三方面的技术内容,并向你展示如何使用它们。为什么数据科学对安全性至关重要

数据科学对网络安全的未来至关重要,原因有三个:首先,安全总是与数据相关。当我们试图检测网络威胁时,我们就是在对文件、日志、网络数据包和其他结构形式的数据进行分析。传统的网络安全专家不会针对这些数据源,使用数据科学技术来进行检测。相反,他们使用文件哈希值、自定义的检测规则(如特征)和自定义的启发式方法。尽管这些技术有其优点,但是针对每一种类型的攻击,都需要人为参与的技术,这就需要太多的人为工作来跟上不断变化的网络威胁形势。近年来,数据科学技术在提升我们检测网络威胁的能力方面变得至关重要。

其次,数据科学对网络安全很重要,因为互联网上的网络攻击数量急剧增长。我们以地下黑产中的恶意软件增长情况为例。2008年,在安全社区中所知道的恶意可执行软件大约有100万种。2012年,这个数字达到了1亿。2018年,安全社区已知的恶意可执行软件数量已经超过7亿(https://www.av-test.org/en/statistics/malware/),而且这个数字可能还会继续增长。

由于恶意软件的数量庞大,基于特征的手动检测技术已不再是能检测出所有网络攻击的合理方法。由于数据科学技术使得检测网络攻击的大部分工作自动化,并大大减少了检测这些攻击所需使用的内存,因此随着网络威胁的增长,它们在保护网络和用户方面有着巨大的潜力。

最后,无论是在安全行业的内部还是外部,数据科学是这十年的技术趋势,而且很可能在未来十年仍是如此,因此数据科学对网络安全至关重要。事实上,在任何地方都可能看到数据科学的应用,如个人语音助手(亚马逊Echo、苹果Siri和谷歌Home)、自动驾驶汽车、广告推荐系统、网页搜索引擎、医学图像分析系统和健身跟踪应用程序等。

我们可以预期数据科学驱动的系统会对法律服务、教育和其他领域产生重大影响。由于数据科学已成为整个技术领域的关键推动因素,大学、大公司(谷歌、Facebook、微软和IBM)和政府正在投资数十亿美元来改进数据科学工具。感谢这些投资,使得数据科学工具将更适用于解决攻击检测的难题。将数据科学应用于恶意软件

本书侧重于将数据科学应用于恶意软件,我们将恶意软件定义成为达成恶意目的而编写的可执行程序,因为恶意软件仍然是威胁发动者在网络中获得攻击立足点的主要手段,并以此实现他们的后续目的。例如,在近年来出现的勒索软件灾难中,攻击者通常向用户发送带有恶意附件的电子邮件,使得勒索软件的可执行文件(恶意软件)被下载到用户的计算机上,然后就对用户的数据进行加密,并要求用户支付赎金来解密数据。尽管一些老练的攻击者有时为逃避恶意软件检测系统的监视而不使用恶意软件,但是在目前的网络攻击中,恶意软件仍然是攻击者主要应用的技术。

本书着眼于网络安全领域中数据科学的特定应用,而不是试图广泛地涵盖整个网络安全的数据科学,旨在更全面地展示如何将数据科学技术应用于解决重大的网络安全问题。通过了解基于数据科学的恶意软件分析,我们能够更好地将数据科学应用到其他网络安全领域,比如检测网络攻击、钓鱼邮件或可疑用户行为等。实际上,你在本书中学到的几乎所有技术都不仅适用于恶意软件检测工作,而且适用于构建一般的数据科学检测和智能系统。本书的目标读者

本书的目标读者是那些有兴趣学习更多关于如何使用数据科学技术解决计算机安全问题的安全专业人士。如果你不了解计算机安全和数据科学,你可能会意识到自己不得不通过查找专业术语来给自己提供一些相关知识,但是你仍然可以顺利地阅读本书。如果你只对数据科学感兴趣,而对计算机安全不感兴趣,那么这本书可能不适合你。本书的主要内容

本书的第一部分由三章组成,涵盖了理解本书后面讨论恶意软件数据科学技术所必需的基本逆向工程概念。如果你刚接触恶意软件,请先阅读前三章。如果你是恶意软件逆向工程的老手,那么你可以跳过这些章节。

·第1章 包括用于分析恶意软件文件,并发现它们如何在我们的计算机上实现恶意目的的静态分析技术。

·第2章 向你简要介绍了x86汇编语言和如何反汇编,以及恶意软件的逆向工程。

·第3章 通过讨论动态分析,对本书关于逆向工程的内容部分进行总结,其中包括在可控环境中运行恶意软件来了解其恶意行为。

第4章和第5章重点关注恶意软件的关系分析,其中包括查看恶意软件集合之间的相似性和差异性,以识别针对你组织的恶意软件攻击活动,例如由一个网络犯罪团伙控制的勒索软件活动,或针对你的组织进行的有组织有针对性的攻击活动。这些独立章节非常适合那些不仅对恶意软件检测感兴趣,而且还对提取有价值的威胁情报以追踪谁在攻击其网络感兴趣的读者。如果你对威胁情报不太感兴趣而对数据科学驱动的恶意软件检测技术更感兴趣的话,那么你可以安心地跳过这些章节。

·第4章 展示了如何基于共享的属性来分析和可视化恶意软件,例如恶意软件程序都会请求的主机名。

·第5章 说明如何识别和可视化恶意软件样本之间的共享代码关系,这可以帮助你识别恶意软件样本集合是否来自一个或者多个犯罪团伙。

接下来的四章涵盖了你需要了解的关于理解、应用和实现基于机器学习的恶意软件检测系统。这些章节的内容还为将机器学习应用于其他网络安全场景提供了基础。

·第6章 涵盖对基本机器学习概念的容易理解的、直观的且非数学化的介绍。如果你曾学习过机器学习的相关知识,本章将便于你重温这些内容。

·第7章 展示如何使用基本的统计方法来评价机器学习系统的准确性,以便选择最佳方法。

·第8章 介绍了可以用来构建自身机器学习系统的开源机器学习工具,并对如何使用这些工具进行了说明。

·第9章 介绍如何使用Python来对恶意软件威胁数据进行可视化,从而揭示攻击活动和趋势,以及如何在分析安全数据时将数据可视化集成到你的日常工作流程中。

最后三章介绍了深度学习的内容,涉及更多的数学知识,是机器学习的一个高阶领域。深度学习是网络安全数据科学中的一个热门增长领域,这些章节为你提供了充分的入门知识。

·第10章 涵盖了深度学习的基本概念。

·第11章 说明了如何使用开源工具在Python中实现基于深度学习的恶意软件检测系统。

·第12章 通过分享成为一名数据科学家的不同途径以及可以帮助你在这个领域取得成功的应有素质来对全书进行总结。

·附录 描述了本书附带的数据和示例工具实现。如何使用示例代码和数据

如果一本编程书没有供你使用和扩展的示例代码,那么它就是不完整的。本书每一章都附有示例代码和数据,并在附录中进行了详尽的描述。所有代码都是针对Linux环境中的Python 2.7版本编写的。要访问这些代码和数据,你可以下载一个VirtualBox下的Linux虚拟机,里面已经把程序代码、数据和所需开源工具都设置好并准备就绪,然后你就可以在自己的VirtualBox环境中运行。你可以从http://www.malwaredatascience.com/或华章公司网站(www.hzbook.com)下载本书附带的数据,也可以从https://www.virtualbox.org/wiki/Downloads免费下载VirtualBox软件。这些代码已经在Linux系统中进行了测试,但是如果你希望在Linux VirtualBox虚拟机以外运行的话,同样的代码在MacOS上应该可以正常工作,在Windows机器上应该也可以正常运行。

如果你希望在自己的Linux环境中安装代码和数据,可以从http://www.malwaredata-science.com/或华章公司网站(www.hzbook.com)下载。你将在可下载的归档文件中找到每个章节的目录,在每章的目录中都包含相应代码和数据的code/与data/目录。这些代码文件对应于每一章的代码清单或代码段,对于手头上需要处理的应用程序来说更有意义。一些代码文件与代码清单里的内容完全相同,而另一些代码文件则进行了轻微的修改,以便你可以更容易地使用参数和其他选项。代码目录附带了pip requirements.txt文件,其中提供了每章代码运行所依赖的开源库。要在你的机器上安装这些库,只需在每一章的code/目录路径中输入pip-r requirements.txt即可。

现在你已经可以访问本书的代码和数据了,让我们开始吧。[1] Target百货公司(https://www.rsaconference.com/events/us17/agenda/sessions/6662-applied-machine-learning-defeating-modern-malicious)、万事达(https://blogs.wsj.com/cio/2017/11/15/artificial-intelligence-transforms-hacker-arsenal/)和富国银行(https://blogs.wsj.com/cio/2017/11/16/the-morning-download-first-ai-powered-cyberattacks-are-detected/)。——译者注致谢

感谢No Starch出版社的Annie Choi、Laurel Chun和Bill Pollock,以及我的编辑Bart Reed。公正地说,他们应该被视为这本书的合著者。提前感谢负责印刷、运输和销售这本书的工作人员,以及负责其数字存储、转换和渲染的工程师们。感谢Hillary Sanders在需要的时候把她非凡的才能带到这个项目中来。感谢Gabor Szappanos出色而严格的技术评审。

感谢我两岁的女儿Maya,我很高兴和她一起分享,她让这个项目大大放慢了速度。感谢Alen Capalik、Danny Hillis、Chris Greamo、Anup Ghosh和Joe Levy在过去10年的指导。非常感谢美国国防高级研究计划局(DARPA)和Timothy Fraser对本书大部分内容所基于的研究进行支持。感谢Mandiant公司和Mila Parkour提供用于本书功能性验证的APT1恶意软件样本。非常感谢Python、NetworkX、matplotlib、numpy、sklearn、Keras、seaborn、pefile、icoutils、malwr.com、CuckooBox、capstone、pandas和sqlite的作者们对安全及数据科学软件的免费和开源所做出的贡献。

万分感谢我的父母,Maryl Gearhart和Geoff Saxe,感谢他们给我介绍计算机,感谢他们无限的爱和支持。感谢Gary Glickman对我的爱和支持。最后,感谢我的人生伴侣Ksenya Gurshtein在这个过程中毫不犹豫地全力支持我。Joshua Saxe

感谢Josh让我参与这本书!感谢我出色的老师Ani Adhikari。感谢Jacob Michelini,因为他真的想在书中找到自己的名字。Hillary Sanders作者简介

约书亚·萨克斯(Joshua Saxe)是专业安全企业Sophos的首席数据科学家,他在Sophos公司负责领导一个安全数据科学研究团队。他还是Sophos公司基于神经网络的恶意软件检测器的主要发明者,它可以保护数以千万计的Sophos客户防范恶意软件。在加入Sophos之前,他花了五年时间来管理美国国防高级研究计划局资助的美国政府安全数据研究项目。

希拉里·桑德斯(Hillary Sanders)是Sophos公司的高级软件工程师和数据科学家,她在为Sophos公司发明和产品化神经网络、机器学习和恶意软件相似性分析安全技术方面发挥了关键作用。在加入Sophos之前,希拉里是Premise数据公司的数据科学家。她经常在Black Hat USA和BSides Las Vegas等安全会议上发表演讲。她曾在加州大学伯克利分校学习统计学。评审专家简介

Gabor Szappanos毕业于布达佩斯罗兰大学,获得物理学学位。他的第一份工作是在计算机与自动化研究所为核电站开发诊断软件和硬件。Gabor于1995年开始从事反病毒工作,并于2001年加入VirusBuster,负责处理宏病毒和脚本恶意软件;在2002年,他成为病毒实验室的负责人。2008年至2016年期间,他是反恶意软件测试标准组织(AMTSO)的董事会成员,于2012年加入Sophos并担任首席恶意软件研究员。第1章 恶意软件静态分析基础

在本章中,我们将介绍恶意软件静态分析的基础知识。静态分析是对程序文件的反汇编代码、图形图像、可打印字符串和其他磁盘资源进行分析,是一种不需要实际运行程序的逆向工程。虽然静态分析技术有欠缺之处,但是它可以帮助我们理解各种各样的恶意软件。通过细致的逆向工程,你将能够更好地理解恶意软件二进制文件在攻击目标后为攻击者提供的好处,以及攻击者可以隐藏并继续攻击受感染计算机的方式。正如你将看到的,本章结合了描述和实例,每个部分都介绍了静态分析技术,然后说明其在实际分析中的应用。

我将通过描述大多数Windows程序所使用的可移植可执行(PE)文件格式来开始本章的内容,然后研究如何使用流行的Python库pefile来解析实际场景中的恶意软件二进制文件。紧接着,我会描述诸如导入分析、图形图像分析和字符串分析等技术。在所有示例中,我将向你展示如何使用开源工具应用这些分析技术来对实际场景中的恶意软件进行分析。最后,在本章的末尾,我介绍了恶意软件可能会使恶意软件分析师头疼的方法,并讨论了缓解这些问题的一些方法。

你将在本书的数据目录/ch1中找到本章示例中使用的恶意软件示例。为了演示本章讨论的技术,我们在演示中使用ircbot.exe,这是一个互联网中继聊天(Internet Relay Chat,IRC)机器人,也在日常广泛监测中最常见的恶意软件的示例之一。严格来说,当连接到IRC服务器时,这个程序被设计常驻在目标计算机上。在ircbot.exe控制目标后,攻击者可以通过IRC控制目标计算机,执行控制指令,例如打开网络摄像头偷偷捕获视频、提取目标的地理位置和桌面的截图,以及从目标机器中提取相关文件等。在本章中,我将利用静态分析技术揭示这些恶意软件的功能。1.1 微软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.1.1 PE头

如图1-1底部所示,在DOS头①的上面是PE头②,它定义了程序的一般属性,如二进制代码、图像、压缩数据和其他程序属性。它还告诉我们程序是否是针对32位或64位系统而设计的。PE头为恶意软件分析师提供了基本但有用的情景信息。例如,头里包括了时间戳字段,这个字段可以给出恶意软件作者编译文件的时间。通常恶意软件作者会使用伪造的值替换这个字段,但是有时恶意软件作者会忘记替换,就会发生这种情况。1.1.2 可选头

可选头③实际上在今天的PE可执行程序中无处不在,恰恰与其名称的含义相反。它定义了PE文件中程序入口点的位置,该位置指的是程序加载后运行的第一个指令。它还定义了Windows在加载PE文件、Windows子系统、目标程序(例如Windows GUI或Windows命令行)时加载到内存中的数据大小,以及有关该程序其他的高级详细信息。由于程序的入口点告诉了逆向工程师该从哪里开始进行逆向工程,这个头信息对逆向工程师来说是非常宝贵的。1.1.3 节头

节(section)头④描述了PE文件中包含的数据节。PE文件中的一个节是一块数据,它们在操作系统加载程序时将被映射到内存中,或者包含有关如何将程序加载到内存中的指令。换句话说,一个节是磁盘上的字节序列,它要么成为内存中一串连续字节的字符串,要么告知操作系统关于加载过程的某些方面。

节头还告诉Windows应该授予节哪些权限,比如程序在执行时,是否应该可读、可写或可执行。例如,包含x86代码的.text节通常被标记为可读和可执行的,但是不可写的,以防止程序代码在执行过程中意外修改自身。

图1-1描述了许多节,如.text和.rsrc。执行PE文件时,它们会被映射到内存中。其他如.reloc节的特殊节不会被映射到内存中,我们也将讨论这些节。下面我们来浏览图1-1中显示的节。1..text节

每个PE程序在其节头中包含了至少一个标记为可执行的x86代码节;这些节几乎总是命名为.text⑤。在执行第2章中的程序反汇编和逆向工程时,我们将反汇编.text节中的数据。2..idata节

.idata节⑥,也被称为导入节,包含导入地址表(IAT),它列出了动态链接库和它们的函数。IAT是最重要的PE结构之一,在对PE二进制文件进行最初的分析时需要查看它,因为它指出了程序所调用的库,然而这些调用反过来又可能会泄露恶意软件的高级功能。3.数据节

在PE文件结构中的数据节可以包括.rsrc、.data和.rdata等节,它们存储程序使用的鼠标光标图像、按钮图标、音频和其他媒体等。例如,图1-1中的.rsrc节⑦包含了程序用于将文本呈现为字符串的可打印字符串。

.rsrc(资源)节中的信息对恶意软件分析师是非常重要的,因为通过检查PE文件中的可打印字符串、图形图像和其他资产,他们可以获得关于文件功能的重要线索。在1.3节中,你将了解如何使用icoutils工具包(包括icotool和wrestool)从恶意软件二进制文件的资源节中提取图形图像。然后,在1.4节中,你将学习如何从恶意软件资源节中提取可打印的字符串。4..reloc节

PE二进制文件的代码并非是与位置独立的,这意味着如果将它从预期的内存位置移动到新的内存位置,它将无法正确执行。.reloc节⑧在不破坏代码的情况下通过允许移动代码来解决这个问题。如果一个PE文件的代码已被移动,它就告诉Windows操作系统将该文件的代码中进行内存地址转换,这样代码仍可以正确运行。这些转换通常涉及在内存地址中添加或减去偏移量。

虽然在你的恶意软件分析中,PE文件的.reloc节可能包含你想要使用的信息,但是我们在这本书中不会进一步讨论它,因为我们的重点是将机器学习和数据分析应用于恶意软件,而不是那种涉及重新定位的核心逆向工程。1.2 使用pefile解析PE文件格式

由Ero Carerra编写和维护的Python模块pefile已经成为解析PE文件的一个行业标准的恶意软件分析库。在本节中,我将向你展示如何使用pefile来解析ircbot.exe。你可以在本书附带虚拟机中的~/malware_data_science/ch1/data目录中找到ircbot.exe文件。代码清单1-1假设ircbot.exe已位于你当前的工作目录中。

输入以下命令安装pefile库,以便我们可以在Python中导入它:

现在,使用代码清单1-1中的命令启动Python,导入pefile模块,然后使用pefile打开并解析PE文件ircbot.exe。

代码清单1-1 加载pefile模块并解析PE文件(ircbot.exe)

我们实例化pefile.PE,它是PE模块实现的核心类。它解析PE文件,以便我们可以查看它们的属性。通过调用PE构造函数,我们加载并解析指定的PE文件,在本例中为ircbot.exe。现在我们已经加载并解析了这个文件,运行代码清单1-2中的代码从ircbot.exe的pe字段中提取信息。

代码清单1-2 遍历PE文件的各个节并打印有关它们的信息

代码清单1-3显示了打印输出的内容。

代码清单1-3 使用Python的pefile模块从ircbot.exe中提取节数据

如代码清单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镜像ircbot.exe的IAT。

代码清单1-4 从ircbot.exe中提取导入信息

代码清单1-4会生成如代码清单1-5所示的输出(为了简洁起见,输出进行了截断)。

代码清单1-5 ircbot.exe的IAT表内容,其显示了这个恶意软件使用的库函数

如代码清单1-5所示,这个输出对于恶意软件分析很有价值,因为它列出了恶意软件声明和将引用的丰富的函数数组。例如,输出的前几行告诉我们,恶意软件将使用WriteFile①写入文件,使用CreateFileA②打开文件,并使用CreateProcessA③创建新的进程。虽然这些只是关于恶意软件的基本信息,但它们是了解恶意软件更为详细行为的开始。1.3 检查恶意软件的图片

要了解恶意软件是如何设计来捉弄攻击目标的,让我们看看在它的.rsrc节中所包含的图标。例如,恶意软件二进制文件常常被设计成伪装的Word文档、游戏安装程序、PDF文件等常用软件的图标来欺骗用户点击它们。你还可以在恶意软件中找到攻击者自己感兴趣程序中的图像,例如攻击者为远程控制受感染机器而运行的网络攻击工具和程序。回到我们的样本图像分析,你可以在本章的数据目录中找到名为fakepdfmalware.exe的这个恶意软件样本。这个样本使用Adobe Acrobat图标诱骗用户认为它是一个Adobe Acrobat文档,而实际上它是一个恶意的PE可执行文件。

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

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

我们首先使用mkdir images创建一个目录来保存提取的图像。接下来,我们使用wres-tool从fakepdfmalware.exe中提取图像资源(-x)到/images目录,然后使用icotool提取(-x)并将Adobe中.ico图标格式中的所有资源转换(-o)为.png图形,以便我们可以使用标准的图像浏览工具查看它们。如果你的系统上没有安装wrestool,你可以从http://www.nongnu.org/icoutils/下载。

一旦你使用wrestool将目标可执行文件中的图像转换为PNG格式,你就可以在你喜欢的图像浏览工具中打开它们,并以各种分辨率查看Adobe Acrobat图标。正如我在这里给出的例子所示,从PE文件中提取图像和图标相对简单,可以快速显示与恶意软件二进制文件相关的有趣且又有用的信息。同样地,我们可以轻松地从恶意软件中提取可打印字符串来获取更多信息,我们接下来会做这项工作。1.4 检查恶意软件的字符串

字符串是程序二进制文件中可打印字符的序列。恶意软件分析师通常依赖恶意样本中的字符串来快速了解其中可能发生的情况。这些字符串通常包含下载网页和文件的HTTP和FTP命令,用于告诉你恶意软件连接到的地址的IP地址和主机名等类似信息。有时,即使用于编写字符串的语言也有可能暗示恶意软件二进制文件的来源国,尽管这可能是伪造的。你甚至可以在一个字符串中找到一些文本,它们用网络用语解释了恶意二进制文件的用途。

字符串还可以显示有关二进制文件的更多技术信息。例如,你可能会发现有关用于创建二进制文件的编译器、编写二进制文件所使用的编程语言、嵌入式脚本或HTML等信息。虽然恶意软件作者可以对所有这些痕迹进行混淆、加密和压缩等处理,但是即便是高水平的恶意软件作者也经常会暴露并留下一些痕迹,因此在分析恶意软件时,对镜像的字符串进行细致检查显得尤为重要。1.4.1 使用字符串程序

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

该命令将文件中的所有字符串逐行打印到终端上。在末尾添加|less可以防止字符串在终端上跨屏显示。默认情况下,strings命令查找所有最小长度为4字节的可打印字符串,但是你可以设置不同的最小长度并更改“命令手册”中所列各种其他参数。我建议只使用默认的最小字符串长度4,但是你可以使用-n选项更改最小字符串长度。例如,“string-n 10 filepath”只提取最小长度为10字节的字符串。1.4.2 分析镜像字符串

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

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

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

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

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

代码清单1-8 显示恶意软件有一个攻击者可以连接的HTTP服务器的字符串输出

代码清单1-8显示了ircbot.exe用于实现HTTP服务器的各种HTTP样板程序。此HTTP服务器可能允许攻击者通过HTTP连接到目标计算机以发出命令,例如获取受害者桌面的屏幕截图并将其回传给攻击者的命令。我们在整个代码清单中看到了HTTP功能的证据。例如,从Internet资源请求数据的GET方法①。HTTP/1.0200 OK②这一行是一个返回状态代码200的HTTP字符串,表明HTTP网络事务都运行良好,而Server:myBot③表明HTTP服务器的名称是myBot,这是ircbot.exe附加的一个内置HTTP服务器。

所有这些信息都有助于理解和阻止特定的恶意软件样本或恶意活动。例如,知道恶意软件样本有一个HTTP服务器,当你连接到它时,它会输出特定的字符串,这样你就可以借此扫描你的网络来识别受感染的主机。1.5 小结

在本章中,你大致对静态恶意软件分析有了一定的认识,其中包括在不实际运行的情况下检查恶意软件程序。你了解了定义Windows操作系统.exe和.dll文件的PE文件格式,还了解了如何使用Python库pefile解析实际场景中的恶意软件ircbot.exe二进制文件。你还使用图像分析和字符串分析等静态分析技术,从恶意软件样本中提取更多的信息。第2章继续讨论静态恶意软件分析,重点分析可以从恶意软件中恢复的汇编代码。第2章 基础静态分析进阶:x86反汇编

要彻底了解恶意程序,我们通常需要对节、字符串、导入和图像等基础静态分析进一步深入,对程序的汇编代码进行逆向工程。实际上,反汇编和逆向工程是对恶意软件样本进行深入静态分析的核心。

由于逆向工程可以说是一门艺术、技术工艺和科学,因此对其深入的探讨超出了本章的范围。我的目标是向你介绍逆向工程以便你将其应用于恶意软件数据科学之中。了解这种方法对于成功地将机器学习和数据分析应用于恶意软件至关重要。

在本章中,我将从理解x86反汇编所需的概念开始。在本章的后面部分,我将介绍恶意软件作者如何试图绕过反汇编分析,并讨论减轻这些对抗分析和对抗检测操作的方法。但首先,让我们回顾一些常见的反汇编方法以及x86汇编语言的基础知识。2.1 反汇编方法

反汇编是将恶意软件的二进制代码转换为有效的x86汇编语言的过程。恶意软件作者通常使用C或C++等高级语言编写恶意软件程序,然后使用编译器将源代码进行编译生成x86二进制代码。汇编语言是这种二进制代码的可读表示形式。因此,将恶意软件程序反汇编成汇编语言是了解其核心行为的必要手段。

不幸的是,反汇编并非易事,因为恶意软件作者经常使用一些技巧来阻挠逆向工程。事实上,面对故意的混淆,完美的反汇编是计算机科学中一个尚未解决的问题。目前,仅存在近似的、容易出错的方法可以用来反汇编这些程序。

例如,考虑自修改代码的情况,即在执行时修改自身的二进制代码。正确反汇编这段代码的唯一方法是理解代码修改自身的程序逻辑,但这可能非常复杂。

由于目前要达到完美的反汇编是不可能的,我们必须使用不完善的方法来完成这项任务。我们使用的方法是线性反汇编,这涉及在可移植可执行(PE)文件中识别那些与其x86程序代码相对应的连续字节序列,然后解码这些字节。这种方法的主要局限性是它忽略了CPU在程序执行过程中如何解码指令的细微差别。此外,它也无法解析恶意软件作者有时使用的使程序更难分析的各种混淆。

逆向工程的其他方法,如IDA Pro等专业级反汇编器使用的更复杂的反汇编方法,我们在这里就不讨论了。这些更高级的方法实际上是模拟或推理程序执行,以发现程序可能通过一系列条件分支达到哪些汇编指令。

尽管这种类型的反汇编比线性反汇编更精确,但它比线性反汇编方法占用的CPU资源要多得多,这使得它不太适合数据科学的目的,因为数据科学的重点是对数千甚至数百万的程序进行反汇编。

但是,在开始使用线性反汇编进行分析之前,你需要回顾一下汇编语言的基本组件。2.2 x86汇编语言基础

汇编语言是给定体系结构中最低级别的人类可读编程语言,它与特定CPU体系结构的二进制指令格式紧密对应。汇编语言的一行几乎总是等价于单个CPU指令。因为汇编语言的级别很低,所以通常可以使用正确的工具从恶意软件二进制文件中轻松地提取出来。

要达到阅读反汇编后恶意软件x86代码的基本熟练程度比你想象的要容易,这是因为大部分恶意软件汇编代码在大多数时间都是通过Windows操作系统的动态链接库(DLL)调用操作系统,这些库文件在运行时被加载到程序内存中。恶意软件程序使用DLL来完成大部分实际工作,例如修改系统注册表、移动和复制文件、建立网络连接以及通过网络协议进行通信等。因此,跟踪恶意软件汇编代码通常需要了解汇编语言进行函数调用的方式以及了解各种DLL调用的作用。当然,事情可能会变得更加复杂,但是了解这些可以揭示很多关于恶意软件的信息。

在下面的部分中,我将介绍一些重要的汇编语言概念。我还将解释一些如控制流和控制流图等的抽象概念。最后,我们对ircbot.exe程序进行反汇编,并探讨其汇编代码和控制流程是如何指引我们了解它的目的的。

x86汇编语言有两种主要的语法:Intel和AT&T。在本书中,我使用的是Intel语法,目前所有主要的反汇编工具中都支持该语法,并且也是Intel官方的x86 CPU文档中使用的语法。

下面我们先来看看CPU寄存器。2.2.1 CPU寄存器

寄存器是x86 CPU执行计算的小型数据存储单元。由于寄存器位于CPU内部,寄存器的访问速度比内存的访问速度快几个数量级。这就是为什么核心计算操作,如算术和条件测试指令,都是针对寄存器而言的。这也是CPU使用寄存器存储正在运行的程序状态的相关信息的原因。尽管有经验的x86汇编程序员可以使用许多寄存器,但我们在这里只关注几个重要的寄存器。1.通用寄存器

通用寄存器就像汇编程序员的暂存空间。在32位系统中,每个寄存器包含32位、16位或8位空间,我们可以在这些空间执行算术运算、按位运算、字节顺序交换操作等。

在常见的计算工作流程中,程序将数据从内存或外部硬件设备移入寄存器,对这些数据执行一些运算,然后将数据移回内存进行存储。例如,要对一个长列表进行排序,程序通常从内存的数组中提取列表项,在寄存器中对它们进行比较,然后将比较结果写回到内存中。

要了解Intel 32位架构中通用寄存器模型的一些细微差别,请看图2-1。图2-1 x86架构中的寄存器

纵轴显示通用寄存器的布局,横轴显示EAX、EBX、ECX和EDX是如何细分的。EAX、EBX、ECX和EDX是32位寄存器,其中包含更小的16位寄存器:AX、BX、CX和DX。如图所示,这些16位寄存器可以再细分为高位和低位的8位寄存器:AH、AL、BH、BL、CH、CL、DH和DL。尽管这对EAX、EBX、ECX和EDX中的细分寄存器进行寻址有时很有用,但你通常会看到对EAX、EBX、ECX和EDX的直接引用。2.堆栈和控制流寄存器

堆栈管理寄存器存储有关程序堆栈的关键信息,程序堆栈负责存储函数的局部变量、传递给函数的参数以及与程序控制流相关的控制信息。下面我们来浏览这些寄存器。

简单来说,ESP寄存器指向当前执行的函数堆栈的顶部,而EBP寄存器指向当前执行的函数堆栈的底部。这对于现代程序来说是非常关键的信息,因为这意味着通过引用相对于堆栈的数据而不是使用它的绝对地址,面向过程和面向对象的代码可以更优雅和更有效地访问局部变量。

虽然你不会在x86汇编代码中看到对EIP寄存器的直接引用,但它在安全性分析中非常重要,特别是在漏洞研究和缓冲区溢出漏洞利用等情景中。这是因为EIP包含当前正在执行的指令的存储器地址。攻击者可以使用缓冲区溢出漏洞利用代码间接破坏EIP寄存器的值,进而可以控制程序的执行。

除了在漏洞利用过程中起到作用外,EIP在分析恶意软件的恶意代码方面也很重要。我们可以使用调试器随时查看EIP的值,这有助于我们了解恶意软件在任何特定时刻所执行的代码。

EFLAGS是一个包含CPU标志位的状态寄存器,CPU标志位是存储程序当前执行状态的状态信息位。EFLAGS寄存器对于在x86程序中创建条件分支过程或者由于if/then类型程序逻辑的结果而导致执行流程变化的过程非常重要。具体来说,每当一个x86汇编程序检查一个值是否大于或小于零,然后基于这个测试的结果跳转到某个函数时,EFLAGS寄存器会起到启用作用,更详细的内容在2.2.3节中进行描述。2.2.2 算术指令

指令在通用寄存器上运行。你可以利用通用寄存器使用算术指令进行简单的计算。例如,add、sub、inc、dec和mul是你在恶意软件逆向工程中经常会遇到的算术指令示例。表2-1列出了一些基本指令及其语法的示例。表2-1 算术指令

add指令是对两个整数进行相加,并将结果存储在指定的第一个操作数中,根据语法这里可以是内存位置也可以是寄存器。请记住,只有一个参数可以是内存位置。sub指令类似于add指令,区别是它是减去一个整数。inc指令是递增寄存器或内存位置中的整数值,而dec指令是递减寄存器或内存位置中的整数值。2.2.3 数据传送指令

x86处理器为在寄存器和存储器之间传送数据提供了一组强大的指令。这些指令提供了使我们能够操作数据的基本机制,主存储器数据传送指令是mov指令,表2-2显示了如何使用mov指令来传送数据。表2-2 数据传送指令

与mov指令相关,lea指令将指定的绝对内存地址加载到寄存器中,用于获取内存位置的指针地址。例如,lea edx,[esp-4]从ESP的值中减去4并将结果值加载到EDX中。1.堆栈指令

x86汇编语言中的堆栈是一种允许你将值压入或弹出堆栈以进行数据存取的数据结构。这与你在一叠盘子的顶部添加和取出盘子的过程类似。

因为控制流通常是通过x86程序集中的C语言风格的函数调用来表示的,并且因为这些函数调用使用堆栈来传递参数、分配局部变量,以及记住在函数执行完毕后要返回到程序的哪个部分,所以堆栈和控制流需要在一起进行了解。

当程序员希望将寄存器的值保存到堆栈中时,push指令将值压入到程序堆栈中,pop指令将堆栈中的值删除并将它们存入指定的寄存器。

push指令使用以下语法执行其操作:

在本例中,程序将堆栈指针(寄存器ESP)指向一个新的内存地址,从而为值(1)腾出空间,这个值现在存储在堆栈的顶部位置。然后,它将参数中的值复制到CPU刚刚在堆栈顶部腾出的空间的内存位置。

让我们将其与pop指令进行对比:

程序使用pop指令从堆栈顶部弹出值并将其存入指定的寄存器。在这个例子中,pop eax这条指令将堆栈中最顶部的值弹出并将其存入到eax寄存器中。

关于x86程序堆栈,需要理解的一个不直观但很重要的细节是,它在内存中的地址增长是向下的,因此堆栈上最高位置的值实际上存储在堆栈内存中的最低地址。当你对存储在堆栈上数据进行引用的汇编代码进行分析时,记住这一点非常重要,因为除非你知道堆栈的内存布局,否则很快就会变得混乱。

因为x86堆栈在内存中向下增长,当push指令在程序堆栈上为一个新的值分配空间时,它会减小ESP的值,使其指向内存中较低的位置,然后将目标寄存器中的值复制到内存位置,从堆栈的顶部地址开始并逐渐增长。相反,pop指令实际上是从堆栈中拷贝并弹出顶部值,然后增加ESP的值,这样它就指向更高的内存位置。2.控制流指令

x86程序的控制流定义了程序可能执行的指令序列网络,具体取决于程序可能接收到的数据、设备交互以及程序可能接收的其他输入。控制流指令定义了一个程序的控制流。它们比堆栈指令更复杂,但仍然非常直观。由于控制流通常通过x86汇编语言中C语言风格的函数调用来表示,所以堆栈和控制流密切相关。由于这些函数调用使用堆栈传递参数、分配局部变量,并且记住在函数完成执行后返回到程序的哪个部分,这也体现了它们之间的相关性。

在x86汇编语言中,就程序如何调用函数以及这些函数执行完毕后程序如何从函数返回而言,call和ret指令在控制流指令中是最重要的部分。

call指令用于调用一个函数。你可以将其视为可以用像C语言这样的高级语言编写的函数,使得程序可以在调用call指令并完成函数执行之后返回到指令中。你可以使用以下语法调用call指令,address表示函数代码在内存中的起始位置:

call指令有两个作用。首先,它将函数调用后返回的将要执行的指令地址压入堆栈的顶部,这样程序就知道了在所调用函数完成执行后返回的地址。其次,call指令将EIP寄存器的当前值替换为address操作数指定的值。然后,CPU从EIP所指向的新的内存位置开始执行。

就像call指令启动函数调用一样,ret指令用来结束一个函数。你可以单独使用ret指令而不使用任何参数,如下所示:

当ret指令被调用时,堆栈顶部的值将被弹出,这是我们所期望的保存在程序计数器的值(EIP),这个值在call指令被调用时,由call指令压入堆栈。然后它将弹出的程序计数器值放回EIP寄存器并继续执行。

jmp指令是另一个重要的控制流结构,它的操作比call指令简单。jmp指令只是告诉CPU移动到由其参数指定的内存地址并从那里开始执行,而不需要担心保存EIP的值。例如,jmp 0x12345678告诉CPU在下一条指令时开始执行存储在内存地址0x12345678处的程序代码。

你可能想知道如何使jmp和call指令以条件方式执行,例如“如果程序收到一个网络数据包,则执行以下函数。”答案是x86汇编语言没有像if、then、else、else if等的高级结构。相反,在程序代码中分支选择到一个地址进行执行通常需要两条指令:一条是cmp指令,它根据一些测试值检查某些寄存器中的值,并将该测试的结果存储在

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载