本文详细介绍一下IDA中和结构体有关的高级用法。

当源码的函数中使用了结构体类型的变量时,反汇编代码中对于结构体中成员的获取往往都是通过一个指针+offset来获取的。对于反汇编代码的阅读不是很方案,因此就需要创建结构体,让反汇编/反编译的代码更加友好一些。

0x00 demo

这里使用的源码如下:

#include <stdio.h>
#include <string.h>

struct student{
    char name[16];
    int age;
    char class[16];
};

static char name1[16] = "xiaoming";
static char name2[16] = "xiaogang";

int main()
{
    struct student s1;
    struct student s2;
    s1.age=10;
    s2.age=11;
    strcpy(s1.name, name1);
    strcpy(s2.name, name2);
    printf("student1 age: %d name : %s\n", s1.age, s1.name);
    printf("student2 age: %d name : %s\n", s2.age, s2.name);
    return 0;
}

编译后,用IDA打开。F5反编译效果如下图所示。我们可以看到对于结构体成员的访问不是很友好。因此就需要创建结构体来优化显示效果。

0x01 在IDA中手动创建结构体

  1. 打开创建结构体的 Subview,点击工具栏 View->Open Subview->Structures( Shift + F9)。

  2. 按键盘 I 弹出结构体的创建窗口,输入 Structure name。

  3. 在结构体的 ends 行,按键盘 d 键,创建新的结构体成员。

  4. 在结构体成员初按 d 键,修改数据类型(db dw dd dq),右键点击 Array 可以创建数组。

  5. 结构体创建完成后,效果如下:

  6. 最后,分析代码。确定结构体中的成员在反汇编代码中的名称。之后,修改反编译代码中该 成员的类型,按 y 修改为 struct name(这里修改为 student)。修改完成后,最终效果如下:

0x02 通过头文件创建结构体

从上面可以看出:手动创建结构体的过程比较复杂。如果有头文件,或者我们我们可以自己手写结构体,之后就可以通过导入结构体的方式来创建结构体。

导入结构体的步骤如下:

  1. 打开 Local Types subview:View->Open Subviews->Local Types(SHIFT+F1)

  2. 输入结构体定义:

  3. 添加成功后,效果如下:

  4. 之后和之前的步骤一致,在反编译中代码按 y 修改变量的 Type 即可。

0x03 导入标准结构体

前面介绍了两种创建结构体的方式,当然还可以导入 IDA 中已有的结构体,在 Structures 中 创建结构体时,按 I 之后,选择已有的结构体即可。如下图所示。

0xFF 参考

  1. 《IDA Pro 权威指南 第二版》8.2 创建 IDA 结构体