逆向-IDA常用快捷 __cdecl __stdcall __fastcall C++调用约定 文本搜索快捷键 栈指针 函数块 数组在反汇编中的表现

首先来复习一下几种常见的调用约定:

这是C的调用约定,从右向左依次压入参数,调用者负责平衡堆栈,函数外add x来平衡堆栈。

__stdcall

这是windows的标准调用约定,从右向左依次压入参数,被调用者负责平衡堆栈,函数内retn x来平衡堆栈。

__fastcall

这是stdcall的变体,x86下前两个参数分别用ecx、edx传入,后面和__stdcall一样。

C++调用约定

非静态成员函数与标准函数不同,需要this指针,指向被调用的对象,这个由被调用方提供,被调用者平衡堆栈,this指针在ecx中。


文本搜索快捷键

ALT+T搜索文本,CTRL+T重复搜索下一个匹配结果。

ALT+B二进制搜索,CTRL+B重复搜索下一个匹配结果。


栈指针

任何时候如果IDA遇到一个函数反汇编语句,检测到栈指针不为0,这时IDA将标注一个错误条件,并将相关指令以红色显示。


函数块

创建一个新的函数块,首先选择该块的起始地址,edit->function->append function tail命令,从已定义函数中选择一个。

逆向-IDA常用快捷
__cdecl
__stdcall
__fastcall
C++调用约定
文本搜索快捷键
栈指针
函数块
数组在反汇编中的表现

结束地址:函数中最后一条指令之后的地址,通常是返回语句之后指令的地址,这个地址不是函数的一部分,而是函数最后一条指令之后的地址。

保存的寄存器:为调用方保存寄存器所用的字节数。IDA认为保存的寄存器区域放在保存的返回地址顶部,局部变量下面。

栈指针调整:如果IDA不能更好的调整栈帧,可以ALT+K手动进行调整, 比如未识别stdcall调用方式的函数,调用前后栈帧不一致,可以进行修改。


数组在反汇编中的表现

如果在global中

如果是指定固定数字下标索引,为固定值;如果是变量索引为[eax*x]x为元素大小

如果在栈中

如果是指定固定数字下标索引,索引为[ebp+偏移],如果是变量就是[ebp+eax*x]

如果在堆中

一般先mov ecx,ebp+heap_array; mov dword ptr [ecx+eax*4]