windows系统下Hook

文章示例来至《Windows核心编程》第22章实例Desktop Item Position Saver工具
DIPS示例程序下载

原理说明

windows下使用Hook实现对远程进程注入DLL技术,通过共用操作系统下同一份DLL,实现对目标进程的特定消息传输,甚至达到控制的技术。
首先需要了解的实现DLL注入实现Hook进程的方式

HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstDll, 0);

由于windows下对DLL是通过映射到虚拟内存地址,及不同的进程,对同一份DLL的加载,对于操作系统而言,只加载同一份,通过引用计数来记录加载了几次。并且通过DLL中定义的GetMsgProc函数实现对WH_GETMESSAGE钩子类型的转发。

代码说明

代码本身是通过窗口消息实现的收发实现的注入

LibDips动态库

动态库对外实现的导出接口

#if !defined(DIPSLIBAPI)
#define DIPSLIBAPI __declspec(dllimport)
#endif
DIPSLIBAPI BOOL WINAPI SetDIPSHook(DWORD dwThreadId);

接口函数只有一个参数,参数就是对应的目标线程ID,目标线程ID就是Explorer进程下排列图标的ListView的窗口句柄;通过调用GetWindowThreadProcessId确定创建窗口的线程ID。
接口函数中,SetDIPSHook参数id如果不为0,那么就会使用注册函数注入DLL到目标进程

g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll, dwThreadId);

同时,DLL会记录当前调用接口的线程ID,该线程ID记录下来是为了实现窗口消息的发送;

bOk = PostThreadMessage(dwThreadId, WM_NULL, 0, 0);

在GetMsgProc中,如果DLL是第一次载入,那么会创建一个隐藏的窗口,这个隐藏窗口才实现了DIPS与Explorer进程之间的通信和Hook内容的执行。

CreateDialog(g_hInstDll, MAKEINTRESOURCE(IDD_DIPS), NULL, Dlg_Proc);

创建的Dialog中有一个处理消息队列的函数,Dlg_Rroc函数,该函数即实现了DIPS主程序对这个隐藏窗口函数SendMessage内容的处理,从而实现图标位置信息的保存与恢复。
对于桌面图标位置的记录,本程序是使用的注册表来实现的,具体实现可参考代码

// 保存窗口图标位置
void SaveListViewItemPositions(HWND hWndLV);
// 恢复窗口图标位置
void RestoreListViewItemPositions(HWND hWndLV)

Trick

在实现Hook中,有一些问题:

  1. 不同进程之间共享数据段?
  2. 系统钩子如何注销?
    问题1:在DLL中,进程之间共享数据段,可以通过链接器配置实现
// 对链接器标识共享数据段
#pragma data_seg("Shared")
HHOOK g_hHook = NULL;
DWORD g_dwThreadIdDIPS = 0;
#pragma data_seg()
// 让链接器对共享的数据段,可读,可写,可共享
#pragma comment(linker, "/section:Shared,rws")

问题2:如何注销系统钩子

bOk = UnhookWindowsHookEx(g_hHook);

DIPS代码

DIPS是执行注入的进程,首先本身是一个MFC的进程,该进程有三个按钮

Save按钮用于保存当前图标位置;Restore按钮用于恢复保存的图标位置。
首先需要通过Spy++获取Explorer进程下的ListView控件窗口的线程ID,将ID传给DLL
然后通过判断点击Save还是Restore按钮,分别发送不同的消息到隐藏窗口

BOOL bSave = (cWhatToDo == TEXT('S'));SendMessage(hWndDIPS, WM_APP, (WPARAM) hWndLV, bSave);

Trick

这里作者比较完整地实现了DLL注入的注销

SendMessage(hWndDIPS, WM_CLOSE, 0, 0);
SetDIPSHook(0);

首先是销毁隐藏的对话框,在清除挂钩。否则对话框收到的下一条消息会导致Windows资源管理器的线程引发访问冲突。

windows系统之Hook实例DIPS相关推荐

  1. C/C++:Windows编程—IAT Hook实例(程序启动拦截)

    C/C++:Windows编程-IAT Hook实例(程序启动拦截) 前言+思路 本文默认读者有IAT Hook的相关的基础知识了哈,记录笔者在IAT Hook实战中遇到到问题以及解决思路. 笔者想实 ...

  2. 操作系统笔记——Linux系统实例分析、Windows系统实例分析

    文章目录 传送门 Linux进程管理 Linux进程组成 Linux进程链表 Linux进程控制 用户进程创建与撤销 0,1,2号进程 Linux进程切换 Linux进程调度 内核同步 Linux储存 ...

  3. 2020-11-23(Windows系统的dll注入 )

    一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...

  4. microsoft WINDOWS 系统错误代码

    microsoft WINDOWS 系统错误代码 MS Windows Error Messages Code Error Message 0  操作成功完成.   1  功能错误.   2  系统找 ...

  5. Windows 系统API 函数快速查找

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  6. Windows系统的dll注入

    一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...

  7. Redis进阶实践之三如何在Windows系统上安装安装Redis

    一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset( ...

  8. Atitit.Java exe bat  作为windows系统服务程序运行

    Atitit.Java exe bat  作为windows系统服务程序运行 1. 使用SC命令+srvany.exe (不错,推荐)+net start1 1.1. First 创建一个java的运 ...

  9. php输出mysql错误日志_PHP_PHP中把错误日志保存在系统日志中(Windows系统),【将错误记录到系统日志中】 - phpStudy...

    PHP中把错误日志保存在系统日志中(Windows系统) [将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: error_log = syslog 或者在运行时使用 i ...

  10. Sonic 开源移动端云真机测试平台 - windows系统下的sonic快速部署演示

    Sonic 开源移动端云真机测试平台快速部署演示 第一章:Sonic 平台的准备工作与快速部署 ① Docker 的安装 ② MySQL 的安装 ③ docker-compose.yml 文件配置 ④ ...

最新文章

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法5:决策树之CART算法
  2. 手把手教你求职进入BAT
  3. vue-day04-vue前端交互
  4. 数据库连接串你知道多少
  5. 【狂神MyBatis笔记】map作为参数传递类型进行增删改查模糊查询
  6. linux scp 遇到空格
  7. 老人机java游戏模拟器_Java模拟器
  8. python 数据库模糊查询
  9. 测开面试题大全及答案(含测试基础|实例介绍|软件本地化测试等)
  10. Linein和Micin的区别
  11. mysql nlssort_Oracle中文排序 NLSSORT
  12. 计算机在室内设计的应用,计算机辅助设计软件在室内设计教学中的应用
  13. 微信订阅号和服务号的区别
  14. 计算机网络职业评估报告,计算机网络技术专业个人职业生涯规划书.doc
  15. 微服务实施笔记(五)——生产环境部署
  16. [原创]ubuntu18.04上安装opencv_contrib-3.2.0,成功经验分享,自己踩的坑也填过了。
  17. ansible的使用
  18. SSO的实现和参考工具类
  19. encode() decode() 编码解码函数
  20. 软件测试仿真系统,嵌入式系统软件仿真自动化黑盒测试平台

热门文章

  1. SpringCloud微服务架构前后端分离项目实践
  2. SAS进行多元回归线性分析
  3. java贪吃蛇详细设计,javascript贪吃蛇游戏设计与实现
  4. 计算机编程—必备基础知识点
  5. Linux命令学习:Linux中more和less命令以及查找用法
  6. 平面设计从事什么工作
  7. xen服务器不能挂载iso文件,Citrix XenCenter安装VM之挂载ISO详解
  8. mysqldump: Got error: 145 解决方案
  9. QCustomplot绘图性能的改善
  10. 信号与系统与数字信号处理丹梅老师公众号笔记