2020.03.02-2020.03.08

IDA

四个快捷键

添加注释:冒号或分号
跳转到某个地址(16进制):‘G’;返回(后退):‘Esc’;前进:‘Ctrl+Enter’

交叉参考

可以知道指令代码相互调用的关系

'↑j’中j表示跳转,o表示偏移量,p表示子程序,双击或按回车可以跳到调用该处的地方
在‘loc_xxxxx’上按’x’打开交叉参考窗口

参考重命名

可把所有 loc_xxxxxx 重命名

标签

打开标记当前位置功能:‘jump’->‘mark position’ 快捷键:‘Alt+M’
标记后在其他位置可以跳转到标记时光标的位置,快捷键:‘Ctrl+M’


格式化指令操作数

把常量转换为十六、十、八、二进制

函数的操作

代码和数据转换

IDA可能无法正确区分数据字节和代码字节,有些程序利用这一点对抗静态反汇编
用户可以将某段数据指定为代码或数据
方法:‘Edit’->‘Code’/‘Data’(快捷键’C’/‘D’),'D’会将数据类型在db,dw,dd之间转换
按’U’取消定义后得到一些可以重新定义的字节,按’P’将某段代码定义为子程序

—>
按'c'结果如图

字符串

编程语言的不同造成字符串格式不同
c语言字符串以0结尾,dos字符串以$结尾,其他可见于’Edit’->‘string’
3T7bP1.png
按’A’生成一个变量名,按’U’恢复,在’View’->‘Open subviews’->'Names’可以看到字符串变量

数组

可以将数据按数组的形式显示
未识别的数组
‘Edit’->‘Array’或’ * '打开数组排列调整窗口
调整数组大小、每行项数(0自动调整)、对齐方式(0自动调整)
设置为'3 0 -1'的结果

结构体

对一些常见的文件类型,IDA会自动加载相应的类型库,这些类型库中有相应的结构体。
‘Shift+F11’打开加载类型库窗口(Loaded Type Libarries),右键’Load Type Libarary’,'Insert’添加类型库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*******************************************************
*程序:Structures.cpp *
*用途:IDA结构体反汇编 *
* 看雪软件安全网站 *
* www.pediy.com, kanxue 2002.8 *
********************************************************/
#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;
}

对应了main()里的内容,结构体存在“unk_407030”那块

没有定义结构体时自动生成
如[esi+18h]调用了结构体中的数据,可用有意义的名字代替
先把结构体数据中的数据重新定义
参考数组、字符串、数据类型
打开结构体窗口,insert一个结构类型。按’d’添加数据/切换数据类型,按’a’切换为字符串,按’n’修改结构体成员的名字

将光标定位在相应地址处,'Edit->‘Struct var’选择相应结构体类型
调整后
按’T’,在操作数类型中重新定义现有数据:

选择一片代码后可以批量进行替换:

lea:
lea bx,data
lea是load effective address 的缩写,是取源操作数的偏移地址,并将其传送到目的操作数单元。类似于C语言的取地址符&。
lea eax,[eax+2eax]的效果是eax = eax + eax * 2*
mov edx,[ebp+16]的效果是edx=(dword)(ebp+16).