今天,调试一个程序,这个程序有一个加入资源管理器右键菜单的功能,不知道什么原因,突然我发现所有的exe文件都不开了,点击右键发现,右键菜单的第一个项目已经不是“打开”,而是HKEY_CLASSES_ROOT\*\shell\下面的第一个键值,这里为[HKEY_CLASSES_ROOT\*\shell\Add to HFS],所以无论我打开任何exe程序都是把程序应用到HFS这个程序中。心中甚感郁闷,于是开始了一番追查,报告结果如下。
以一个exe文件的右键菜单为例,主要说说文件的右键菜单,目录和磁盘的差不多,这是我修复后的右键菜单截图。
右边是右键菜单内容,左侧为注册表中对应的内容。正常情况下,右键菜单加载时,系统一般是先加载HKEY_CLASSES_ROOT\exefile\shell下的内容,然后再加载所有自定义菜单项HKEY_CLASSES_ROOT\*\shell。右键菜单一般按照字母顺序排列,但是将open项至于最前,并且加黑加粗,即为双击激活的命令。但是由于出错,我的系统刚好出现了交换,先执行*项下的内容,然后执行exefile项下的内容,由于双击执行的是右键菜单的第一个命令,结果我双击任何exe时都执行的是“add to HFS”命令,从而无法打开程序,增添了很多麻烦,这倒是导致了一种可能的加载特定程序的方法,如果可以找到这个原因那就可以决定加载的顺序并加以利用。在这种状态下exe关联文件是没问题的,用sreng等程序检测exe关联文件结果正常,工具检测exe的关联是否正确,检测的是HKEY_CLASSES_ROOT\exefile\shell\open\command\下的默认键值“"%1" %*”是否被修改,而我们并没有改变这个键值,而是改变了加载顺序。以前的病毒是通过修改exe的关联文件及HKEY_CLASSES_ROOT\exefile\shell\open\command下的默认键值达到启动程序时同时加载恶意程序,因为open项是右键第一个及双击时激活的命令。如果了解了右键菜单的加载顺序,那么就可能出现exe文件关联正常,但是双击exe时可以运行对应程序同时又加载特定程序的现象,因为改变加载顺序后只需要在HKEY_CLASSES_ROOT\*\shell下伪造一个“open”项就可以了。
是什么因素决定了这个加载的顺序?我尝试了多种方法去测试,“open”是一个特别的项,无论在注册表相应项中处于什么位置,在右键菜单中总是位于第一位的,方便打开程序。首先是把HKEY_CLASSES_ROOT\exefile\shell下的所有键值删除,从另外一台电脑里面copy一个正常的,然后覆盖,问题一样,说明不是这里的问题;我删除了HKEY_CLASSES_ROOT\*\shell下面的所有键值,这时候双击程序是正常了,因为*项下为空那么exefile下的open项就是第一个命令。但是是只要在HKEY_CLASSES_ROOT\*\shell下面重新定义一个键值比如重新添加一个右键菜单test,双击马上就不能打开程序,因为这时执行的第一个命令是test,说明与添加右键菜单键值的前后顺序无关;还尝试了很多方法,都无法把“打开”放到第一位。至此放弃寻找加载顺序的原理。只能归因于系统出错,但是出错的在哪里?
找不出原因了,那么我们尝试修复,既然有特定键值,那么系统一定有监视exefile这个项,我们删除这个项目下面的所有键值,然后用sreng重新修复exe关联文件,建立HKEY_CLASSES_ROOT\exefile\shell\Open\Command项,恢复exefile和系统之间的联系。至此“打开”重回右键菜单的第一位。