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拦截及更改(下)相关推荐

  1. C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(上)

    Hook IE浏览器实现URL拦截及更改(上) 前言+思路 笔者这里有个需求,针对IE浏览器 用户访问URL 做一个判断,是否为 限制访问的url,如果是 在另一个软件上给与警告提示.笔者在拿到这个需 ...

  2. Windows编程—获取Chrome浏览器的安装目录

    文章目录 前言 方式一 说明 代码 方式二 说明 代码 前言 在Windows平台开发时,有时候需要唤起Chrome浏览器访问指定url, 这时就需要知道Chrome浏览器的安装路径了.笔者这里总结了 ...

  3. Windows 编程

    Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...

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

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

  5. 学好Windows编程要看的书籍

    本文是接着前面的学好C++要阅读的书籍而写的,如果想了解C++的学习的话请先看学好C++要阅读的书籍:http://blog.csdn.net/a809146548/article/details/4 ...

  6. Windows编程革命简史

    起初,世上有Windows API和DLL Hell.然后有了DDE,史称第一次Windows编程革命--还记得怎么通过动态链接在状态栏上显示Microsoft股票的即时价格吗? 差不多同时,Micr ...

  7. 有一定基础的 C++ 学习者该如何学习 Windows 编程?

    这篇文章是回答一位知友的提问: 有一定基础是指对大学教材级别的C++知识有了解,然而只停留在黑框程序的编写和阅读上. 手头有一个使用VS2010开发的windows工程想要读懂(这是契机,不是原因), ...

  8. 如何学习Windows编程

    有很多初入门的小朋友跟我说,他们想学"底层"的技术,因为觉得技术含量高,所以想学Windows C++开发,看着调用一个个的参数超级多,调用起来超级麻烦的Windows API,觉 ...

  9. Windows编程---使用C/C++语言创建一个窗口

    序言 记得刚学习C语言的时候,我还只能写出在"小黑框"里面运行的控制台程序.后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而我们 ...

最新文章

  1. java课设推荐,《Java程序设计》课程设计报告推荐.docx
  2. 皮一皮:现在的妹子这么好骗?还是在下脸皮太薄了...
  3. [poj] 2318 TOYS || 判断点在多边形内
  4. 通过点击切换文本框内容的脚本示例
  5. 树——通用树到二叉树的转换
  6. 一文读懂 IPv4 到 IPv6 的过渡技术
  7. TensorFlow-RNN循环神经网络 Example 2:文本情感分析
  8. 什么是ooa,oop
  9. 监控服务器ssh登录,并发送报警邮件
  10. java怎么反编译_java如何进行反编译
  11. CMM3上的集成软件管理
  12. 位图转矢量图工具,快和模糊图片说白白
  13. 神舟七号飞船应用计算机进行飞行状态属于,“神舟七号”飞船应用计算机进行飞行状态调整属于()。...
  14. 计算机信息专业致谢词,计算机专业毕业论文致谢词.doc
  15. 七牛云存储使用经历到底怎么样
  16. springboot 入门详细教程 源码
  17. [转载]《科幻世界》那些已消失的作者
  18. 【stgcn】代码解读之主函数(一)
  19. 高通 UEFI:ABL(一)
  20. IAR7.8 IAR8.5 IAR9.10.1 IAR9.10.2 KEIL 安装包

热门文章

  1. mongo java mapreduce_MongoDB中的MapReduce简介
  2. 1.5编程基础之循环控制_41数字统计
  3. 例7.8 分析下列程序的输出结果。《计算机等级考试二级C++语言》
  4. java 设置文本颜色_设置文本中的字体的颜色
  5. RTX5 | 线程管理02 - 创建线程(动态堆栈方式)
  6. STM32H743+CubeMX-学习FDCAN控制器上的TxFIFO
  7. 信息安全工程师笔记-案例分析(一)
  8. Python工作笔记-解决python使用nohup后台运行重定向不输出问题
  9. 前端笔记-JavaScript中放json数组要注意的地方(构造灵活的echarts)
  10. Qt工作笔记-信号与槽参数匹配问题