欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

flare-emu的分析功能被进一步拓展

来源:本站整理 作者:佚名 时间:2019-09-02 TAG: 我要投稿


IDAPython 库 flare-emu团队新开发的一个库,这个库是依赖于 IDA Pro 和 Unicorn 模拟框架,并为让逆向工程师可以通过脚本对代码的功能进行模拟,Unicorn 支持 x86, x86_64, ARM 以及 ARM64 架构。
flare-emu为用户的脚本模拟提供了一个易于使用并且灵活的接口,旨在为不同的体系架构设置灵活且健壮的模拟器的所有基础工作,这样你就可以专注于解决代码分析的问题。
5个不同的接口
它目前提供了5个不同的接口来处理你的代码模拟需求,而且它还有一系列相关的帮助和工具函数。
1.emulateRange
这个API能够在用户指定的上下文中模拟一系列指令或函数,对于用户定义的钩子,它既可用于单个指令,也可以用于在调用 call 指令的时候,用户可以决定模拟器是单步跳过还是单步执行(进入函数调用)。此接口为用户提供了一种为指定寄存器和栈参数指定值的简便方法。如果指定了字节串,则将其写入模拟器的内存,并将指针写入寄存器或栈变量。模拟后,用户可以使用flare-emu的实用效用函数从模拟内存或寄存器中读取数据,或使用返回的Unicorn模拟对象进行直接探测。
此外, flare-emu 还提供了一个对于 emulateRange 的一个小的封装,名为 emulateSelection,可以用来模拟当前在 IDA Pro 中突出显示的部分指令。如果 flare-emu 没有提供你需要的一些功能,你可以直接使用返回的 Unicorn 模拟器对象。
2. iterate
这个API是用来强制模拟函数中的特定分支,以达到预期的运行路径。用户可以指定一个目标地址列表,或者指定一个函数的地址,从该函数中使用对该函数的交叉引用列表作为目标,以及一个用于到达目标时的回调。程序会执行到给定的目标地址上,尽管当前的条件可能会跳转到其他的分支上。
与emulateRange API类似,也提供了用户定义的钩子选项,用于单独的指令和何时遇到“调用”指令。iterate API的一个例子是实现与我们的argtracker工具类似的功能。
3.emulateBytes
这个API提供了一种简单模拟一个外部 shellcode 的方法,提供的字节不会添加到IDB,只是直接的模拟执行,这对于准备模拟环境非常有用。例如,flare-emu本身使用此API来操作ARM64 CPU的模型特定寄存器(MSR),该模块不是由Unicorn公开的,以便启用向量浮点(VFP)指令和寄存器访问。与emulateRange一样,如果 flare-emu 没有提供你需要的一些功能,你可以直接使用返回的 Unicorn 模拟器对象。
4.iterateAllPaths
这个API非常类似于iterate,只提供目标函数,不提供目标地址,它将尝试查找所有路径并进行模拟。这在执行代码分析时非常有用,因为代码分析需要访问函数的每个基本块。
5.emulateFrom
这个API在函数边界未明确定义的情况下非常有用,因为混淆处理过的二进制文件或shellcode通常就是这样定义的。只要你提供了一个起始地址,它将进行模拟,直到没有任何东西可以模拟,或者你在其中一个钩子中停止进行模拟。这可以通过将strict参数设置为False来调用,并启用动态代码进行探测,flare-emu将让IDA Pro在模拟过程中执行指令。
安装
要安装flare-emu,只需将flare_emu.py和flare_emu_hooks.py放入IDA Pro的python目录,然后将其作为IDApython脚本中的模块导入,flare-emu依赖于Unicorn及其Python绑定。
注意事项
flare-emu是使用新的IDA Pro 7x API编写的,它不与以前版本的IDA Pro版本不兼容。
具体用法
虽然flare-emu可用于解决许多不同的代码分析问题,但其更常见的用途之一是帮助研究人员解密恶意软件二进制文件中的字符串。 在此,我们简单提一下FLOSS,FLOSS是一个很好的工具,通常可以通过尝试识别字符串解密函数并使用模拟来解密在每次交叉引用时传入的字符串来自动执行此操作。但是,FLOSS并不总是能够识别这些函数并使用其通用方法正确模拟它们。有时你需要做更多的工作。此时,就是flare-emu大显身手的机会了。只要你使用顺手了,flare-emu就可以为你节省很多时间。下面,就让我们来看看恶意软件分析人员在处理加密字符串时遇到的一些常见场景。
简单的字符串解密场景
如果你已经确定了解密x86_64二进制文件中的所有字符串的函数这个函数就会到处被调用,并解密许多不同的字符串。在IDA Pro中,你可以此函数命名为decryptString。下面就是你的flare-emu脚本,用于解密所有这些字符串,并在每次函数调用时使用解密的字符串作为注释,同时记录每个解密的字符串及其解密的地址。
from __future__ import print_function
import idc
import idaapi
import idautils
import flare_emu
def decrypt(argv):
    myEH = flare_emu.EmuHelper()
    myEH.emulateRange(idc.get_name_ea_simple("decryptString"), registers = {"arg1":argv[0], "arg2":argv[1],
                           "arg3":argv[2], "arg4":argv[3]})
    return myEH.getEmuString(argv[0])
   
def iterateCallback(eh, address, argv, userData):
    s = decrypt(argv)
    print("%016X: %s" % (address, s))
    idc.set_cmt(address, s, 0)
   
if __name__ == '__main__':  
    eh = flare_emu.EmuHelper()
    eh.iterate(idc.get_name_ea_simple("decryptString"), iterateCallback)
在__main__中,我们首先从flare-emu创建一个EmuHelper类的实例,这是我们使用flare-emu做所有事情的类。接下来,我们使用iterate API,为它提供decryptString函数的地址和回调函数的名称,EmuHelper将为模拟的每个交叉引用调用回调函数。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载