想象一下我正在做这样的事情:
void *p = malloc (1000);
*((char*)p) = some_opcode;
*((char*)p+1) = another_opcode; // for the sake of the example: the opcodes are ok
....
etc...
如何定义一个函数指针来调用 p,就好像它是一个函数一样? (我正在使用 VC++ 2008 Express)。
Thanks
评论空间不够。乔穆克是正确的。您不应该将代码填充到通过以下方式获得的内存中malloc
or new
。如果更改 Windows 分配的页面的页面属性,将会遇到问题。
这不是问题,因为使用 VirtualAlloc() 和相关的 WIn32 API 非常简单:调用虚拟分配()并设置flProtect
to [PAGE_EXECUTE_READWRITE][2]
请注意,您可能应该进行三种分配,一个保护页(代码所需的页面),然后是另一个保护页。这将为您提供一点保护,避免出现不良代码。
还可以对生成的代码进行调用结构化异常处理.
接下来,Windows X86 ABI(调用约定)没有很好的文档记录(我知道,我已经看过)。有一些信息here, here, here了解事情如何工作的最好方法是查看编译器生成的代码。这很容易做到\FA开关(有四个)。
你可以找到64位的调用约定here.
此外,您仍然可以获得 Microsoft 的宏汇编器玛斯姆在这里。我建议在 MASM 中编写机器代码并查看其输出,然后让机器代码生成器执行类似的操作。
Intel's and AMD's处理器手册是很好的参考资料 - 如果您没有,请获取它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)