21 September 2009 0 Comments

/DYNAMICBASE和/NXCOMPAT

大家好,我叫范翔。我是微软 C++ 上海团队的一名软件开发工程师。 今天我想向大家介绍一下两个和安全性相关的链接器选项: /DYNAMICBASE 和 /NXCOMPAT 。   这两个选项是在 VS2005 中引入的,目的是提高本机代码的安全性。   您可以在 IDE 中设置它们: 这两个选项在 IDE 中有三个可选值: On , Off 和 Default 。   如果你是用 VS2008 的向导生成的 C++ 工程,那么它们会被设置为 “On” 。 当 VS2008 从不支持这两个选项的老版本工程进行升级时 ,会将这两个选项设置为“ Off ”。 如果您选择“ Default ”,链接器的默认值是“ Off ”。   经过多年的推广,我们决定在 VS2010 中将“ Default ”对应的值改为“ On ”,以增强 C++ 应用程序的安全性。   下面是对这两个选项的详细介绍:   1.       DYNAMICBASE   /DYNAMICBASE 使用 Windows Vista 的地址空间布局随机化 ASLR ( Address Space Layout Randomization ) 功能,指定是否生成可在加载时随机重新设定基址的可执行文件映像。 该选项隐含了“ /FIXED:NO ”,以便在可执行文件中生成重定位节。 具体请参见 /FIXED 中的说明。   默认情况下,如果某个组件需要 Windows Vista ( /SUBSYSTEM 6.0 和更高版本 ) ,则会自动打开 /DYNAMICBASE 。 /DYNAMICBASE:NO 可以用于禁用随机重新设定基址。   这篇文件对 ASLR 进行了介绍: http://technet.microsoft.com/zh-cn/magazine/cc162458.aspx ASLR 仅被 Windows Vista 和之后的操作系统支持,它会被之前的操作系统忽略。   ASLR 对于应用程序来说是透明的。当开启 ASLR 的时候,唯一的区别是,操作系统将会无条件的对可执行文件重新设定基址。如果未开启 ASLR ,只有当发生地址冲突的时候,操作系统才会重新设定基址。   2.       NXCOMPAT   /NXCOMPAT 用于指定可执行文件与 Windows 数据执行保护功能 DEP ( Data Execution Prevention )兼容 请注意,该选项只适用于 32 位的可执行文件。非 32 位的桌面版 Windows (比如 x64 和 IA64 )总是会为 64 位的应用程序开启 DEP 。   下面是对 DEP 的详尽介绍: http://support.microsoft.com/kb/875352   默认情况下,如果某个组件需要 Windows Vista ( /SUBSYSTEM 6.0 和更高版本 ) ,则会自动打开 /NXCOMPAT 。 /NXCOMPAT:NO 可以用于指定应用程序和 DEP 不兼容。然而,管理员仍然可以强制为所有的应用程序开启 DEP 。因此,您总是应当测试您的程序和 DEP 的兼容性。   Windows Vista SP1 、 Windows XP SP3 和 Windows Server 2008 增加了一个新的 API SetProcessDEPPolicy 。它允许开发人员在运行时而不是链接的时候设置程序的 DEP 策略。具体的信息请参考下面的链接: http://blogs.msdn.com/michael_howard/archive/2008/01/29/new-nx-apis-added-to-windows-vista-sp1-windows-xp-sp3-and-windows-server-2008.aspx   下面列举了常见的和 DEP 不兼容的例子(更详细的信息请参见 http://msdn.microsoft.com/en-us/library/aa366553.aspx ) a

Read more: 
/DYNAMICBASE和/NXCOMPAT

If you liked this post, buy me a Coffee.

Leave a Reply