一些用于辅助逆向工程 EFI 可执行文件的 IDA 脚本。
该包包含以下文件:
efiutils.py - 包含一些辅助函数的 IDAPython 模块
efiguids.py - 用于 EFI 协议的已知 GUID 集合
efiguids_ami.py - 用于 AMI BIOS 中使用的协议的已知 GUID 集合
behemoth.h - 一个巨大的头文件,包含 EFI 的类型和结构定义集合
structs.idc - 包含一些结构定义的 IDC 脚本(已被 behemoth.h 取代)
te_image.bt - 用于 TE 二进制映像的 010 Editor 模板
te_loader.py - 用于 TE 二进制映像的 IDA Pro 加载器脚本
这是我第一次尝试编写 IDA 脚本,如果我重复造了轮子或做了任何愚蠢的事情,请原谅我并告诉我。
下面描述了主要的有用函数。有关其他函数的更多信息,请参阅代码和文档字符串。
rename_tables()查找二进制文件的第一个入口点,尝试跟踪传递给入口点函数的参数,并重命名存储关键 EFI 表的全局变量。执行以下重命名操作:
ImageHandle 最终所在的全局变量被重命名为 gImageHandle。
SystemTable 最终所在的全局变量被重命名为 gSystemTable。
SystemTable->BootServices 最终所在的全局变量被重命名为 gBootServices。
SystemTable->RuntimeServices 最终所在的全局变量被重命名为 gRuntimeServices。
调用指令只会被跟踪一层深度,因为大多数可执行文件会在入口点或从入口点调用的函数中复制表引用。如有必要,请更改 MAX_STACK_DEPTH。
update_structs()查找对上述重命名表的交叉引用,并将其名称更新为相应结构中的结构偏移量。如果 rename_tables() 失败,您需要像上面那样手动重命名,此功能才能正常工作。
例如:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
变为:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()在数据段中查找 GUID 并重命名它们。从 TianoCore 源码中提取了 470 个协议 GUID,专有的 Apple(及其他厂商)GUID 将在遇到时添加。
go()执行上述所有操作的便捷方法。
在 IDA Pro 中加载您的 EFI 二进制文件
导入 behemoth.h 以定义必要的数据结构
将本地类型中的结构添加到您的 IDB 中
运行 efiutils.py 将其添加到 python 的路径中(或通过其他方法执行此操作)
查看代码/文档字符串,但可能只需:
import efiutils; efiutils.go()
要使用 te_loader.py TE 映像加载器,请像安装任何其他加载器一样安装它。在 OS X 上,可以通过将其复制或符号链接到 idaq.app/Contents/MacOS/loaders/ 下的 loaders 文件夹中来完成。