今天呢,我們來討論一下用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目錄下