关于函数指针
unsigned char ShellCode[] ={
0x55,0x8B, 0xEC,0x83, 0xEC, 0x40,0x53,0x56,0x57,
0x8D, 0x7D, 0xC0,0xB9, 0x10, 0x00, 0x00, 0x00,
0xB8, 0xCC, 0xCC, 0xCC, 0xCC,0xF3, 0xAB,0x8B, 0x45,
0x08, 0x03, 0x45, 0x0C,0x5F,0x5E,0x5B,0x8B, 0xE5,0x5D,0xC3
};
int Plus(int x,int y)
{
return x+y;
}
int main()
{
int (*pFun)(int,int);
pFun = (int (*)(int,int))&ShellCode;
int x = pFun(2,2);
printf("%d\n",x);
return 0;
}
为什么最后等于四 本帖最后由 xieglt 于 2020-8-18 14:51 编辑
unsigned char ShellCode[] =
{
0x55,0x8B, 0xEC,0x83, 0xEC, 0x40,0x53,0x56,0x57,
0x8D, 0x7D, 0xC0,0xB9, 0x10, 0x00, 0x00, 0x00,
0xB8, 0xCC, 0xCC, 0xCC, 0xCC,0xF3, 0xAB,0x8B, 0x45,
0x08, 0x03, 0x45, 0x0C,0x5F,0x5E,0x5B,0x8B, 0xE5,0x5D,0xC3
};
这个字符串是一个函数的二进制码,
用函数指针调用了这段代码,执行后得的返回值是4,
估计这段代码就是将2个参数相加,然后返回。
你可以试试比如说 pFun(100,100),返回值多半是200。
0042A548 push ebp
0042A549 mov ebp,esp
0042A54B sub esp,40h
0042A54E push ebx
0042A54F push esi
0042A550 push edi
0042A551 lea edi,
0042A554 mov ecx,10h
0042A559 mov eax,0CCCCCCCCh
0042A55E rep stos dword ptr
0042A560 mov eax,dword ptr
0042A563 add eax,dword ptr
0042A566 pop edi
0042A567 pop esi
0042A568 pop ebx
0042A569 mov esp,ebp
0042A56B pop ebp
0042A56C ret
这是win32下反汇编后的代码,就是2个参数相加,然后返回。
如果你的运行环境是win32,应该也是这样的。 xieglt 发表于 2020-8-18 14:40
unsigned char ShellCode[] =
{
0x55,0x8B, 0xEC,0x83, 0xEC, 0x40,0x53,0x56,0x57,
函数的二进制码是什么东西 想摸妹妹大腚 发表于 2020-8-18 15:53
函数的二进制码是什么东西
你的代码经编译器编译之后,最终生成机器能够识别的机器语言,也就是二进制码
页:
[1]