指针的值与指定的值不同

eXP*_*nce 3 c++ visual-c++

我有两个名为TestFunc和TestFunc2的空函数,我将它们的地址分配给两个变量.

void TestFunc()
{
}

__declspec(naked) void TestFunc2()
{
}

int main()
{
DWORD* test = (DWORD*)TestFunc;
DWORD* test2 = (DWORD*)TestFunc2;

printf("TestFunc is %p at test is %p\n", TestFunc, test);
printf("TestFunc2 is %p at test2 is %p\n", TestFunc2, test2);
getchar();
}
Run Code Online (Sandbox Code Playgroud)

赋值后,两个变量的值实际上与它们的赋值不同.

但是,在printf语句中,输出显示它们是相同的.任何想法为什么会发生这种情况?

图片

mar*_*inj 7

这是由Visual Studio中的增量链接引起的,从此页面您可以了解到其中一个缺点是:

递增链接程序在功能上等同于非递增链接的程序.但是,因为它是为后续增量链接,增量链接的可执行文件,静态库或动态链接库文件准备的:

  • 由于代码和数据的填充,大于非增量链接的程序.填充使链接器能够增加函数和数据的大小,而无需重新创建文件.
  • 可能包含跳转thunk以处理将函数重定位到新地址.

那些跳跃的暴风是你所观察到的.

如果禁用此选项(vs2015):

链接器 - >所有选项 - >启用增量链接到NO

那么你的地址是平等的.

如果您仔细观察反汇编在您分配给DWORD*的地址的位置,您会发现跳转到您的函数:

TestFunc:
000000014001117C  jmp         TestFunc (01400116D0h)  
Run Code Online (Sandbox Code Playgroud)