VC2008编译的函数,每次运行地址都不一样

jamseyang 2012-05-03 08:22:40
以下代码在VC2005下函数地址是固定的0x4110e1
在VC2008下函数地址每次运行都不一样,0x3b10e1、0xfd10e1、0x10c10e1等等

#include <stdio.h>

void Fun()
{
printf("Fun Address:0x%0x\n", Fun);
}


int _tmain(int argc, _TCHAR* argv[])
{
Fun();
return 0;
}




请问造成VC2005和VC2008不同的原因是什么?怎样获取VC2008的编译函数的固定地址?
谢谢
...全文
124 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

第二种要重启的
[/Quote]
重启后测试OK,再次感谢列林!
jamseyang 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

第二种要重启的
[/Quote]
谢谢,我试试
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
第二种要重启的
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
然后?
jamseyang 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

直接修改文件,OptionalHeader.DllCharacteristics&=~0x0040
在全局范围禁用动态基地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
MoveImages=0
[/Quote]
按照大大说说,我使用PE工具修改了DllCharacteristics的值后,Fun的地址固定了是0x4110e1。

第二种修改注册表的方法,经过测试没有成功。我的机器是32位Win7系统,注册表相关位置没有“MoveImages”项,我手动新建了一个32位的名称为“MoveImages”,值为0的项。
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
直接修改文件,OptionalHeader.DllCharacteristics&=~0x0040
在全局范围禁用动态基地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
MoveImages=0
jamseyang 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

/DYNAMICBASE:NO
/FIXED:YES
[/Quote]
目标程序没有源码,我用OllyDbg做一些修改,要肿么做呢?
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
/DYNAMICBASE:NO
/FIXED:YES

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧