用OllyDBG调试Explorer.exe的两种办法

前言
    腾讯比赛中第一阶段第四题是要利用StretchDIBits函数的漏洞,漏洞还算好找,用IDA打开很快就能看到可疑点,但难的是调试验证。因为Explorer.exe进程在Windows中的特殊性,所以调试起来不太容易,如果采用OD直接Open或Attach的方式,要么是断不下来,要么就是导致系统没有响应。尽管forgot等大牛已经提示过了要修改DesktopProcess,但本人脑瓜较木,一直不明白是啥意思,这团阴影缠绕了我一星期。刚好昨天下午还算空闲,就决心要把这个问题搞定,于是在Google中找啊找,先是用了shoooo大的“可注入Explorer的OD”,可是不知是否我的用法不对,还是不管用,最后终于看到了这篇MS的文档:Debugging with the Shell
http://msdn.microsoft.com/en-us/library/cc144064(VS.85).aspx,经过反复验证确定可行后,想到调试Explorer.exe的方法在网上很难找到,于是便有了下文。

第一种:神奇的CTRL+ALT+SHIFT
      OD菜单:File -> Open,选择Windows目录下的Explorer.exe,打开之后,OD将会自动中断在入口点,这时在系统中会存在2个Explorer.exe进程,如下图:

 

接下来从“开始”菜单或者“任务管理器”中选择“关机”,系统弹出关机对话框,如下图:

 

此时很关键了,要在按住CTRL+ALT+SHIFT三个键的同时,点击“取消”按钮,注意:必须是同时才有效,即先按下三个键,然后再点击。屏幕会在短暂的灰屏后重新亮起,原来的Explorer.exe已经被关闭,但是被OD调试的那个还在,如下图:

 

之后你会发现桌面和任务栏都不见了,但不用担心,这是正常的,你原来打开的所有应用程序都还健康地活着,在OD下需要的断点,然后按F9运行,这时的Explorer就像普通进程一样开始运行,可以被OD任意调试了。
    按下CTRL+ALT+SHIFT三个键表示什么意思呢?我也不知道,在Google上也没找到,要是有谁知道的,请一定要告诉我。 


第二种:修改注册表
注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer键下新建一个DWORD值为1,修改之后如下图:
 


这个值的意思是让Windows中的桌面和任务栏使用一个单独的Explorer.exe进程,而其它的文件浏览等操作则使用另外一个Explorer.exe进程。修改后进行注销再重新登录,使修改生效。之后就和第一种方法一样了,操作OD菜单:File -> Open,选择Windows目录下的Explorer.exe,在OD下需要的断点,按F9运行,用被OD调试的这个Explorer.exe进行文件浏览等,当触发了断点后就会被断下。
    如果用IDA创建了系统DLL的MAP文件,还可以用OD插件LoadMapEx加载到OD中,这样在OD中也能看到MS的调试符号,会把系统对Explorer.exe的调用流程看得更清楚。以Gdi32.dll中的StretchDIBits函数为例,在Explorer.exe中下了StretchDIBits断点后,当该断点被触发时,从我机器上的CallStack窗口可以看到这样的流程:Shell32 -> User32 -> Gdi32.StretchDIBits。如下图:

 

总结
    这两种方法比较,尽管第一种方法感觉有点酷,不过从稳定性方面考虑,个人还是推荐第二种方法。