IDA Pro 插件的功能详解
IDA Pro是反汇编程序
反汇编程序用于将机器代码转换为人类可读的格式,称为汇编语言。
我们每天使用的软件的源代码并不总是可用。像IDA Pro这样的反汇编程序能够创建其执行的映射,以显示处理器实际以称为汇编语言的符号表示形式执行的二进制指令。通过这种反汇编过程,软件专家可以分析怀疑是恶意软件的程序,例如间谍软件或恶意软件。但是,汇编语言很难阅读和理解。这就是为什么在IDA Pro中实施了高级技术以使该复杂代码更具可读性的原因。在某些情况下,可以将二进制程序还原到相当接近的水平,还原为产生二进制程序的原始源代码。然后可以对该程序的代码图进行后处理以进行进一步调查。
IDA Pro是调试器
调试器是一种计算机程序,可帮助检测和纠正其他计算机程序中的错误。
在软件分析中(就像在现实生活中一样),事情很少是简单明了的。恶意代码通常不与分析人员合作。病毒,蠕虫和特洛伊木马程序的创建者通常以一种混淆的方式编写其代码,这使得阅读和分析变得异常困难。因此,需要更强大的工具来有效地帮助分析师。IDA Pro中的调试器通过允许用户单步执行要研究的代码来补充反汇编程序的静态分析功能(在不执行程序的情况下检查代码);通过这种方式,调试器通常会绕过混淆,并帮助获取功能更强大的静态反汇编程序将能够进行深度处理的数据。
IDA Pro在Windows,Linux和Mac OS X上运行,并且可以调试各种特定平台(Windows 32/64位,Linux 32/64位,OS X x86 / x64,iOS,Android等)。这可以在本地或远程执行。远程调试器对于安全地剖析潜在有害的程序非常有用。一些IDA调试器还可以在虚拟环境中运行该应用程序,从而使恶意软件分析更加安全。
IDA Pro是交互式的
由于在探索未知事物时,目前还没有计算机能击败人脑,因此IDA Pro具有完全的交互性。IDA始终允许人工分析人员覆盖其决策或提供提示。内置的编程语言和开放的插件体系结构进一步提高了交互性。
插件体系结构允许程序在某些时候调用外部代码,而无需事先知道该代码的所有细节。
IDA Pro是可编程的
IDA Pro是一个完整的集成开发环境。它由一种非常强大的类宏语言组成,可用于自动执行从简单到中等复杂性的任务。对于更高级的任务,开放式插件体系结构允许外部开发人员增强IDA Pro的功能。
突出显示控制流传输指令
在对二进制文件进行逆向工程时,遵循控制流传输指令非常重要,特别是那些用于将控制流传输到其他过程的指令。对于x86/64架构,这是通过调用指令完成的。如果您是一名有经验的逆向工程师,您通常可以通过快速查看函数汇编来大致了解函数的功能(尤其是当函数相对较小时)。当要理解一个函数的功能时,您最可能做的第一件事就是检查它有多少调用指令以及它们执行了哪些其他函数。如果一个函数只是执行计算,在内存中存储一些值,而您并不真正关心这些细节,那么您可以跳过这个函数,继续进行逆向工程。当一个函数执行其他函数时,情况就完全不同了;您可以先了解这些函数的功能。
所有用于编写代码的开发环境都支持语法高亮显示,因为它有助于软件编码。但是,语法高光也可以极大地帮助软件反转。让我们快速看一下IDA Pro和其他用于逆向工程的工具提供的语法突出显示功能。
如您所见,Immunity Debugger,x64dbg和radare2都突出显示了控制流传输指令,但没有突出显示IDA Pro。默认的IDA Pro主题看起来很普通。但是,如果转到“选项->颜色…”,则可以使内容变亮。在“ IDA颜色”窗口中,可以为指令助记符、寄存器、地址、常量和变量配置不同的颜色。它使IDA Pro的输出看起来更加令人愉悦,但是并不能完全解决问题,因为所有指令助记符都具有相同的颜色,并且如果您依赖地址突出显示,则不能与间接函数调用一起使用。为什么IDA Pro没有选择突出显示CALL指令的选项?直到今天,这种疏忽困扰着我。似乎不仅仅是我,因为有许多针对同一问题的脚本和插件(例如:Fluor.py和Highlight_calls.py)。这些脚本使用API函数set_color()
/ set_item_color()
在指令后设置背景色。虽然可以肯定地完成了任务,但最终结果可能不如改变某些特定指令助记符的颜色那么好。
在某个时候,我决定检查是否有一种方法可以使用更高级的插件来更改某些特定指令的颜色,并深入到IDA Pro SDK头文件中。我在lines.hpp头文件中找到了要查找的内容,该文件揭示了IDA Pro用于显示反汇编文本的内部格式。事实证明,API函数generate_disassembly()
和generate_disasm_line()
输出反汇编的文本行以及用于实现语法高亮显示的特殊转义序列。如果您将IDc.generate_disasm_line(ea,flags)
与IDAPython一起使用,则这些颜色转义序列将从输出中删除,但是如果您使用,仍可以查看原始的反汇编文本行ida_lines.generate_disasm_line(ea,flag)
颜色转义序列的格式非常简单,典型的颜色序列如下所示:#COLOR_ON #COLOR_xxx text #COLOR_OFF #COLOR_xxx
。#COLOR_ON
等于\ x01
,并且指令助记符的#COLOR_xxx
值定义为COLOR_INSN
并等于\ x05
。结果,CALL指令的反汇编文本行将始终以“ \ x01 \ x05call \ x02 \ x05”
开头。IDA Pro SDK还提供了函数hook_to_notification_point()
,可用于为不同事件安装回调,这些事件包括UI通知ui_gen_idanode_text可以用来为IDA图节点提供自定义文本。因此,计划如下:我们对ui_gen_idanode_text通知进行回调,检查当前地址的反汇编文本行是否以\ x01 \ x05call \ x02 \ x05
开头,如果是,则将ID为的COLOR_INSN
替换为一些其他颜色。
这种方法的问题在于它只能在x86 / 64上使用,但是ARM,MIPS等呢?需要与CPU无关的解决方案。值得庆幸的是,它很容易实现。每个处理器模块都有一个称为LPH
的特殊导出结构(processor_t
)。此结构具有一个instruc
字段,该字段是指向处理器指令数组的指针。该表中的每条指令均由指令助记符及其功能组合表示。这些功能包括修的操作数(CF_CHGX
),使用的操作数(CF_USEX
),是否暂停执行(CF_STOP
),跳转到另一个位置(CF_JUMP
)或调用另一个过程(CF_CALL
)。这意味着在插件启动时,我们可以解析已加载的处理器模块中的指令列表,找到所有具有CF_CALL
功能的指令,并在以后进行比较时使用它们。您可以在下面看到结果。
只要处理器模块正确填充了instruc
表,插件就可以正常工作。到目前为止,我只遇到的问题与PowerPC的,因为在这种特殊情况下,如“bl”和“bctrl”缺少的一切必要的指示instruc
表。但是仍然可以为它们创建解决方法。
已知函数的识别
已知函数的识别是一个巨大的逆向工程问题。您可能会熟悉以下两种情况:
- 您正在对没有调试符号的二进制文件进行逆向工程,该二进制文件与已知库静态链接,并且您想要自动重命名IDA Pro数据库文件中该库中的所有函数。
- 您花了一些时间对没有调试符号的二进制文件进行逆向工程,但是出现了二进制文件的新版本,并且您想将所有重命名的函数移植到新的IDA Pro数据库文件中。
为了解决第一个问题,IDA Pro背后的公司Hex-Rays提出了一种用于存储和应用签名以进行库功能识别的技术。这项技术称为FLIRT。这样就可以使用特殊的工具预处理 .obj 和 .lib 文件,生成带有功能模式和其他必要数据的文件 .pat,然后将其转换为签名文件 .sig。最后,您将获得特定库的签名文件,可以将其放入IDA Pro目录内的“ sig \ < arch>”文件夹中,然后从“视图->打开子视图->签名”将其应用于IDA Pro数据库。 ”窗口。如果库中的功能逐字节匹配IDA Pro数据库中存在的功能,则它们将被识别并正确重命名。
虽然前面描述的方法部分解决了第一个问题,但对第二个问题完全没有帮助。正式地,FLIRT仅提供一种为库创建签名文件的方法,因此不能用于将知识从一个IDA Pro数据库转移到另一个IDA Pro数据库。多年之后,这个问题终于在IDA Pro 7.2中得到了解决。此版本引入了一种称为Lumina服务器的新技术。它可用于推送和检索有关数据库中存在的功能(名称、注释等)的元数据。但是,当您想将此信息从一个数据库转移到另一个数据库而不与世界其他地方共享时,这并没有真正的帮助。这是因为当前只有公共Lumina服务器可用。这意味着执行此操作的唯一方法是使用插件。值得庆幸的是,这类插件已经存在了很长时间。IDA2PAT和IDB2SIG可以用来从现有IDA Pro数据库生成FLIRT文件,然后将其应用于新数据库,就像它是库的常规签名文件一样。它们非常易于使用,如果在新数据库中未标识函数,则可以立即看到它已被更改。原始的IDA2PAT和IDB2SIG插件未维护,因此您可能要使用具有IDA Pro 7.* 支持或现代IDAPython端口idb2pat.py。
如前所述,FLIRT技术的缺点是,仅当签名与功能主体的字节紧密匹配时,它才起作用。例如,当您只有一个库的源代码,而当您尝试编译它的结果与所分析的二进制文件实际上不匹配时,这可能是个问题。在这种情况下,二进制差异会派上用场BinDiff和Diaphora插件的主要功能是,它们不仅可以用于比较不同二进制文件之间的函数,还可以用于端口函数名称和注释。Karta是专门为直接从源代码以二进制形式识别库函数而开发的。您可以在官方网站阅读有关其工作原理的更多信息。
YARA + IDA Pro =❤
YARA是瑞士军刀的图案搭配。它可能是恶意软件研究人员最钟爱的工具。模式匹配在逆向工程中非常有用,YARA就是要使用的工具。下面是一些用法:在IDA Pro数据库中查找重要的常量、magic values和GUIDs,并在找到匹配时打印消息、重命名地址或留下注释。这里的关键是知道你可以寻找YARA和它如何改进你的工作流程。例如,插件findcrypt-yara使用YARA查找公共密码常量。
import idaapi, idautils, idc
import yara
# rules can be compiled from a file path or as string
rules = yara.compile(filepath=file_with_rules)
# iterate all segments present in database
for segment_start in idautils.Segments():
segment_size = get_segm_end(segment_start) - segment_start
# read segment data
data = get_bytes(segment_start, segment_size)
# scan segment data with rules
matches = rules.match(data=data)
# iterate all matched data
for m in matches:
for s in m.strings:
offset = s[0]
name = s[1]
# leave a comment with pattern name at matched offset in database
set_cmt(get_item_head(segment_start+offset), name, 0)
