作业:
做函数指针执行数组数据时,需要将VS的链接器-》高级-》数据执行保护,选否,不然编译的程序是不允许执行数据区的内容的。
还有就是函数生成的硬编码别一股脑复制粘贴,里面有个call
@_CheckForDebugger JustMyCode@4 数和堆栈平衡的函数,每次执行都不一样, 要把这两个的硬编码给注掉
int __cdecl Function(int x ,int y )
{
return x + y;
}
char Data[100] =
{
0x55,
0x8B, 0xEC,
0x81, 0xEC, 0xC0, 0x00, 0x00, 0x00,
0x53,
0x56,
0x57,
0x8B, 0xFD,
0x33, 0xC9,
0xB8, 0xCC, 0xCC, 0xCC, 0xCC,
0xF3, 0xAB,
0x8B, 0x45, 0x08,
0x03, 0x45, 0x0C,
0x5F,
0x5E,
0x5B,
0x81, 0xC4, 0xC0 ,0x00, 0x00,0x00,
0x3B, 0xEC,
0x8B, 0xE5,
0x5D,
0xC3,
};
int main()
{
int (*pstr)(int, int) = NULL;
//函数指针常规调用
//pstr = (int (*)(int, int) ) &Function;
//把函数硬编码 存到数组中
pstr = (int (*)(int, int)) &Data ;
printf("%d", pstr(1, 2));
system("pause");
return 0;
}
成功通过函数指针调用数据,当成代码执行。