Virtuailor 是一个 IDAPython 工具,用于重构为 Intel 架构(包括 32 位和 64 位代码)以及 AArch64(新增!)编写的 C++ 代码中的虚表。
该工具由两部分组成:静态部分和动态部分。
首先是静态部分,包含以下功能:
其次是动态部分,包含以下功能:
Virtuailor 现在支持从 IDA 7.0 到最新版本(7.5)的 IDA 版本,如果你使用的 IDA 版本低于 7.4,则需要切换到 beforeIDA-7.4 分支,master 分支支持最新的可用版本(7.5)。
if __name__ == '__main__':
start_addr_range = idc.MinEA() # You can change the virtual calls address range
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
可选(但强烈推荐),创建你的 idb 快照。只需按 ctrl+shift+t 并创建快照即可。
按 File->Run script...,然后转到 Virtuailor 文件夹并选择运行 Main.py,你可以看到下面的 gif 以获得更清晰和直观的解释。

现在 GUI 会提供一个选项让你选择目标范围,如果你想针对整个二进制文件,只需在起始和结束地址中保持默认值并按 OK。
之后,断点会放置在你的代码中,你所要做的就是使用 IDA 调试器执行代码,进行任何你想要的操作,并观察虚表如何被构建!对于 AArch64,你可以设置一个远程 gdb 服务器并使用 IDA 调试器进行调试。
如果你不再需要断点,只需转到 IDA 中的断点列表标签页,按需删除断点即可。
我还想特别指出,这是该工具的第二个版本,同时支持 32 位和 64 位以及 aarch64,可能在某些情况下会有少量断点被遗漏,如果出现这种情况,请提交 issue 并联系我,这样我就能改进代码并帮助修复。提前感谢!:)
Virtuailor 从被命中的虚调用所使用的虚表中创建结构。虚表函数根据 BP 操作码中使用的相关寄存器从内存中提取。
由于我想要在 IDA 中的结构与数据段中的虚表之间建立关联,BP 会将数据段中的虚表地址名称更改为结构名称。如下图所示:

虚函数名称也会被更改,但排除名称不是默认 IDA 名称的情况(具有符号的函数或用户更改过的函数),在这些情况下,函数名称将保持不变,并以其当前名称添加到虚表结构中。
选择的名称使用以下模式构建:
创建虚表后,Virtuailor 还会在创建的结构和汇编之间添加连接,如下图所示:

附注:BP 中使用的结构偏移仅与最后一次调用相关,为了更好地理解所有已进行的虚调用,添加了交叉引用功能,如下一节所述。
在静态逆向 C++ 时,很难看出谁调用了谁,这是因为大多数调用都是间接调用,然而运行 Virtuailor 后,每个被间接调用的函数现在都有了指向这些位置的交叉引用。
下面的 gif 展示了添加的交叉引用及其间接函数调用:

该工具曾在 RECon Brussels、Troopers 和 Warcon 上展示。演示视频可通过以下链接观看:https://www.youtube.com/watch?v=Xk75TM7NmtA
REcon Brussels、Troopers、Warcon 团队,Nana,@tmr232,@matalaz,@oryandp,@talkain,@shiftreduce
该插件采用 GNU GPL v3 许可证。