C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(下)
Hook IE浏览器实现URL拦截及更改(下)
前言
接上一篇 C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(上),本节为了实现上一篇待优化部分。实现IE进程时时监控,当有新的IE进程打开时注入我们的动态库。如何使用时时监控IE进程呢?笨方法就是 开一个线程 一直去遍历 IE进程 发现有新的IE进程就注入。这种方法有点low,笔者当然不想用,所以在网络上寻找,有说在驱动层去监控,笔者目前驱动还不怎么会 当然放弃驱动层了。后面在这篇博客 https://blog.csdn.net/maoenpei002/article/details/5358601 给了我思路使用 Windows 全局钩子!Windows钩子应该是最简单的hook方式,主要是针对GUI程序 带消息机制的程序。
运行效果
笔者运行环境为 win10 64位 IE11
哔哩哔哩视频运行效果可以这里看
HOOK IE浏览器拦截URL效果(下)
代码
这里代码就是根据我们需要时时监控IE进程写的 Windows全局钩子的DLL的代码。
#include "stdafx.h"
#include "MsgHook.h"
#include <Windows.h>HMODULE g_hModule ;
HHOOK g_hook = NULL;LRESULT CALLBACK HookProc(int code, // hook codeWPARAM wParam, // removal optionLPARAM lParam // message)
{if(g_hook){return CallNextHookEx(g_hook,code,wParam,lParam);}return 1;
}void SetMsgHookOn()
{OutputDebugString(_T("===== SetMsgHookOn enter===== \n"));g_hook = SetWindowsHookEx(WH_GETMESSAGE,HookProc,g_hModule,0);if(g_hook == NULL ){DWORD errCode = GetLastError();CString errMsg = CUtility::GetErrorMsg(errCode);CString temp;temp.Format(_T("SetWindowsHookEx false!!!errCode:%d,errMsg:%s\n"),errCode,errMsg);OutputDebugString(temp);}
}void SetMsgHookOff()
{OutputDebugString(_T("===== SetMsgHookOff enter =====\n"));CString temp;temp.Format(_T("Cur Exe:%s\n"),CUtility::GetCurExeName());OutputDebugString(temp);BOOL ret = FALSE;if(g_hook){ret = UnhookWindowsHookEx(g_hook);}if(ret == FALSE){DWORD errCode = GetLastError();CString errMsg = CUtility::GetErrorMsg(errCode);CString temp;temp.Format(_T("UnhookWindowsHookEx false!!!errCode:%d,errMsg:%s\n"),errCode,errMsg);OutputDebugString(temp);}
}// 下的全局钩子被系统强势注入到进程中后通知你的目标程序
void NotifyYourApp(BOOL bTatch)
{HWND targetWnd = FindWindow(_T("#32770"),MAIN_APP_TITLE);//HWND targetWnd = FindWindow(_T("Notepad"),NULL);if(targetWnd == NULL){OutputDebugString(_T("target exe not found"));// 目标程序都没启动,捕获没用处,取消全局钩子SetMsgHookOff();return;}CString exeName = CUtility::GetCurExeName();if(exeName.CompareNoCase(_T("iexplore.exe")) == 0){if(bTatch){OutputDebugString(_T("HookProcDll.dll Attach iexplore.exe"));}else{OutputDebugString(_T("HookProcDll.dll Detach iexplore.exe"));}// 当前注入的进程为IE浏览器,通知目标程序,将进程ID发给目标程序DWORD processId = GetProcessId(GetCurrentProcess());BOOL ret = PostMessage(targetWnd,WM_IE_OPEN,bTatch,(LPARAM)processId);if(ret == FALSE){DWORD errCode = GetLastError();CString errMsg = CUtility::GetErrorMsg(errCode);CString temp;temp.Format(_T("PostMessage failed!!!errCode:%d,errMsg:%s"),errCode,errMsg);OutputDebugString(temp);}}
}// DLL 入口
BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{g_hModule = hModule;switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{NotifyYourApp(TRUE);}break;case DLL_PROCESS_DETACH:{// 什么情况 钩子DLL会被卸载?当Windows全局钩子被卸载后 系统会卸载该DLL,程序主动退出也会卸载该DLLNotifyYourApp(FALSE);}break;}return TRUE;
}
完整项目
完整项目这里下载,没分可以github下载最新代码(global_hook分支)。
C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(下)相关推荐
- C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(上)
Hook IE浏览器实现URL拦截及更改(上) 前言+思路 笔者这里有个需求,针对IE浏览器 用户访问URL 做一个判断,是否为 限制访问的url,如果是 在另一个软件上给与警告提示.笔者在拿到这个需 ...
- Windows编程—获取Chrome浏览器的安装目录
文章目录 前言 方式一 说明 代码 方式二 说明 代码 前言 在Windows平台开发时,有时候需要唤起Chrome浏览器访问指定url, 这时就需要知道Chrome浏览器的安装路径了.笔者这里总结了 ...
- Windows 编程
Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...
- C/C++:Windows编程—IAT Hook实例(程序启动拦截)
C/C++:Windows编程-IAT Hook实例(程序启动拦截) 前言+思路 本文默认读者有IAT Hook的相关的基础知识了哈,记录笔者在IAT Hook实战中遇到到问题以及解决思路. 笔者想实 ...
- 学好Windows编程要看的书籍
本文是接着前面的学好C++要阅读的书籍而写的,如果想了解C++的学习的话请先看学好C++要阅读的书籍:http://blog.csdn.net/a809146548/article/details/4 ...
- Windows编程革命简史
起初,世上有Windows API和DLL Hell.然后有了DDE,史称第一次Windows编程革命--还记得怎么通过动态链接在状态栏上显示Microsoft股票的即时价格吗? 差不多同时,Micr ...
- 有一定基础的 C++ 学习者该如何学习 Windows 编程?
这篇文章是回答一位知友的提问: 有一定基础是指对大学教材级别的C++知识有了解,然而只停留在黑框程序的编写和阅读上. 手头有一个使用VS2010开发的windows工程想要读懂(这是契机,不是原因), ...
- 如何学习Windows编程
有很多初入门的小朋友跟我说,他们想学"底层"的技术,因为觉得技术含量高,所以想学Windows C++开发,看着调用一个个的参数超级多,调用起来超级麻烦的Windows API,觉 ...
- Windows编程---使用C/C++语言创建一个窗口
序言 记得刚学习C语言的时候,我还只能写出在"小黑框"里面运行的控制台程序.后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而我们 ...
最新文章
- java课设推荐,《Java程序设计》课程设计报告推荐.docx
- 皮一皮:现在的妹子这么好骗?还是在下脸皮太薄了...
- [poj] 2318 TOYS || 判断点在多边形内
- 通过点击切换文本框内容的脚本示例
- 树——通用树到二叉树的转换
- 一文读懂 IPv4 到 IPv6 的过渡技术
- TensorFlow-RNN循环神经网络 Example 2:文本情感分析
- 什么是ooa,oop
- 监控服务器ssh登录,并发送报警邮件
- java怎么反编译_java如何进行反编译
- CMM3上的集成软件管理
- 位图转矢量图工具,快和模糊图片说白白
- 神舟七号飞船应用计算机进行飞行状态属于,“神舟七号”飞船应用计算机进行飞行状态调整属于()。...
- 计算机信息专业致谢词,计算机专业毕业论文致谢词.doc
- 七牛云存储使用经历到底怎么样
- springboot 入门详细教程 源码
- [转载]《科幻世界》那些已消失的作者
- 【stgcn】代码解读之主函数(一)
- 高通 UEFI:ABL(一)
- IAR7.8 IAR8.5 IAR9.10.1 IAR9.10.2 KEIL 安装包
热门文章
- mongo java mapreduce_MongoDB中的MapReduce简介
- 1.5编程基础之循环控制_41数字统计
- 例7.8 分析下列程序的输出结果。《计算机等级考试二级C++语言》
- java 设置文本颜色_设置文本中的字体的颜色
- RTX5 | 线程管理02 - 创建线程(动态堆栈方式)
- STM32H743+CubeMX-学习FDCAN控制器上的TxFIFO
- 信息安全工程师笔记-案例分析(一)
- Python工作笔记-解决python使用nohup后台运行重定向不输出问题
- 前端笔记-JavaScript中放json数组要注意的地方(构造灵活的echarts)
- Qt工作笔记-信号与槽参数匹配问题