AppInit_DLLs注册表方式注入DLL

一、注册表方式注入DLL原理

windows操作系统注册表中默认存在两个注册表项:AppInit_DLLs和LoadAppInit_DLLs

测试发现,在win7系统中默认存在此两项

但是在win2003中只存在AppInit_DLLs一项,不要紧可以自己新建个

注册表项意义:

需要注入的dll路径写到AppInit_DLLs中,把LoadAppInit_DLLs值设置为1,重启后,指定dll会注入到运行进程

工作原理:

User32.dll被加载到进程时,会读取AppInit_DLLs注册表项,如果有值,调用LoadLibrary() api加载用户dll。

严格来讲,此dll注入不是注入到所有运行进程,而是注入到加载User32.dll的进程中。

PS:

win xp系统会忽略LoadAppInit_DLLs注册表项

二、myhack2.cpp源码

// myhack2.cpp

#include "windows.h"
#include "tchar.h"

#define DEF_CMD  L"c:\\Program Files\\Internet Explorer\\iexplore.exe"		//IE进程隐藏模式执行 
#define DEF_ADDR L"http://www.naver.com"		//打开指定网站 
#define DEF_DST_PROC L"notepad.exe"

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    TCHAR szCmd[MAX_PATH]  = {0,};
    TCHAR szPath[MAX_PATH] = {0,};
    TCHAR *p = NULL;
    STARTUPINFO si = {0,};
    PROCESS_INFORMATION pi = {0,};

    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    switch( fdwReason )
    {		//判断当前加载进程,是noteapad.exe时,触发IE浏览器访问指定站点 
    case DLL_PROCESS_ATTACH : 
        if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
            break;
   
        if( !(p = _tcsrchr(szPath, '\\')) )
            break;

        if( _tcsicmp(p+1, DEF_DST_PROC) )
            break;

        wsprintf(szCmd, L"%s %s", DEF_CMD, DEF_ADDR);	
        if( !CreateProcess(NULL, (LPTSTR)(LPCTSTR)szCmd, 
                            NULL, NULL, FALSE, 
                            NORMAL_PRIORITY_CLASS, 
                            NULL, NULL, &si, &pi) )
            break;

        if( pi.hProcess != NULL )
            CloseHandle(pi.hProcess);

        break;
    }
   
    return TRUE;
}

三、注册表DLL注入过程

1、修改AppInit_DLLs值指向myhack2.dll路径

2、添加REG_DWORD型注册项LoadAppInit_DLLs,设置值为0x1

3、修改完成后重启电脑,打开notepad触发myhack2.dll

此时查看ProcessExplorer,可以看到IE浏览器要访问指定地址页面,并且myhack2.dll已经注入到notepad中

4、搜索myhack2.dll,找到30个已被注入的进程

5、搜索user32.dll,找到31个已被注入的进程

6、比较user32.dll和myhack2.dll进程列表,发现差别在csrss.exe进程上,具体原因还有待研究

您可能还喜欢...