《IDA权威指南》 Note

First Post:

Last Update:

插图ID:87390511

笔记主要用作字典,记录仅为了方便自己的查阅

调用约定:

1
2
3
4
5
6
7
8
9
10
11
12
13
void demo_cdecl(int x,int y);
;demo_cdecl(1,2);
//-----------------------//
push 2; push y
push 1; push x
call demo_cdecl
add esp,8
//-----------------------//
mov [esp+4],2
mov [esp],1
call demo_cdecl
//-----------------------//
;C调用约定:由调用方清除栈中参数
1
2
3
4
5
6
7
8
void _stdcall demo_stdcall(itn x,int y);
;demo_stdcall(1,2);
//-----------------------//
push 2
push 1
call demo_stdcall
//-----------------------//
;标准调用约定:被调用方通过ret 8来清除栈中参数
1
2
3
4
5
6
7
8
9
10
void fastcall demo_fastcall(int w,int x,int y,int z);
;demo_fastcall(1,2,3,4);
//-----------------------//
push 4
push 3
mov edx,2
mov ecx,1
call demo_fastcall
//-----------------------//
x86 fastcall调用约定:将前两个参数(w,x)分别送入ECX和EDX寄存器,其他参数同stdcall相同,由被调用方清除栈中数据
1
2
3
C++调用约定:
使用this指针,由调用方提供调用地址
Mircosoft Visual C++提供thiscall调用约定,将this指针传递道ECX寄存器,并和stdcall中相同,由被调用者清除栈中参数

函数特征:

IDA函数属性

函数名称:可用于更改函数名称

起始地址:IDA自动识别的函数起始点

结束地址:同上

局部变量区(Local variables area):函数局部变量专用的栈字节数。多数情况下,IDA会通过分析函数的栈指针的行为,自动计算该数值

保存的寄存器(Saved registers):为调用方保存寄存器所使用的栈字节数(指 push EBP,pop EBP等)。IDA认为保存的寄存器区域存放在保存的返回地址顶部、与函数有关的所有局部变量的下方。一些编译器选择将寄存器保存在函数局部变量的顶部。IDA认为保存这些寄存器所使用的空间属于局部变量区域,而非保存的寄存器区域(本例为main函数,在起始位置存在push EBP的行为)

已删除的字节(Purged bytes):表示当函数返回调用方时,IDA从栈中删除的参数的字节数。对cdecl函数而言,这个值应该为‘0’。对stdcall函数来说,这个值表示传递道栈上的所有参数占用的空间。在x86程序中,如果IDA观察道程序使用了返回指令的RET N变体,便会自动确定该数值。

帧指针增量(Frame pointer delta):编译器可能会对函数的帧指针进行调整,使其指向局部变量区域的中间,而不是指向保存在局部变量区域的底部的帧指针中。调整后的帧指针到保存的帧指针之间的这段距离叫做帧指针增量。使用该数值的目的,是在离帧指针1字节的偏移量(-128~+127)内保存尽可能多的栈帧变量。

不返回(Dose not return):函数不返回到它的调用方。如果调用这样的函数,在相关的调用指令之后,IDA认为函数不会继续执行

远函数(Far function):在分段体系结构上将函数标记为远函数。在调用该函数时,函数调用方需要指定一个段和偏移值。通常,是否使用远调用,应该由程序中使用的内存模式决定,而不是由体系结构支持分段(x86体系结构上使用了大内存模式(相对于平内存模式))决定

库函数(Library func):将函数标记为库代码。

静态函数(Static func):仅标记函数为静态函数

基于BP的帧(BP Based frame):BP指代EBP。暂时不同能够理解书中的描述

BP等于SP:一些函数将帧指针配置为在进入应该函数时指向栈帧的顶端,该情况将被标记该数值。基本上,它的作用等同于将帧指针增量大小设置为等于局部变量区域

Array数组功能:

数组元素宽度(Array element size):指定各元素的大小,单位为字节

最大可能大小(Maximal possible size):指定最大数组长度

数组大小(Array Size):早期版本也称为Number of element

行中的项目(Item on a line):单行显示的元素数量

元素宽度(Element width):控制显示时的字距

使用重复结构(Use “dup” construct):该选项会将相同的数值合并,用重复说明符组合成一项

有符号元素(Signed element):将数据显示为有符号或无符号

显示索引(Display indexes):如名的功能。索引将以注释的形式附加在每行的末尾,若单行有多个元素,则只会显示尾元素的索引

基本操作:

热键C:可用于将未定义的字符串反编译为代码

热键D:将代码转换为数据(可类似字符串),也可用于修改一定义数据的类型

热键G:跳转至目标地址

热键U:取消当前定义(当IDA错误的将某些数据视作了函数,使用该方法可以修正这种错误)