IDA SDK:如何将结构(指针)字段添加到结构中?

逆向工程 艾达 开发包
2021-06-15 05:34:49

我是 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是否正确;该文档仅说明“类型 + 表示位”。

所以,愚蠢地问,忽略我上面可能有错误的尝试,设置已知类型的结构字段的方法是什么?

0个回答
没有发现任何回复~