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进程上,具体原因还有待研究