IDA Pro权威指南-反汇编导航
跳转地址,快捷键G,输入地址或16进制数,即可跳转到指定地址。
IDA可后退前进,还有历史记录。回退快捷键Esc。
栈帧
函数运行时分配的内存块。
调用函数步骤:
1.调用方将被调用函数的参数放入指定位置。
2.将控制权交给被调用函数 由 x86 call 或MIPS JAL等执行。并将返回地址保存。
3.有必要的话,被调用函数会配置一个栈指针。
4.为局部变量分配空间。
5.生成结果,放入寄存器。
6.释放栈空间。
7.恢复原来保存的值。
8.返还控制权,X86 ret 或MIPS JR ,清除栈。
9.调整栈。
调用约定
调用约定,指调用方放置函数参数的位置。
1.C调用约定(cdecl)
按从右到左的顺序将参数入栈,即栈顶指向函数第一个参数。程序结束,要从调用方清除栈,适用于参数数量可变的函数。
2.标准约定(stdcall)
顺序从左到右,但是是被调用函数清除栈,适用于参数数量固定的函数。
3.x86fastcall调用约定
stdcall的一个变体,向寄存器最多传递前2个参数到ECX和EDX,其余参数依次入栈。
4.C++调用约定(thiscall)
Microsoft Visual C++,将this传递到ECX寄存器中,要求非静态成员函数清除栈。
GUN g++,this可看做所有非静态成员函数的第一个隐含参数。调用非静态成员函数前,this被放入栈顶,且调用方清除栈。
5.系统调用
栈帧
在X86中,EBP(扩展基址指针)通常用作栈帧指针。
以此函数为例。
1.保存EBP
2.指向当前栈位置。
3.分配局部变量。
栈帧布局:
bar调用:
尾声:
清除栈,然后将保存的EBP恢复,然后ret返回。
IDA栈视图
我们来看看它加载到IDA的情况:
1.IDA认为函数使用EBP寄存器作为栈指针。
2.gcc在栈中分配了120字节(78h)。
3.120字节包括这两个参数值。编译器会用额外的字节填补局部变量空间,确保特殊的对齐方式。
4.摘要栈视图:根据相对于被保存的地址的位置命名变量,局部变量在被保存的地址之上,函数参数在之下。局部变量var_XX,函数参数arg_XX。在这个函数中,因为没有使用参数a,所以没有arg_0.
栈帧视图:
文本搜索
快捷键ALT+T
必须搜索完整的词。比如搜索11111,找不到loc-11111.
CTRL+T显示下一匹配结果。
二进制搜索
快捷键ALT+B CTRL+B 显示下一匹配结果。
Case-sensitive 区分大小写。