一种少见的Dll注入方式(基于MS 应用程序验证机制)

来源:互联网 发布:c 定义二维数组 编辑:程序博客网 时间:2024/06/06 01:06

之前我转发了关于一篇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

本篇完

0 0