|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 冬冬 于 2012-3-26 21:33 编辑
函数传参介绍:_cdecl这是C/C++采用的默认的传参方式,即参数按从右到左依次入栈。且有调用者负责清理堆栈.
1、EBP寄存器,栈基址寄存器。
这本是一个通用寄存器,但在长期的编程习惯中,人们给了它一个默认的约定,通常用来堆栈传参后,执行call后的栈指针值。
2、我利用内联汇编分析了:
#include <iostream>
using namespace std;
int Add(int a,int b)
{
int tmp_A,tmp_B;
int tmp_EBP;
__asm
{
push eax
mov eax,[ebp+8]
mov tmp_A,eax
mov eax,[ebp+12]
mov tmp_B,eax
mov tmp_EBP,ebp
pop eax
}
cout<<"EBP+0:\t\t"<<hex<<uppercase<<tmp_EBP<<endl;
cout<<"EBP+4\t\t"<<hex<<*(int*)(tmp_EBP+4)<<endl;
cout<<"EBP+8\t\t"<<hex<<*(int*)(tmp_EBP+8)<<endl;
cout<<"EBP+12\t\t"<<hex<<*(int*)(tmp_EBP+12)<<endl<<endl;
cout<<"第一个参数\t"<<hex<<tmp_A<<endl;
cout<<"第二个参数\t"<<hex<<tmp_B<<endl;
return tmp_A+tmp_B;
}
int main()
{
Add(123,456);
return 0;
}
//输出结果:
EBP: 2DFD40 //那么这几个值是啥呢???
EBP+0: 2DFE1C //那么这几个值是啥呢???
EBP+4 131193A //那么这几个值是啥呢???
EBP+8 7B //毫无疑问,这是我要传递的参数
EBP+12 1C8 //毫无疑问,这是我要传递的参数
第一个参数 7B
第二个参数 1C8
请按任意键继续. . .
我们在VC++中进入调试模式,查看反汇编代码(ALT+8)
先来看下Main函数内:
int main()
{
01311910 push ebp
01311911 mov ebp,esp
01311913 sub esp,0C0h
01311919 push ebx
0131191A push esi
0131191B push edi
0131191C lea edi,[ebp-0C0h]
01311922 mov ecx,30h
01311927 mov eax,0CCCCCCCCh
0131192C rep stos dword ptr es:[edi]
Add(123,456);
0131192E push 1C8h
01311933 push 7Bh
01311935 call Add (13110B4h)
0131193A add esp,8 //注意下他的指令地址与 输出 EBP+4 131193A
system("Pause");
0131193D mov esi,esp
0131193F push offset string "Pause" (13178B8h)
01311944 call dword ptr [__imp__system (131A424h)]
0131194A add esp,4
0131194D cmp esi,esp
0131194F call @ILT+445(__RTC_CheckEsp) (13111C2h)
return 0;
01311954 xor eax,eax
}
//看看他们的指令地址:
01311935 call Add (13110B4h)
0131193A add esp,8 //注意下他的指令地址与 输出 EBP+4 131193A
知道ESP+4是啥了不?
4、EBP和EBP+4的值什么。
EBP: 2DFD40 //那么这几个值是啥呢???
EBP+0: 2DFE1C //那么这几个值是啥呢???
介绍下OEP即入口地址:
C语言每个函数的开头均已
push ebp // EBP寄存器保护
mov ebp,esp
而函数结束
mov esp,ebp //回复ESP寄存器,以保持对战平衡
pop ebp //函数入口时的esp寄存器既然回复了,我们利用esp寄存器,就可以回复ebp寄存器了。
至于我在函数中,输出的EBP和EBP+0 值我想聪明的你应该知道是啥了。
呵呵至此,分析完毕......
我至于初学者,许多地方也是凭着才想去实验的.....
遗留的几个问题解答:
push ebp // EBP寄存器保护
mov ebp,esp
那么EBP的值自然是 进入call之后的ESP值。
第二个问题:【EBP+0】
是进入call执
push ebp
那么 EBP+0就是 上次EBP的值,入栈一边保护寄存器用 |
| [tr][/tr]
|
评分
-
查看全部评分
|