文号
839073
阅读
25550
回复
2
收藏
4
如何让exe基地址不乱跑
2017/09/03
IP:四川
exe基地址乱跑,是因为在比较新的Visual Studio中,link添加了/dynamicbase参数,这个参数是用来声明程序在Windows Vista以后的系统中兼容地址空间布局随机化(ASLR)安全特性的。

另外还有一个参数是/fixed,这个参数是删除.reloc节用的。由于exe载入较早,只有启用/dynamicbase时,或者在非常古老的win32s平台运行时,才需要exe有.reloc节。dll则必须有.reloc节,否则地址空间重叠的dll只能载入一个,因此dll一般来说不能指定/fixed参数。

按照如下设置即可将exe基地址还原为Windows Vista之前的特性,x86加载到0x00400000,x64加载到0x0000000140000000:

dynamicbase.png

一个有趣的现象是,x64平台下无论有没有指定/dynamicbase,都会将exe加载到4GB以上,应该是为了方便捕捉地址截断错误而设计的。
[ 修改于9年3个月前 - 2017/09/03 22:08:34 ]
acmilan作者
9年2个月前修改于 9年2个月前IP:四川
839710
1楼
如果需要找exe的基地址,通过(w)WinMain函数的参数,或者通过GetModuleHandle(NULL)。
如果需要当前dll的基地址,通过DllMain函数的参数。
除此以外,还有一种方法,可以通过链接__ImageBase符号来获得基地址。
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
引用
评论
6年8个月前IP:北京
876755
2楼

摸米兰姐姐

引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的