之前我转发了关于一篇Dll注入的文章:DoubleAgent: Zero-Day Code Injection and Persistence Technique 。文章中提到通过提供伪造的应用程序验证器(下文简称恶意VerifierDlls)注入进程的思路和windows镜像劫持(下文简称为IFEO)有点相似,都是通过修改注册表项来实现劫持进程的目的。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions\"Image File Name .exe"
区别之处在于:IFEO修改该注册表路径下字符串"Debugger"的值为某个指定调试器(也可以是其他可执行程序),使得双击exe后先启动该调试器,然后再有调试器启动exe运行(类似为exe做了一个shell)。附带一句,windbg目录下的gflags工具可以实现这个过程,例如,为notepad.exe指定"Debugger"为windbg.exe:
如果说IFEO是MS提供的一种调试机制----使得每次exe都运行在调试器下,方便工程师在开发阶段排除问题。那么接下来要说的恶意VerifierDlls则利用了MS提供的另一种机制----在测试阶段为exe的运行指定一套VeriferDlls(一般情况下是MS提供的ApplicationVerifier及其附带的dll),这些VerfierDlls通过API Hook的形式,实时检验应用程序是否存在隐含漏洞。要启用这个功能,需要为exe在上文提到的注册表路径下设置两个注册表项的值:a.创建DWORD类型的GlobalFlag,并指定其值为0x100;b.创建字符串项VerifierDlls,并指定恶意Dll的名字。
以我的实验环境为例,我为notepad.exe指定VerifierDlls的值为Msg.dll,Msg.dll存放在c:\windows\system32下,代码如下:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
Sleep(2000);
return TRUE;
}
设置后,一旦启动notepad.exe,就会调用Msg.dll!DllMain,最终效果就是拖后notepad.exe主界面显示约2s。
当然gflags工具也启用这个功能:
最后,提点题外话。这样的dll启动运行有很多限制:1.Dll加载时会获得一把加载锁,可能会在DllMain中引起死锁;2.某些Dll还没加载----对应的API暂时不能使用,这是绝对不能用LoadLibrary加载对应Dll,否则会引起1中的问题。当然,如果有问题就可能需要调试,调试手段已经记录在我的另一篇博文中:
从DllMain下断点到LdrpCallInitRoutine
本篇完