首先来复习一下几种常见的调用约定:
__cdecl
这是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认为保存的寄存器区域放在保存的返回地址顶部,局部变量下面。
栈指针调整:如果IDA不能更好的调整栈帧,可以ALT+K手动进行调整, 比如未识别stdcall调用方式的函数,调用前后栈帧不一致,可以进行修改。
数组在反汇编中的表现
如果在global中
如果是指定固定数字下标索引,为固定值;如果是变量索引为[eax*x]x为元素大小
如果在栈中
如果是指定固定数字下标索引,索引为[ebp+偏移],如果是变量就是[ebp+eax*x]
如果在堆中
一般先mov ecx,ebp+heap_array; mov dword ptr [ecx+eax*4]