您的位置:首页 > 其它

ida入门(2)

2016-03-13 22:58 323 查看

 A、桟帧    stack  frame

1、要先保护现场

2、将参数按照调用约定,存放在被运行桟帧上, 这样, 这个桟帧的帧顶指针就会发生改变

3、若有必要,调用函数会配置一个帧指针,保存调用方希望保持不变的内容(寄存器值)

4、被调用函数为它可能需要的任何局部变分配空间,需要桟帧栈顶向上(-操作)开辟

5、被调用函数返回值存放在eax寄存器中,或者存放在可以立即被调用到的地方

6、一旦函数完成其他操作,任何局部变量都释放了

7、调用地方,如果重新获得控制权,删除在桟开辟的空间(+操作)

B、调用约定

C语言调用约定: _cdecl(参数从右想做依次入栈),清理方式,调用者清理

    参数入栈原因:对于参数是可变化的,比如函数:printf(“xxxx”), 调用者肯定知道传入被调用者 printf函数的参数,但是,对于函数printf函数本身是不知道调用者传入的参具体是什么。

比如:函数

void demo(int x, int y, int z)

参数反汇编出来的伪代码大致为:

push  x   

push y

push z 

call demo

add esp, 16

上面的  汇编伪代码中:call demo, 就是进入函数 demo(),开始执行了。

add esp 16,   这个 16 = 4 * sizeof (int)。

标准调用 _stdcall 

参数入栈方式:从右到左。

使用_stallcall , 不用对桟帧进行参数管理,调用者进行桟帧维护。

DLL 调用的方式就是 _stdcall

void demo(int x, int y, int z)

参数反汇编出来的伪代码大致为:

push  x   

push y

push z 

call demo

ret 16

快速调用  _fastcall

前两个函数将会被分配给 ECX, EDX。

void demo(int x, int y, int z)

  ecx = x, edx = y;

剩下的参数都被按照 _stdcall 调用约定入栈

c++调用约定

使用this指针(c++独有)

VC提供了迪this'll调用,将this传递给ecx

gc++调用约定

参数被当做静态,存放在栈顶

教程下载链接(若发现不能下载,请及时留言,第一时间处理):

http://pan.baidu.com/s/1qWXD4Na
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息