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  区分大小写。

原文地址:https://www.cnblogs.com/whitehawk/p/10845016.html