我是 IDA 7.0 SDK 的新手,尝试使用插件自动创建结构以表示 IDA 中的 C++ (MSVC) 类。为此,我创建了 3 个结构,如下所示:
00000000 SomeClass struc
00000000 __vftable dd ? ; SomeClass_vtbl*
00000004 __members SomeClass_members ?
00000084 SomeClass ends
00000084
00000000 ; ---------------------------------------------------------------------------
00000000
00000000 SomeClass_vtbl struc
00000000 ; ... several function pointers ....
00000048 SomeClass_vtbl ends
00000048
00000000 ; ---------------------------------------------------------------------------
00000000
00000000 SomeClass_members struc
00000000 ; ... some members ....
00000020 SomeClass_members ends
创建结构工作正常,但我在定义 2 个字段时遇到问题SomeClass
:
- 指向
SomeClass_vtbl
第一个字段的指针,以及 - 引用
SomeClass_members
第二个字段。
在 SDK 中没有找到关于如何以编程方式详细定义结构的示例(有吗?),我查看了原始文档并发现add_struct_member
正在做我想做的事情,使用方法如下:
#include <bytes.hpp>
// ... other typical IDA SDK includes ...
bool idaapi run(size_t arg)
{
qstring className = "SomeClass";
// Create the structs.
tid_t classType = add_struc(BADADDR, className.c_str());
tid_t vftableType = add_struc(BADADDR, (className + "_vtbl").c_str());
tid_t membersType = add_struc(BADADDR, (className + "_members").c_str());
struc_t* classStruct = get_struc(classType);
struc_t* vftableStruct = get_struc(vftableType);
struc_t* membersStruct = get_struc(membersType);
// Create vftable field.
opinfo_t vftableField{ vftableStruct->id };
add_struc_member(classStruct, "__vftable", 0, FF_STRUCT, &vftableField, 4);
// Create members field.
opinfo_t membersField{ membersStruct->id };
add_struc_member(classStruct, "__members", 4, FF_STRUCT, &membersField, 4);
return true;
}
我不确定像这样设置那些结构字段的类型是否正确:
FF_*
bytes.hpp
我的编译器找不到#defines from ,即使我在项目中唯一的 main.cpp 文件的开头包含了该标头(并且它们出现在 IntelliSense 中...)。- 即使我现在可以使用这些 #defines,我也没有看到如何区分指向结构的指针或简单地引用结构。
- 毕竟,我什至不确定
FF_*
对flag
参数使用#definesadd_struc_member
是否正确;该文档仅说明“类型 + 表示位”。
所以,愚蠢地问,忽略我上面可能有错误的尝试,设置已知类型的结构字段的方法是什么?