想摸妹妹大腚 发表于 2020-8-18 14:26:54

关于函数指针

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:40:29

本帖最后由 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。


xieglt 发表于 2020-8-18 14:43:27

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,应该也是这样的。

想摸妹妹大腚 发表于 2020-8-18 15:53:31

xieglt 发表于 2020-8-18 14:40
unsigned char ShellCode[] =
{
0x55,0x8B, 0xEC,0x83, 0xEC, 0x40,0x53,0x56,0x57,


函数的二进制码是什么东西

xieglt 发表于 2020-8-18 15:56:45

想摸妹妹大腚 发表于 2020-8-18 15:53
函数的二进制码是什么东西

你的代码经编译器编译之后,最终生成机器能够识别的机器语言,也就是二进制码
页: [1]
查看完整版本: 关于函数指针