C++只是个菜鸟,最近学习了下DLL注入,是通过hook方式来注入的。暂且不扯,新建个MFC dll,let's go。

首先得需要几个函数:

HHOOK SetWindowsHookEx( 
                                        int idHook,         //要安装的钩子类型 (参考下面的IdHook取值)
                                        HOOKPROC lpfn,   //钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,须定义在DLL中,
                                        HINSTANCE hMod,    //应用程序实例的句柄 如果是全局钩子, hInstance是DLL句柄(DllMain中给的模块地址。就是包含HookProc的动态库加载地址。否则给0就可以了,即勾自己。 
                                        DWORD dwThreadId;   //要安装钩子的线程ID ,指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。);

LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)//钩子回调函数

FindWindow(lpClassName,lpWindowName: PChar)//查找窗体

GetWindowThreadProcessId(hWnd: HWND,lpdwProcessId)//获取线程id/

且看回调函数:

LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) {AFX_MANAGE_STATE(AfxGetStaticModuleState()); //显示窗口 if(wParam==VK_HOME && ((lParam&(1<<31))==0)) { if(gameDlg==NULL) { dlg=new DLG; //这里是根据窗体资源的ID来创建窗体 dlg->Create(IDD_DLG); } dlg->ShowWindow(true); //::AfxMessageBox("home按下"); } //隐藏窗口 if(wParam==VK_END && ((lParam&(1<<31))==0)) { gameDlg->ShowWindow(false); } return CallNextHookEx(0,nCode,wParam,lParam); }

在这里当按下home建的时候回弹出个窗体,那么还需要在dll工程中插入窗体资源,就不在阐述了。

窗体资源创建好后,关联类,然后在dll.cpp中导入窗体关联的类的头文件:

#include "DLG.h"
DLG *dlg;

安装钩子函数,这里我们hook的是计算器void setHook() {AFX_MANAGE_STATE(AfxGetStaticModuleState()); HWND hw=::FindWindow(NULL,"计算器"); if(hw==0) { ::AfxMessageBox("查找窗口失败"); } DWORD threadId=::GetWindowThreadProcessId(hw,NULL); if(threadId==0) { ::AfxMessageBox("获取线程失败"); } ::SetWindowsHookEx(WH_KEYBOARD,HookProc,::GetModuleHandle("dll_dlg.dll"),threadId); }

当dll中插入窗体资源时,在被hook对象中显示出窗体时,如果关闭了注入的程序,那么被注入的程序就会崩溃退出,原因是退出的时候没有清理创建窗体时申请的资源。

重写ExitInstance()

int CDll_dlgApp::ExitInstance() { delete dlg; dlg=NULL; return CWinApp::ExitInstance(); }

如果发现编译出错,说是ExitInstance没定义,需要在头文件中定义一下ExitInstance即可。如果需要设定哪些函数可以被其他对象调用,可以在dll.def中带出要被调用的函数:setHook;那么setHook就是我们希望被调用的函数

dll程序就这些,下面看下注入程序exe。

在注入程序中需要将dll编译生成的dll.dll和dll.lib文件复制到注入文件的工程目录里面,然后在注入文件中导入:

#pragma comment(lib,"dlg.lib");
__declspec(dllexport) void setHook();

然后在某个地方调用setHook()即可,效果如图所示:

VC dll 注入之钩子注入相关推荐

  1. 关于dll注入方式的学习(全局钩子注入)

    何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...

  2. Anti 消息钩子注入

    MSDN上对消息钩子的描述: The SetWindowsHookEx function installs an application-defined hook procedure into a h ...

  3. dll重定位内存注入

    dll重定位内存注入 PE数据重定位已经是很古老的技术了 但是很多网友想了解相关,但是还是没办法自己实现. 然而有了以下内容: 重定位字面理解就是把一个东西的位置改变了. 关于DLL或者sys等可执行 ...

  4. 依赖注入?依赖注入是如何实现解耦的?

    如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? 第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 ...

  5. 框架依赖注入和普通依赖注入_依赖注入快速入门:它是什么,以及何时使用它...

    框架依赖注入和普通依赖注入 by Bhavya Karia 通过Bhavya Karia 介绍 (Introduction) In software engineering, dependency i ...

  6. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )

    文章目录 一.dlclose 函数简介 二.关闭注入的 libbridge.so 动态库 三.恢复寄存器 四.脱离远程调试附着 一.dlclose 函数简介 dlclose 函数的作用是 卸载一个 指 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlsym 函数简介 二.获取 目标进程 linker 中的 dlsym 函数地址 三.远程调用 目标进程 linker 中的 dlsym 函数 获取 注入的 libbridge.so ...

  8. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlopen 函数简介 二.获取 目标进程 linker 中的 dlopen 函数地址 三.远程调用 目标进程 linker 中的 dlopen 函数 一.dlopen 函数简介 dlo ...

  9. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

最新文章

  1. 如何用公式化思维?几个经典公式收集
  2. [译] 通过视图控制器容器和子视图控制器避免庞大的视图控制器
  3. document,element,node方法
  4. ubuntu amd 64bit 安装 QQ for linux教程(附 不能使用中文的解决办法)
  5. hdu5831 Rikka with Parenthesis II
  6. 【华为云技术分享】Batch Normalization (BN) 介绍
  7. linux snap文件夹,SNAP 文件扩展名: 它是什么以及如何打开它?
  8. 【蓝桥杯单片机】独立按键和矩阵按键
  9. 自学编程的八大误区!克服它们,豁然开朗!
  10. 微信多开txt_1分钟教你如何实现微信多开!建议收藏!
  11. QtextEdit自定义右键菜单
  12. c语言数字转成大写,c语言 数字变大写 代码
  13. Xcode8 最快最方便的安装插件方案
  14. 鸿蒙系统可支持exe文件,效仿华为鸿蒙系统!微软放大招:新版Win10系统兼容安卓应用...
  15. 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
  16. ETH数据集下载及相关问题
  17. UCanCode发布领先的大型组态建模仿真CAD与GIS开源套件2019版本
  18. 敏捷方法 - 极限编程与工程实践
  19. 【C#】SharpDevelop使用教程,C#写windows下第一个窗口程序,简单粗暴,初学者进,全图文,一看就明白
  20. Stringtie详解

热门文章

  1. Java Rest path_java – 具有多种类型的REST PathParam
  2. 大量C语言、C++、C#、VC编程相关书籍下载
  3. git 进阶 (四)变基提交
  4. CAD/CASS土地报备坐标数据提取插件txt报盘数据导出工具支持环岛地块
  5. Windows 10 的系统要求
  6. php word 添加,PHP 实现Office word 关键词添加背景色
  7. 922175-70-0,Galacto-RGD,RGDfK(SAA),νβ3表达成像示踪剂
  8. 交换机SVI配置的作用 思科/华为 网络工程
  9. 936烙铁芯发热芯型号判断
  10. Android——检测摄像头是否可用