回归最本质的信息安全

恶意软件中的符号解析

2017年9月29日发布

59,226
0
0

导语:本文会介绍恶意软件用来掩盖其对Windows API访问的几种常见技术,在分析人员对其行为进行检测的两种形式中,都必须计算API起始地址,并从运行时的进程中解析符号以确定其功能。

timg (1).jpg

本文会介绍恶意软件用来掩盖其对Windows API访问的几种常见技术,在分析人员对其行为进行检测的两种形式中,都必须计算API起始地址,并从运行时的进程中解析符号以确定其功能。

技术分析

执行分析时,我们经常可以看到恶意软件试图掩盖其使用的API。所以在分析恶意软件时,确定分析哪个API以确定代码的功能是我们必须解决的第一件事情。

我们将在本文中介绍两个常见的混淆,分别是编码函数指针表和绕行样式钩子存根。在这两种情况下,API的入口点在二进制文件中都不会直接显示。

为了方便介绍,请你阅读图1中的代码,该代码是从xdata crypto ransomware示例C6A2FB56239614924E2AB3341B1FBBA5的内存转储中获取的,下图是来自加密勒索软件样本的API混淆代码。

1.png

在上图中,我们看到一个数值被加载到eax中,与另一个进行异或运算,然后被调用为一个函数指针。这些数字只有在运行过程的上下文中才有意义,我们可以从内存转储中包含的值计算最终值,但是我们还需要一种方法来找到在该特定运行过程中的API地址。我们还必须考虑到由于首选基地址的冲突和启用了ASLR的系统,DLL可能会被重新引导。下图显示了我们可以查看最初设置值的位置,该加密恶意软件设置来自API哈希的模糊函数指针。

2.png

在这种情况下,初始值是从API哈希查找中加载的,而不是立即值。在这里,我们可以采取多条路径来解决问题,比如可以搜索已发布的哈希列表,提取哈希值并构建我们自己的数据库,或者找出一种动态解析解码的API地址的方法。

在我们选择要采取的路径之前,让我们考虑另一个例子。下图显示了 Andromeda样本3C8B018C238AF045F70B38FC27D0D640的API重定向代码。

3.png

这段代码是在内存注入中找到的,我们可以从其中看到看起来像是一个绕行模式的trampolin,其中第一条指令是从实际的Windows API中被窃取的,并放置在一个小的Stub上,然后该代码会立即跳回到原来的API + x字节。

在这种情况下,恶意软件会通过这些存根访问所有的API,从反汇编中我们也可以看到被盗指令的长度是可变的。

为了找到这些功能,我们必须做如下准备:

1.列举所有的存根
2.计算第一条指令中有多少字节
3.提取jmp地址
4.减去被盗字节数以找到API入口点
5.解决此特定流程实例的计算地址
6.将存根重命名为有意义的值

在此示例中,寻找设置值的交叉引用不会产生任何结果。

那我们如何最好地解决计算的API地址并将此信息添加回我们的IDA数据库?

其中使用的一种技术就是计算所有最终地址,将其写入二进制文件,将数据注入到进程中,并检查调试器中的表(如下图所示)。由于调试器已经有一个API地址查找表,这样就可以获得我们需要的信息,下图就是来自iDefense MAP的ApiLogger将数据文件注入到进程中并在调试器中检查的结果。

4.png

从这里我们可以提取解析的符号,并编写一个脚本将其整合到我们的IDB中。虽然这很有效,但涉及几个步骤,有点复杂。

使用的工具

我们真正想要的是为流程构建自己的符号查找表,并创建一个直观的方式来从我们的脚本访问它。

但碰到的第一个问题便是,我们如何构建我们自己的API地址查询表以方便查询API名称?要解决这些信息,我们需要采取以下步骤:

1.枚举加载到进程中的所有DLL
2.对于每个DLL,列出导出表并提取函数名称和RVA
3.基于DLL基地址计算API入口点,并导出RVA
4.根据所有这些信息构建查找表

虽然看起来比较复杂,但利用库就可以处理所有的复杂事情了。下图显示了我们为此开发的远程查找工具的截图——开源远程查找应用程序。

5.png

为了让这类型工具的优势充分发挥出来,该工具必须时刻保持有效运行。与这些数据进行接口的最佳方式是什么?这里有几个要考虑的因素,包括数据的提交,接受的输入格式以及工具如何与分析过程的流程相结合。

那么究竟我们如何与它接口呢?为了方便操作,我们选择了三种方法来提交查询:

1. 单独通过文本框

2. 大量通过文件

3. 通过网络上的远程客户端

在输入格式方面,要考虑以下因素:

1.十六进制内存地址
2.不区分大小写的API名称
3.dll_name@ordinal
4.dll_name.export_name

工具输出是CSV列表的形式,包括地址,名称,序数和DLL。

在基础工具功能准备好的前提下,我们仍然需要在分析过程中使用一种有效的方法。虽然单独的查找对于非法查询和测试是不错的,但不是批量的。批量文件查找有时很好,但它仍然需要数据导出或导入才能将结果与IDA数据库集成。

真正需要的是在IDA中运行脚本的方式,计算API地址,然后在运行IDA脚本时内联解析该地址,这允许我们在脚本全部运行的同时重新命名函数和指针,这就是网络客户端能力所在。

另外,还有有很多方法能够做到这些,比如,我们可以选择将网络客户端集成到IDA Jscript的测试版中(如下图所示)。 IDA Jscript是一个开源的IDA脚本工具,具有IDE,包括语法高亮,IntelliSense,功能原型工具提示和调试器,下图就是开源的IDA Jscript解码和解析的API地址。

6.png

在这个例子中,我们看到一个解码xdata指针表的脚本,通过网络解析API地址,然后生成一个IDC脚本来重命名IDA中的指针。

运行此脚本并应用解析结果后,反编译器的输出就会变得清晰可读,下图就是符号解析后的xdata样本的解码器输出。

7.png

返回Andromeda样本,可以使用简单的idajs脚本恢复API信息,下图就是小型idajs脚本来远程解析和重命名Andromeda API钩子存根。

8.png

对于IDAPython用户,也可以使用一个python远程查找客户端。

总结

恶意软件通常会使用掩盖使用的Windows API技术,这些技术会强制恶意软件分析人员必须从运行时数据中提取数据,计算入口点地址,然后在特定运行进程的上下文中解析其含义。

本文介绍了一个可以很好地集成到多个IDA脚本语言中的小型简单的开源工具,该工具允许分析人员简化访问并快速绕过这些类型的混淆所需的数据,以方便继续进行分析。

我们很高兴能够开源远程查找应用程序,以便其他人可以从中受益并根据自己的需要进行调整。

本文翻译自 https://www.fireeye.com/blog/threat-research/2017/06/remote-symbol-resolution.html,如若转载,请注明原文地址: http://www.4hou.com/technology/5725.html

点赞 0
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

xiaohui

xiaohui

嘶吼编辑

发私信

发表评论