这个小DEMO花了我两个周末的时间~主要是修改mcupdate.dll太麻烦了,还是参考了diyhack 的方法,并且对remotethread做了一些猥琐的改造,才搞定了

在这里感谢DIYHACK提供的线索~

原先说WIN7上用microcode加载驱动,但是xHalMicroCode没实现,其实不是没实现,而是在halinitsystem时填充(ntoskrnl 做SystemStartup时调用),其实就是hal私有dispatch表,当时居然没注意。。。

另外VISTA也支持MICROCODE加载驱动,这个就不多说了

DEMO的主要原理是通过cpuid指令确定CPU类型,BUILD MCU UPDATE DLL的路径,然后启动TrustedInstall服务,注入之,覆盖mcupdte dll,然后unload muc update的image ,再reload

这样我们的驱动可以得到一次内核的执行机会

其他细节:

(1).vista/win7的系统文件防护太强大了。第一周我直接磁盘感染(因此有了前面某篇BLOG),失败,提权失败,然后改注入TrustedInstall服务,发现createremotethread居然也有猫腻~太猥琐了。因此DEMO理对createremotethread做了比较不通用的手脚,测试程序我只在VISTA SP0/SP1上跑过,WIN7上不知道会不会有问题,不过应该可行

(2).感染完mucupdate.dll加载完,一定要记得在驱动里或者注入trustedinstall再改回来,因为重启时是由ntldr加载mcuupdate,会检查微软的签名,签名不过系统就启动不了~其实本来这个可以做bootkit,因为mcuupdate是boot load,然后halinitsystem会在很早的地方调用它,不过没有签名,所以不行了~

所以测试这个DEMO务必在虚拟机中进行,并且最好开启boot debugging,用WINDBG调试系统,这样就不会因为没签名而无法启动,一旦进不去了,用vmware直接映射虚拟机系统盘都改不了mcupdate_GenuineIntel.dll ~当然我的这个DEMO程序可以改,参考微软的话:

*** Windows is unable to verify the signature of the file \Windows\system32\mcupdate_GenuineIntel.dll. It will be allowed to load because the boot debugger is enabled.

demo程序下载:MircoCode.rar

使用方法:

(1).虚拟机内测试,做好snapshot,用bcdedit /bootdebug on和bcdedit /debug on开启BOOT调试,用WINDBG调试虚拟机(此步骤不是必须,但以防万一~不然进不了系统不要找我)

(2).备份system32下mcupdate_xxxxx.dll(xxxx为你的CPU类型)文件

(3).将xxload.exe和mcud.sys复制到同一目录(例如桌面),以管理员权限运行xxload.exe

(4).你可以看到成功的提示后,用冰刃等工具查看内核模块列表,可以看到大小4096的mcud.sys已经成功进驻内核模块,同时c:\windows\system32\mcupdate_xxxx.dll也被改成了这个文件

(5).完了将备份的mcupdate覆盖为mcud.sys,运行xxload将文件覆盖回来,不然重启就启动不了了~