今天呢,我们来讨论一下用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目录下