下面是我尝试读取函数指针指向的机器代码并打印它.目前,正在打印的数据与生成的代码不同...我已经检查了生成的可执行文件中创建并由反汇编程序列出的指针的值(代码/调试器之间存在差异)但是看不出任何麻烦,或者理解我如何解决这个问题.
void dummy();
int _tmain(int argc, _TCHAR* argv[])
{
int i;
printf("\nReading dummy...\n");
for(i = 0; i < 25; i++)
printf("%.2X ", ((char *)((void *)dummy))[i]);
puts("");
dummy();
getchar();
return 0;
}
void __declspec(naked) dummy()
{
__asm
{
nop;
nop;
nop;
nop;
ret;
}
}
Run Code Online (Sandbox Code Playgroud)
Han*_*ant 12
这里有两个常见的错误.首先,投射到unsigned char*而不是char*.接下来,重要的一个,Project + Properties,Linker,General和关闭增量链接.
启用增量链接后,函数地址实际上指向一个只包含实际函数的JMP的小存根.这允许链接器用新代码替换旧代码,而不必重建整个可执行映像.启用增量链接时,您的代码正在读取该存根而不是实际功能.适当的输出:
Reading dummy...
90 90 90 90 C3 //... rest is random
Run Code Online (Sandbox Code Playgroud)