今天呢,我們來討論一下用C++實現DLL註入的簡單方法。 環境: Visual Studio 2015及以上 Windows 7及以上 入門需要瞭解的: DLL是什麼:DLL_360百科 DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程式並不是一 ...
今天呢,我們來討論一下用C++實現DLL註入的簡單方法。
環境:
- Visual Studio 2015及以上
- Windows 7及以上
入門需要瞭解的:
- DLL是什麼:DLL_360百科
DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程式並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程式時,相應的DLL文件就會被調用。一個應用程式可有多個DLL文件,一個DLL文件也可能被幾個應用程式所共用,這樣的DLL文件被稱為共用DLL文件。
- 註入是什麼:註入_360百科
所謂DLL註入就是將一個DLL放進某個進程的地址空間里,讓它成為那個進程的一部分。要實現DLL註入,首先需要打開目標進程。
任務目標:將DLL註入到Windows計算器中,使按下Home鍵時彈出消息框(MessageBox)
1.生成DLL文件:
2.代碼時間!
需要瞭解的函數方法:
FindWindow( //返回該窗體的句柄(HWND) LPCTSTR lpClassName, //窗體的類名,可以為NULL LPCTSTR lpWindowName //窗體的標題 ); GetWindowThreadProcessId( //返回這個線程的ID(DWORD) HWND hWnd, //該窗體的句柄(HWND) 用FindWindow獲取 LPDWORD lpdwProcessId //存放 線程的變數地址(DWORD) 的地址(有點繞口 = =) ); GetModuleHandle( //獲取一個特定的應用程式或動態鏈接庫的模塊句柄 LPCTSTRlpModuleName); //模塊名稱 也就是DLL項目名 SetWindowsHookEx( __in int idHook, //鉤子類型 這裡用的是鍵盤鉤子,所以用WH_KEYBOARD __in HOOKPROC lpfn, //回調函數地址 處理鍵盤事件的方法 __in HINSTANCE hMod, //實例句柄 也就是這個DLL的句柄,用GetModuleHandle獲取 __in DWORD dwThreadId); //線程ID 用GetWindowThreadProcessId獲取
瞭解以上函數以後,事情就變得十分簡單了:
直接將代碼加入到初始的cpp中即可,註意更改部分的代碼以相容你自己的程式:
LRESULT WINAPI KeybordProc(int code, WPARAM wP, LPARAM lP) { if (code == HC_ACTION && wP == VK_HOME && GetKeyState(VK_HOME) < 0) { MessageBox(NULL,TEXT("LOL"),TEXT("IS WORKING!"),0); return 0; } return CallNextHookEx(NULL, code, wP, lP);//一定要有,否則程式可能無法正常運行 } void _stdcall SetHook() { HWND Games; Games = ::FindWindow(NULL, TEXT("計算器")); DWORD PID, TID; TID = ::GetWindowThreadProcessId(Games, &PID); HHOOK g_Hook=::SetWindowsHookEx(WH_KEYBOARD, KeybordProc, GetModuleHandle(TEXT("MFCLibrary2.dll")),//註意這裡是生成的dll名稱 TID); }
生成->編譯
沒差錯的話DLL就生成在了debug目錄下