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]黑客接单网