- A+
火眼实验室的高级逆向工程(简称“FLARE”)团队继续把知识和工具分享给社区。本系列博文以一个用于“自动化恢复恶意程序中的结构化字符串”的脚本作为开头。像往常一样,你可以下载这些脚本,下载位置https://github.com/fireeye/flare-ida。我们真诚地希望这些脚本能对你有所帮助。
一、动机
在FLARE团队暑假实习期间(PS:唉,俺是没机会了,路费太贵了!),我的目标是开发一个IDA python插件,用于加快在IDA Pro中的逆向工作流程。和团队一起分析恶意代码样本时,我意识到从MSDN网站上查找函数、参数和常量等信息占用了大部分时间。由于要频繁切换到开发手册,逆向过程总是被打断。最终,我们找到了解决方法-把MSDN信息自动整合到IDA Pro。本篇博文介绍的脚本就是用来解决这个问题的,而且接下也会介绍如何使用脚本。
二、介绍
MSDN注释插件整合了函数、参数、返回值等信息,并以注释的形式呈现在IDA Pro反汇编列表中,尽可能的实现了信息的无缝整合。此外,该插件能够自动化重命名常量,进而加快了逆向分析的流程。该插件依赖于一个离线的XML数据库文件,它是结合微软文档和IDA类型库文件生成的。
三、特征
表1展示了插件能够为逆向分析专家提供的帮助。在表的左侧,你看到的是IDA Pro标准的反汇编窗口:7个参数入栈,然后调用函数CreateFileA。通常来说,一个分析师不得不从文档中查找函数、参数或常量的描述,从而理解这块代码是干嘛滴!为了获得常量值的可读形式,分析师需要研究相应的参数,把标准的枚举类型导入到IDA中,然后手动重命名。表的右侧显示的是我们的脚本执行后的结果,为逆向分析师提供了更多的帮助。
最明显的变化是常量能够被自动重命名。在这个例子中,40000000h被自动的转换为GENERIC_WRITE。此外,每个函数参数都被重命名为唯一值,因此相应的描述也可以被添加到反汇代码中。
表1:标准符号常量的自动化标记
在图1中,你能清楚地看到该插件在反汇编代码中如何显示函数、参数以及常量信息。顶部的图片显示的是当鼠标悬停在CreateFileA函数上时,可以查看到简单介绍和返回值。在中间的图片中,当鼠标悬停在hTemplateFile参数上时,可以查看相应的描述。在底部的图片中,当鼠标悬停在dwShareMode上时,该自动化重命名的常量会显示一些描述信息。
函数
参数
常量
图1.当鼠标悬停在函数名、参数和常量上时会显示相应的描述信息
四、工作原理
在插件对反汇编代码产生任何改变之前,它会备份当前的IDB文件(IDA数据库文件)。该文件会存储在当前数据库的目录下,用于恢复以前的标记,以防你不喜欢插件对反汇编代码的更改或出现了问题。
该插件适合在分析之前对样本代码运行一次。它依赖于一个离线数据库,产生自MSDN文档和IDA Pro类型库文件(.til)。对于导入表中引用的每个函数,该插件都会注解函数描述和返回值,添加参数描述以及重命名常量。图2描述的是一个已注释的导入表的示例。它展示了一个描述性的注释如何添加到每个API函数调用。参数位于函数调用的前面,以便标识出指令的地址,该插件依赖于IDA Pro标记。
图2:已注释的导入表
图3显示了一个插件创建的.msdn段,主要用于存储参数描述。这只会影响IDA的数据库文件,不会修改原始的二进制文件。
图3. 额外添加到IDA数据库的段
.msdn段中存储了参数的描述信息,如图4所示。独一无二的参数名和相应描述性的注释被顺序的添加到该段中。
图4. 名字和注释都被插入到参数描述
为了让用户通过悬停鼠标就能查看到常量的描述信息,插件导入了IDA Pro中标准的枚举类型,并给枚举成员添加了描述性的注释。图5显示了MACRO_CREATE枚举类型,存储了通过参数dwCreationDisposition传递给函数CreateFilaA的常量值。
图5.添加枚举成员的描述
五、准备MSDN数据库文件
插件的图形化接口需要安装QT框架和Python,已经包含在IDA Pro 6.6发行版中。你也可以在IDA 6.5的环境中使用插件,具体设置参考如下 (http://www.hexblog.com/?p=333).
就如开始提到的,插件需要一个XML数据库文件,用于存储MSDN文档。我们不能让这个数据文件和插件一起发布,因为MSDN文档的版权是微软的。甭怕,我们提供一个生成这个数据库文件的脚本。脚本和插件都可以从git仓库(https://github.com/fireeye/flare-ida)下载下来。
你可以参照以下步骤创建数据文件,只需执行一次就O了。
1. 下载并安装离线MSDN文档,下载链接:http://www.microsoft.com/en-us/download/details.aspx?id=18950.尽管不是最新的SDK版本,但是它包含了所需的全部信息,而且数据可以直接被提取。如图6所示,你可以只选择安装帮助文档,默认的安装目录是C:\ProgramFiles\Microsoft SDKs\Windows\v7.0\Help\1033.
图6. 安装MSDN文件的本地副本
2. 利用解压软件(如7-zip)解压MSDN文档到指定目录。
3. 从Hex-Rays网站上下载tilib.exe,链接如下: https://www.hex-rays.com/products/ida/support/download.shtml
为了让插件能够重命名常量,插件需要知道需要导入哪些标准的枚举类型。IDA Pro把这些信息存储在位于%IDADIR%/til/的TIL文件中。Hey-Rays提供一个工具(tillib)用于显示TIL文件内容。把下载的tillib文件解压到%IDADIR%目录中。如果你不加任何参数运行tilib,并看到了它的帮助信息,说明程序正确地运行起来了。
4. 运行MSDN_crawler/msdn_crawler.py <已解压的MSDN文件的目录 > < tilib.exe所在的目录> < til文件所在的目录>
如果提前条件都满足,你就可以运行位于MSDN_crawler目录中的MSDN_crawler.py脚本。脚本需要TIL文件的目录(通常为%IDADIR%/til/pc/)和已解压的MSDN文档的目录。当脚本运行完之后,最终的XML数据库文件就位于MSDN_data 目录中。
现在就去IDA中运行我们的插件给反汇编代码添加注释吧!
六、运行MSDN注释插件
在IDA中,通过菜单”File->Script File…”(或快捷键 ALT+F7)打开名为annotate_IDB_MSDN.py的脚本。然后出现如图7所示对话框,允许你配置插件的功能。默认情况下,插件会注释函数、参数以及重命名常量。如果你修改了配置,并通过点击“OK”执行插件,配置信息会存储在位于插件目录中的一个配置文件。这样就允许你重用以前的配置在其他的样本中运行插件。如果你没有配置注释函数或参数,你将鼠标悬停在这类元素(函数或参数)上时,就不会出现相应的描述信息了。
图7. 插件的配置窗口
当你对函数配置成了“可重复性注释”,在反汇编列表中函数的描述信息是可见的,如图8所示。
图8.当设置成“可重复性注释”时,函数注释的预览
七、类似工具和已知的缺陷
部分解决方案借鉴了现有的IDAPro插件,例如IDAScope和IDAAPIHelp。在此对Zynamics团队表达最真挚的谢意,他们的MSDN crawler和IDA importer给我们的研发提供了极大的帮助。
插件主要在Windows环境下的IDA Pro上测试通过,应该也可以在其他系统环境下运行。由于MSDN文档的结构和MSDN crawler工具的缺陷,并不是所有的常量都能被自动解析。当你遇到缺失信息的情况,你可以在MSDN_data目录添加一些文件来手动扩展数据库。为了保证扩充文件能够被正确的处理,这些文件必须是有效的XML文件,并且符合主数据库文件(madn_data.xml)中给定的结构(XML Schema)。如果你打算部分扩展已有函数的信息,你只需要添加额外的字段。为了标识相应的元素,必须为这些额外字段添加名字标签(name tag)。
例如,如果解析器不能识别一个常用的常量,你可以手动添加注释信息。对于CreateFileA函数中的dwDesiredAccess参数,需要添加的信息类似于列表1:
<?xml version= <?xml version=”1.0″ encoding=”ISO-8859-1″?> <msdn> <functions> <function> <name>CreateFileA</name> <arguments> <argument> <name>dwDesiredAccess</name> <constantsenums=”MACRO_GENERIC”> <constant> <name>GENERIC_ALL</name> <value>0×10000000</value> <description>All possibleaccess rights</description> </constant> <constant> <name>GENERIC_EXECUTE</name> <value>0×20000000</value> <description>Executeaccess</description> </constant> <constant> <name>GENERIC_WRITE</name> <value>0×40000000</value> <description>Writeaccess</description> </constant> <constant> <name>GENERIC_READ</name> <value>0×80000000</value> <description>Readaccess</description> </constant> </constants> </argument> </arguments> </function> </functions> </msdn>
列表1. 添加的信息增强了对CreateFileA函数的dwDesiredAccess参数的理解
八、结论
本篇博文演示了如何生成一个MSDN数据库文件,用于插件自动化的给IDA Pro反汇编代码中的函数、参数和常量添加注释信息。此外,我们还讨论了插件如何工作,如何配置以及定制插件。我们希望这个插件能够加快你的分析过程。
[原文出处:http://www.fireeye.com/blog/technical/2014/09/flare-ida-pro-script-series-msdn-annotations-ida-pro-for-malware-analysis.html]
水平有限,错误难免,欢迎批评指正!本人也做过一些逆向工作,对文中提到的问题也深有体会,真希望多开源一些分析工具,减轻逆向分析工作的劳动强度
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫