前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >火眼(FireEye)实验室FLARE IDA Pro脚本系列:MSDN注释插件

火眼(FireEye)实验室FLARE IDA Pro脚本系列:MSDN注释插件

作者头像
FB客服
发布2018-02-05 10:25:42
2.9K0
发布2018-02-05 10:25:42
举报
文章被收录于专栏:FreeBufFreeBuf

作者 Rabbit_Run

火眼实验室的高级逆向工程(简称“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:‍‍

代码语言:javascript
复制
<?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]

‍‍水平有限,错误难免,欢迎批评指正!本人也做过一些逆向工作,对文中提到的问题也深有体会,真希望多开源一些分析工具,减轻逆向分析工作的劳动强度

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 七、类似工具和已知的缺陷
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档