[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options] 注册表的这个项大家可能还不太熟悉因为这个主要是用来调试程序用的对一般用户意义不大默认是只有管理员和local system有权读写一般user只读 先做个实验在这个项下新建一个子项testexe再建一个字串值Debugger数值数据设为cmdexe /c echo随便把一个EXE文件改名为testexe然后在命令行调用testexe得到的屏幕输出不是testexe的输出而会是这样 E:\>test test E:\>testexe testexe Windows NT系统在执行一个从命令行调用的可执行文件运行请求时首先会检查这是否是一个可执行文件如果是又是什么格式的然后就会检查是否存在 [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName] 如果存在首先会试图读取这个键值 [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName] Debugger=debug_prog 如果存在就执行debug_prog ImageName刚才的例子中其实系统真正执行的是 cmdexe /c echo test cmdexe /c echo testexe 如果debug_prog设为一个不在搜索路径中的程序会得到一个很有趣的提示系统找不到文件 E:\testexe而事实上testexe就在当前目录下这里所谓找不到的其实是那个debug_prog而只要设置了testexe这个项既使testexe不存在也不会提示系统找不到文件控制台上不会返回任何输出 系统在运行任何一个可执行程序时都会先检查这个键值这个特性可以被用来放置后门这一点在以往的Windows 安全资料中尚未提到过如果你有一个Windows 安全检查列表请把它加进去 这个项支持的值在Windows 下我找到的有 ApplicationGoo Debugger PageHeapFlags DisableHeapLookAside DebugProcessHeapOnly PageHeapSizeRangeStart PageHeapSizeRangeEnd PageHeapRandomProbability PageHeapDllRangeStart PageHeapDllRangeEnd GlobalFlag BreakOnDllLoad 这些项的工作都只与文件名有关与路径无关 其中Debugger上面讲过了DisableHeapLookAside可以用来纠正一些应用程序运行时的问题从Windows NT SP开始Windows 系统使用了新的堆(heap)管理机制新的动态内存分配使得应用程序占用更少的内存(也使写Exploit更加困难:))但是也有些应用程序在这种机制下无法正常运行会挂起或出错这种情况下以该文件名建一个项并把DisableHeapLookAside 设为会强迫系统对此应用程序不使用新的堆管理机制(基于一般系统的堆溢出 Exploit在应用程序改变了运行方式后是不是会失效?那么对关键程序使用这一手段在某种意义上也是一种抵御溢出攻击的方法) 关于DisableHeapLookAside更多的信息请参考微软知识库QQQ 有趣的是Windows 在安装的时候就预设了这几个文件名的DisableHeapLookAside encEXE fmainexe prwinEXE psEXE qfinderEXE qpwEXE uaEXE wpwinEXE 大概是微软收到了有关这些应用程序运行异常的报告吧:) BreakOnDllLoad 是用来调试DLL的譬如某个ISAPI可以在DLL刚一装入就设置断点 ApplicationGoo我没有找到相关资料但从微软预设的值来看这个项里存放的是文件的版本信息我猜想是否用这个来匹配特定版本的文件 剩下来的这几个值虽然我知道它们是确实存在的却无法找到任何有关的资料甚至在MSDN里也只字未提还好它们的名称基本上已经把用处说清楚了:)都是用来控制heap 的希望这几个值对正在埋头研究Windows堆溢出的朋友们能有一点点帮助 附加信息 在XP中这个项下面还支持ShutdownFlags这个值下面是微软的描述 Leak Detection when the Process Is Exiting Leak detection is made every time a process is cleanly exiting It doesnt work if the process is terminated with TerminateProcess() or TerminateThread() / ExitThread() for the last thread in the process; but for most applications this is not a problem To enable leak detection when the process is exiting set the registry key as follows: [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName] ShutdownFlags= |