简单的C++ DLL注入

今天呢,我们来讨论一下用C++实现DLL注入的简单方法。

环境:

  • Visual Studio 2015及以上
  • Windows 7及以上

入门需要了解的:

DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。

所谓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目录下

猜你喜欢

转载自www.cnblogs.com/Mr-Banned/p/9299888.html