IDA 高级功能使用 之 创建结构体 —— 加快你的逆向速度
本文详细介绍一下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中手动创建结构体
-
打开创建结构体的 Subview,点击工具栏 View->Open Subview->Structures( Shift + F9)。
-
按键盘 I 弹出结构体的创建窗口,输入 Structure name。
-
在结构体的 ends 行,按键盘
d
键,创建新的结构体成员。 -
在结构体成员初按
d
键,修改数据类型(db dw dd dq),右键点击 Array 可以创建数组。 -
结构体创建完成后,效果如下:
-
最后,分析代码。确定结构体中的成员在反汇编代码中的名称。之后,修改反编译代码中该 成员的类型,按
y
修改为 struct name(这里修改为 student)。修改完成后,最终效果如下:
0x02 通过头文件创建结构体
从上面可以看出:手动创建结构体的过程比较复杂。如果有头文件,或者我们我们可以自己手写结构体,之后就可以通过导入结构体的方式来创建结构体。
导入结构体的步骤如下:
-
打开 Local Types subview:View->Open Subviews->Local Types(SHIFT+F1)
-
输入结构体定义:
-
添加成功后,效果如下:
-
之后和之前的步骤一致,在反编译中代码按 y 修改变量的 Type 即可。
0x03 导入标准结构体
前面介绍了两种创建结构体的方式,当然还可以导入 IDA 中已有的结构体,在 Structures 中 创建结构体时,按 I 之后,选择已有的结构体即可。如下图所示。
0xFF 参考
- 《IDA Pro 权威指南 第二版》8.2 创建 IDA 结构体