欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简单的C++ DLL注入

程序员文章站 2022-07-23 21:58:09
今天呢,我们来讨论一下用C++实现DLL注入的简单方法。 环境: Visual Studio 2015及以上 Windows 7及以上 入门需要了解的: DLL是什么:DLL_360百科 DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一 ......

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

简单的C++ 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);

}

简单的C++ DLL注入

生成->编译 

 简单的C++ DLL注入

没差错的话dll就生成在了debug目录下

简单的C++ DLL注入