Hook IE浏览器实现URL拦截及更改(上)

前言+思路

笔者这里有个需求,针对IE浏览器 用户访问URL 做一个判断,是否为 限制访问的url,如果是 在另一个软件上给与警告提示。笔者在拿到这个需求的时候也是网上一顿找,在csdn上找到一篇 hook IE 总结。这篇文章给我一些思路,获取IE浏览器访问的URL 那么需要知道 IE浏览器访问URL 用的那种方式,从这文章提示使用 WININET.dll库中的方法。

然后我在一个windows开发群 提问题,有网友指点说,在ring3级别下最底层的网络数据都会到达Ntdll.dll 中 NtDeviceIoControlFile这个方法。然后笔者当然 继续搜索呗。在 网路上搜索到 看雪论坛上的一篇文章 另类挂钩-RING3数据包监视 。笔者 当然如获至宝呀,代码都现成 拿过改改 不就行了?日期显示代码 是10年前的,使用的是 IAT HOOK的方式,代码完全拿过来 稍微改了一点点 在WriteProcessMemory前后添加VirtualProtect 针对内存页保护模式的修改,居然还能正常运行。最后测试结果 IE上的请求数据都能拦截到,但是 只有访问http请求的时候 能看到数据的明文,此时能看到HTTP请求的URL,如果是HTTPS请求拦截到的数据都是经过加密的,如果自己来解密的话应该是相当地麻烦。所以还是不符合笔者的期望,况且 笔者不需要那么底层的数据,只要在用户在地址栏 访问后立马拦截到就可以了。 此路不通,笔者只能再换一条路了。

经过漫长的搜索,没有太多线索,笔者决定用OllyDbg断点调试下 看能否发现线索。前面网上提示说IE浏览器 网络请求用的WININET.dll库,所以笔者在OD上 将 WININET.dll下与什么url、request、Internet相关的方法都打上断点(这里笔者是在win7 x86 上调试IE进程,OD目前只能调试32位程序)。先将IE浏览器打开 然后用OD 附件到进程,让后ctrl + g 输入对应的方法,跟踪表达式到达指定的位置然后f2打上断点。

然后笔者在浏览器地址栏上输入 www.baidu.com 然后回车,果然奇迹出现了 断点 在WinInet.dll的InternetConnectW方法处停住了。

而且参数2 为URL!笔者赶紧查了下 InternetConnectW方法说明,在调此函数之前会调用一个InternetOpen函数,但是此函数没有url相关参数。然后笔者 f9 继续往后走,在一些方法的断点也会停住 有url参数 也可以看到url的明文,所以从这里可以断定 在进行网络请求的时候 InternetConnectW方法已经是比较靠前的了!所以在这里hook 可以拿到访问的URL 也比较符合笔者的期望。笔者在hook的时候 还走一点小弯路,因为之前用IAT hook的方式能hook到NtDeviceIoControlFile 笔者想 那我就用IAT hook的方式 来hook WININET.dll不就得了!但是是不行的 IAT方式是读取PE头,这种方式不能hook 动态加载的DLL!所以笔者使用 Inline hook的方式。因为要想运行我们自己的逻辑 要么代码注入 要 DLL注入,DLL注入肯定少不了 。

实现效果

先看效果,csdn如果看不清 可以这个地址观看https://www.bilibili.com/video/av81160225。

HOOK IE浏览器拦截URL效果

代码实现

这里先说下,笔者的运行环境,win10-64位+VS2010+IE11

由于笔者之前写过 DLL注入的例子(Windows编程—DLL注入与卸载 ) 和 Inline Hook的例子(Windows编程—Inline Hook内联钩子(下) ),所以直接把之前的代码拿过 稍微改改就能用了。这里我们验证 还用到了另外2个软件 Process Explorer (该软件能查看当前进程所有的DLL,等会用来查看DLL注入和卸载是否成功),DebugView(我们注入的DLL中使用OutputDebugString这种方式打印日志,可以通过DebugView工具查看),示例demo可以在这里下载,也可在github下载最新代码,如果可以的话,帮忙点个星星哟。

我们要注入的DLL代码。其实代码很简单就是 DLL注入和Inline Hook的结合,基础牢固,思路正确,做起来还是比较容易的。

#include "stdafx.h"
#include <Windows.h>
#include <Wininet.h>
#pragma comment(lib,"wininet.lib")#include "InlineHook7.h"CInlineHook7 g_inlineHookObj7;typedef HINTERNET ( WINAPI *InternetConnectWFunc)(HINTERNET     hInternet,LPCWSTR       lpszServerName,INTERNET_PORT nServerPort,LPCWSTR       lpszUserName,LPCWSTR       lpszPassword,DWORD         dwService,DWORD         dwFlags,DWORD_PTR     dwContext);HINTERNET WINAPI MyInternetConnectW(HINTERNET     hInternet,LPCWSTR       lpszServerName,INTERNET_PORT nServerPort,LPCWSTR       lpszUserName,LPCWSTR       lpszPassword,DWORD         dwService,DWORD         dwFlags,DWORD_PTR     dwContext)
{g_inlineHookObj7.UnHook(); // 必须先卸载钩子 再才可以再次调用被Hook的函数,不然会进入死循环HINTERNET ret = NULL;CString temp;temp.Format(_T("拦截到url:%s"),lpszServerName);CString url = lpszServerName;if(url.Find(_T("baidu.com")) >= 0){url = _T("www.sogou.com");}OutputDebugString(temp);// 这里要用已经存在的库,不要再在自己的库中链接WININET.dll库去使用//ret = ::InternetConnectW(hInternet, lpszServerName, nServerPort, lpszUserName, lpszPassword,  dwService,  dwFlags,  dwContext);HMODULE hModule = GetModuleHandle(_T("WININET.dll"));if(hModule == NULL){OutputDebugString(_T("GetModuleHandle false"));goto end;}InternetConnectWFunc func = (InternetConnectWFunc)GetProcAddress(hModule,"InternetConnectW");if(func == NULL){OutputDebugString(_T("GetProcAddress false"));goto end;}ret = func(hInternet, url, nServerPort, lpszUserName, lpszPassword,  dwService,  dwFlags,  dwContext);end:g_inlineHookObj7.ReHook();return ret;
}VOID InlineHookIE()
{OutputDebugString(_T("InlineHookIE into"));g_inlineHookObj7.Hook("WININET.dll","InternetConnectW",(FARPROC)MyInternetConnectW);return;
}VOID UnInlineHookIE()
{OutputDebugString(_T("UnInlineHookIE into"));g_inlineHookObj7.UnHook();return;
}// DLL 入口
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{InlineHookIE();}break;case DLL_PROCESS_DETACH:UnInlineHookIE();break;}return TRUE;
}

待优化部分

这个demo,只能在IE浏览器打开后,再点注入到hook 才会注入到运行的ie进程中。后续会优化成 我们的demo程序只要运行了,当IE浏览器被打开,demo程序自动注入DLL,后面当用户 再次打开新的标签页或者IE进程我们也自动注入我们写的DLL 这样才是最完美的。
============== 待优化部分已经下面这篇博客写了 ==================
C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(下)

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

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

    Hook IE浏览器实现URL拦截及更改(下) 前言 接上一篇 C/C++:Windows编程-Hook IE浏览器实现URL拦截及更改(上),本节为了实现上一篇待优化部分.实现IE进程时时监控,当有 ...

  2. [Python] windows下360急速浏览器获取URL的Headers

    目的:windows下360急速浏览器获取URL的Headers 环境: 系统:windows 环境:360chrome 步骤: 1.使用浏览器打开url,并开启调试模式 工具->开发者调试工具 ...

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

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

  4. Windows编程的图形基础(一)HDC, HPEN, HBRUSH

    在windows编程中,要在设备(显示器)上显示相应的图像,这里先针对简单的对象,比如line, polygon, 矩形,椭圆等,实现的具体过程如下: 首先要获得设备句柄,有了设备句柄你才可以在相应设 ...

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

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

  6. 用Javascript代码实现浏览器菜单命令(以下代码在 Windows XP下的浏览器中调试通过

    每当我们看到别人网页上的打开.打印.前进.另存为.后退.关闭本窗口.禁用右键等实现浏览器命令的链接,而自己苦于不能实现时,是不是感到很遗憾?是不是也想实现?如果能在网页上能实现浏览器的命令,将是多么有 ...

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

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

  8. Windows编程革命简史

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

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

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

最新文章

  1. 关于Mybatis的SQL映射文件中in关键字的用法
  2. T.38 and the future
  3. 如果在iTerm2中复制命令特别卡,就跟慢动作似的,怎么办?
  4. java 数组对象属性数组_Java中数组的特性
  5. 一、什么是类,一些关键字
  6. (维基百科LaTeX公式显示异常)解决方法
  7. Linux ldd时某个依赖库so not found的一种特殊情形
  8. chrome支持的java版本下载_安装Chrome Java插件
  9. Internet Download Manager v6.41 Build 2
  10. Java_Dubbo视频教程-雷丰阳-专题视频课程
  11. 推荐一个开源好用的ER图、流程图作图软件-draw.io
  12. java 代码混淆原理
  13. Linux 卸载及删除磁盘分区
  14. MySql使用存储过程开发
  15. html倒计时的原理,JS实现活动精确倒计时 - 轩枫阁
  16. Extreme DAX中文第1章 商业智能中的DAX
  17. 老毛桃u盘重装win7教程
  18. 教你十分钟在Linux系统上快速装机并安装Ansible
  19. 华为游戏中心登录无法连接服务器,如何电脑登陆华为账号登录不了游戏
  20. 一种高性能计算机网络控制技术,一种高性能流量计算机的研制

热门文章

  1. 为啥我的Python这么慢 (一)
  2. PS图片无损放大插件 Alien Skin Blow Up 3 for Mac
  3. 小学计算机教案表格式,小学信息技术教案表格数据处理.docx
  4. 利用moviepy库制作好用的MP4、mov、mav、avi等视频类型转换gif图片的工具
  5. python -v乱码提示,#import....等信息的问题解决方式。
  6. Python学习之Python安装
  7. java 全排列 非递归_全排列(递归与非递归实现) | 学步园
  8. 【ES11(2020)】全局属性 globalThis
  9. 基于java教学管理系统设计(含源文件)
  10. C++笔记-基于邻接表的BFS(宽度优先遍历)