我正在尝试在包含函数名称的 IDA 数据库中添加一个动态导入段,并且我正在对其应用类型信息,以便apply_callee_tinfo
在我发现对这个动态导入函数的调用时可以通过使用来获取参数位置。
在测试时,我发现对于某些声明,无法识别参数或返回类型。IDA 给出了数字类型。
使用的代码是
def add_from_declaration(declarations):
dyn_imp_seg_loc = 0x10000
dyn_imp_seg_loc_end = 0x10000 + len(declarations.keys()) * 4
idaapi.add_segm(0, dyn_imp_seg_loc, dyn_imp_seg_loc_end, "DYN_IMP", "XTRN")
t_loc = dyn_imp_seg_loc
not_applied = []
for proc_name in declarations:
decl = str(declarations[proc_name])
print(decl)
try:
name, types, fields = idc.ParseType(decl, 0)
success = idc.MakeName(t_loc, str(proc_name))
t = idaapi.tinfo_t()
til = idaapi.til_t()
t.deserialize(til, types, fields)
if success:
idc.MakeDword(t_loc)
success = idaapi.apply_tinfo(t_loc, t, 1)
if not success:
not_applied.append(proc_name)
except Exception:
continue
finally:
t_loc = t_loc + 4
return not_applied
declarations
是一个以键为函数名、以值为声明的字典。我做错了什么?
编辑:我的方法基于此线程中提供的答案,在 IDA 中,有没有办法将动态导入函数的引用添加到“导入”选项卡中?. 我的问题不在于添加导入段或创建交叉引用。但我无法向名称添加类型信息。
从图片中可以看出,我正在尝试BOOL __stdcall ReleaseMutex(HANDLE a0);
在名为 0x10000 的位置应用声明ReleaseMutex
,但即使在成功解析声明后,IDA 也无法识别BOOL
和HANDLE
构建。