目录
1.参考重命名
2.标签的用法
3.格式化指令操作数
4.代码和数据转换
5.字符串
6.数组
7.结构体
1.创建结构体
结构体替换例子
可以通过一次操作完成全部工作
2.导入结构体
1.参考重命名
参考重命名是ida极好的一个功能
可以把反汇编清单的默认名称改为有意义的名称
增加可读性
单击 + N 即可打开
这个 sub_401120没有什么意义
全部的 sub_401120都变为了 WndProc
2.标签的用法
Jump->Mark position 打开标记当前位置
我们输入 WndProc
然后确定 然后我们离开这个函数地址的时候
Jump ->jump to mark position
就可以调回这个函数地址
就会调回函数代码
3.格式化指令操作数
IDA可以格式化指令使用的常量
所以尽可能使用符号名称而不是数字
从而反汇编代码可以更有可读性
ida会对上下文、所使用的数据做出格式化决定
对于其他情况 ida会根据情况来格式化为一个十六进制数
这里就出现了 二进制 十六进制 十进制的各个数值
大部分情况下
源代码中使用的已经命名的常量
例如 #define语句
IDA维护着大量的常见库(C标准库,Win32API)
右键->Use standard symbolic constant
可以来设置常量
这里我们能发现
就是通过80000000 来识别函数的
4.代码和数据转换
很多为了对抗反汇编
让反汇编无法正确识别数据和代码即可
数据字节可能会被错误识别为代码字节
IDA就存在交互性 可以让用户将某个十六进制数据指定为代码或者数据
通过手动来进行区分
首先 我们先确定十六进制数据是一段代码
然后只需要
选中第一个字节->Edit->Code/按C 即可
按p 可以把代码定义为子程序
按U 就可以取消定义
我们在代码行按D 就可以让数据在 db dd dw之间转换
Options->setup data types 可以显示更多的数据类型
我们转换的时候会一直出现确定弹窗
我们关闭只需要在
Options->Misc->Convert already defined bytes
按U
就会发现一大堆未分类的子节
我们可以重新定义他们的类型
当然
在我们遇到为分类的子节
只需要
按 C 就可以反汇编
直到一个已经定义的项目/非法指令为止
5.字符串
编写语言的不同 就会造成 支持的字符串格式的不同
例如 以 '0'结尾的C语言字符串
和以'$'结尾的DOS字符串
IDA支持所有格式的字符串
如果相信某一个十六进制是字符串
Edit->Strings->ASCII /按A
A默认是C语言字符串
Options->ASCII string style设置默认字符串
有的时候 IDA无法确定字符串
有可能是因为字符串在程序没有引用
按a
在Names窗口可以看见 Views->Open subviews-<Names
6.数组
IDA具有较强的数组聚合能力,可以把一串数据声明变成一行反汇编行
按数组的形式显示
从而提高可读性
这里是一个数组 [] 就很明显
我们双击进入
能发现有点乱
Edit->Array /按*
这里在 Items on a line 填写 0 就会自动调整
7.结构体
在C语言中
结构体是一个数据结构
可以把不同类型的数据结构组合到一个复合的数据类型中
结构体可以被声明为变量、指针或数组等
1.创建结构体
对于常见的文件类型 IDA会自动加载相应的类型库
例如 vc6win(Visual C++ 6.0)
在进行底层代码分析的时候
可以增加 mssdk(Windows.h)、ntddk(ntddk.h)等
这些类型库中具有相应的结构体
Shift+F11
可以打开加载类型库窗口(Loaded Type Libraries)
如果我们要添加
右键->Load Type Library / 按 Insert
这里就是IDA内置的结构体数据结构了
Views->Open subviews->Structures
打开结构体管理窗口
然后按
Insert
Add standard structure
然后就可以添加我们的标准库
在默认的情况下 IDA会加载常用的结构
在结构体窗口按 Insert
就会显示程序内的的结构
对一个结构体双击 就会显示程序代码
IDA会使用各种措施改善结构体代码的可读性
如果某一个程序正在使用结构体
而IDA不了解布局
那么就可以用户自定义结构体
并且放到反汇编代码清单中
结构体替换例子
#include <stdio.h>
struct student
{int id;
char name[20];
int age;
};
struct student stu[2]={{01,"Mary",14},{02,"Angela",15}};
int main(void)
{
struct student *p;
for(p=stu;p<stu+2;p++)
printf("%5d %-20s%4d\n",p->id,p->name,p->age);
return 0;
}
我们双击进入 unk_407030
使用 A/D
可以进行定义
然后我们打开数据结构窗口
我们 按Insert 增加 一个结构体类型"student"
按D 加入数据然后修改为(按N) id 然后按A来设置结构
最终
然后我们可以把光标放在 00407030h处
Edit->Structs->Struct var
想同的
把0040704Ch的数据也变为student
最后我们需要对重新操作的汇编进行操作
例如这里的 esi+18h
Edit->Operand types ->Offset->Offset(Struct) /按T
到这里我们就进行了替换结构体
即使我们的结构体的成员很多 也不需要每一个替换
IDA有批量处理的操作
可以通过一次操作完成全部工作
执行 Offset(Struct) /T
这里就一下选中了所有 一次操作
IDA还可以在已经分析好的数据中建立结构体
Edit->Structs->Create struct from data
2.导入结构体
从上面我们能发现 自己创建结构体 过于麻烦了
我们应该从C文件头 导入结构体才是最好的
我们能够积累自己建立的文件头 以后遇到直接快速导入即可
Load file ->Parse C header file
加载自定义的头文件
如果没有源代码 可以使用文本编辑器以C表示法定义一个结构体布局并且解析得到头文件