IdaPro/HexRays 类型库

逆向工程 艾达 六线谱
2021-06-21 22:15:14

我正在尝试改进我对 ida/hexrays 的使用......我有一个 x86 linux elf 二进制文件,未剥离,静态链接 w/openssl。因此,您可以在二进制文件中看到所有 OpenSSL 函数名称。

我使用 tilib cli 工具从 bio.h 头文件创建了一个类型库。看起来它起作用了,并且 .til 有一堆结构和函数定义。我将其复制并添加到“类型库”对话框中的 ida 中。我知道它得到了一些东西,因为我在从 int 到 BIO* 的十六进制射线中重新键入了一个函数中的参数,并且它修复了对结构成员的所有引用。

但这不是修复函数​​原型。例如,BIO_puts 仍然是 (int,int),即使 til 将其设为 (BIO *bp, const char *buf)。

我是不是做错了什么,还是我对 hexrays/ida 的期望过高?提前致谢!

1个回答

IDA 的 til 文件基本上是 IDA 存储特定函数类型信息的方式。AFAIK,.til 文件并没有告诉 IDA 如何实际识别该函数以应用函数原型信息。为此,您需要使用 IDA 的 Flirt 实用程序生成必需的 .sig 文件。

默认情况下,IDA 不会替换现有的类型信息,除非它是在初始分析时“自动生成”的;所以你必须重置 IDA 的类型字段以填写类型信息。由于名称已经存在,它不会算作 IDA 的“自动生成”(即 sub_XXXX)。

话虽如此,您仍然应该能够使用您生成的 .til 文件。转到 OpenSSL 函数之一,并将光标放在名称上。按 Y。这将显示您的类型声明。清除字段,然后点击确定。然后按 N,确保名称与 header/.til 文件中的拼写完全一致,然后按 Enter。然后它应该填充正确的类型信息。

显然,这对整个图书馆来说都是一种痛苦。我假设所有的 OpenSSL 函数都在同一个区域。因此,如果您知道开始和结束地址,您可以执行以下操作来修复它(假设名称已经与您的头文件匹配):

for func_ea in Functions(openssl_start_ea, openssl_end_ea):
    func_name = GetFunctionName(func_ea) #Get Current Name
    SetType(func_ea, "") #Reset Type Info
    MakeName(func_ea, func_name) #Recreate Name to get new type info