实验原理
(1)在注册表编辑器中,将要注入的DLL的路径字符串写入AppInt_DLLs项目,把LoadAppInit_DLL的项目值设为1。重启后,指定DLL会注入所有运行的进程。
(2)其实是,user32.dll被加载到进程时,会读取AppInit_DLLs注册表项,若有值,则调用LoadLibrary加载用户DLL。因此严格讲,该DLL只是被加载到加载user32.dll的进程。
(3)注意:xp会忽略LoadAppInit_DLL项。
myhack2.dll源码:
#include "windows.h"
#include "tchar.h"
#define DEF_CMD L"C:\\Program Files\\Internet Explorer\\iexplorer.exe"
#define DEF_ADDR L"http://www.baidu.com"
#define DEF_DST_PROC L"notepad.exe"
BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID lpvReversed)
{
TCHAR szCmd[MAX_PATH] = {0,};
TCHAR szPath[MAX_PATH] = {0,};
TCHAR *p = NULL;
STARTUPINFO si = {0,}; //STARTUPINFO用于指定新窗口特定的一个结构
PROCESS_INFORMATION pi = {0,}; // 创建进程时相关数据结构之一,返回有关进程和主线程的信息
si.cb = sizeof(STARTUPINFO); // 表示包含STARTUPINFO结构中的字节数
si.dwFlags = STARTF_USESHOWWINDOW; // 使用wShowWindow成员
si.wShowWindow = SW_HIDE; // 窗口隐藏
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
if(!GetModuleFileName(NULL,szPath,MAX_PATH))// NULL表示返回该应用程序全路径
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)(LPCSTR)szCmd,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
break;
if(pi.hProcess != NULL)
CloseHandle(pi.hProcess);
break;
}
return TRUE;
}
若当前加载自己的进程是’notepad.exe’,则以隐藏模式运行IE,链接指定网站。
首先将dll放到合适的位置,如c:\work文件夹下;
修改注册表:运行注册表编辑器regedit.exe,进入路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
如果不是xp系统还需要修改LoadAppInit_DLLs注册表项为1.(xp没有这个表项)
重启系统
打开Process Explorer,搜索加载myhack2.dll的程序
发现IE果然被隐藏执行了!哈哈,厉害了!
补充知识:
(1)LPTSTR: 表示指向字符串的指针。相当于char *
LPCTSTR: 表示指向const字符串的指针。相当于const char*
LP: 长指针;C:常量;STR:字符串
(2)STARTUPINFO: 用于指定新窗口特定的一个结构
(3)PROCESS_INFORMATION:创建进程时相关数据结构之一,返回有关进程和主线程的信息
(4)GetModuleFileName()
(5)_tcsicmp
(6)CreateProcess()
(7)wsprintf()