windows系统之Hook实例DIPS
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:在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相关推荐
- C/C++:Windows编程—IAT Hook实例(程序启动拦截)
C/C++:Windows编程-IAT Hook实例(程序启动拦截) 前言+思路 本文默认读者有IAT Hook的相关的基础知识了哈,记录笔者在IAT Hook实战中遇到到问题以及解决思路. 笔者想实 ...
- 操作系统笔记——Linux系统实例分析、Windows系统实例分析
文章目录 传送门 Linux进程管理 Linux进程组成 Linux进程链表 Linux进程控制 用户进程创建与撤销 0,1,2号进程 Linux进程切换 Linux进程调度 内核同步 Linux储存 ...
- 2020-11-23(Windows系统的dll注入 )
一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...
- microsoft WINDOWS 系统错误代码
microsoft WINDOWS 系统错误代码 MS Windows Error Messages Code Error Message 0 操作成功完成. 1 功能错误. 2 系统找 ...
- Windows 系统API 函数快速查找
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
- Windows系统的dll注入
一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis
一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset( ...
- Atitit.Java exe bat 作为windows系统服务程序运行
Atitit.Java exe bat 作为windows系统服务程序运行 1. 使用SC命令+srvany.exe (不错,推荐)+net start1 1.1. First 创建一个java的运 ...
- php输出mysql错误日志_PHP_PHP中把错误日志保存在系统日志中(Windows系统),【将错误记录到系统日志中】 - phpStudy...
PHP中把错误日志保存在系统日志中(Windows系统) [将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: error_log = syslog 或者在运行时使用 i ...
- Sonic 开源移动端云真机测试平台 - windows系统下的sonic快速部署演示
Sonic 开源移动端云真机测试平台快速部署演示 第一章:Sonic 平台的准备工作与快速部署 ① Docker 的安装 ② MySQL 的安装 ③ docker-compose.yml 文件配置 ④ ...
最新文章
- 【机器学习基础】数学推导+纯Python实现机器学习算法5:决策树之CART算法
- 手把手教你求职进入BAT
- vue-day04-vue前端交互
- 数据库连接串你知道多少
- 【狂神MyBatis笔记】map作为参数传递类型进行增删改查模糊查询
- linux scp 遇到空格
- 老人机java游戏模拟器_Java模拟器
- python 数据库模糊查询
- 测开面试题大全及答案(含测试基础|实例介绍|软件本地化测试等)
- Linein和Micin的区别
- mysql nlssort_Oracle中文排序 NLSSORT
- 计算机在室内设计的应用,计算机辅助设计软件在室内设计教学中的应用
- 微信订阅号和服务号的区别
- 计算机网络职业评估报告,计算机网络技术专业个人职业生涯规划书.doc
- 微服务实施笔记(五)——生产环境部署
- [原创]ubuntu18.04上安装opencv_contrib-3.2.0,成功经验分享,自己踩的坑也填过了。
- ansible的使用
- SSO的实现和参考工具类
- encode() decode() 编码解码函数
- 软件测试仿真系统,嵌入式系统软件仿真自动化黑盒测试平台