我正在尝试获取函数地址,以便使用memcpy将其内容复制到缓冲区中。
我遇到的问题是获取函数地址。以下是我的代码:
__declspec(noinline) int gio()
{
const char yle[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
return 7;
}
int main(int argc, TCHAR* argv[])
{
int(*funcptr)() = gio;
unsigned char *p = (unsigned char *)&funcptr;
size_t ik;
for (ik = 0; ik < sizeof funcptr; ik++)
{
printf("%02x ", p[ik]);
}
putchar('\n');
printf("gio x -> %x\n", gio);
printf("gio p -> %p\n", gio);
}
我创建了一个小测试程序,尝试使用不同的方式打印函数地址。
我正在使用Visual Studio,并关闭了优化和内联函数扩展(但仍然使用了noinline)。所有的打印语句都输出相同的结果(0x00d213ca
截图),但是当我将光标放在gio
函数上时(在VS中),它显示完全不同的地址(0x00d218c0
截图)。
当我右键点击gio函数并选择转到反汇编器
时,我跳转到了当我将光标放在它上面时显示的地址(0x00d218c0
截图)。这清楚地显示了这个函数的真实位置。
我有点困惑,在这里似乎我不理解某些东西。为什么打印语句会显示错误的值?获取“真实”函数地址的方法是什么?
printf
格式说明符%p
仅适用于数据指针。 - Ben Voigt