如何拦截我开始执行的Internet Explorer实例的http请求?

时间:2013-02-06 13:34:54

标签: c++ internet-explorer winapi

我的C ++程序启动Internet Explorer(它与IE6一起使用到IE10)在Internet上显示一些网页;我无法修改网页。该网页引用了一个JavaScript文件(使用HTML标记中的<script>标记) - swfobject JavaScript库的副本。我希望网页使用我提供的此文件的自定义副本。

我提出了两种可能的解决方法

  1. 编写Internet Explorer连接的代理服务器;代理获取实际数据,然后重写HTML,以便引用我自己的swfobject副本。不幸的是,相当多的工作,可能不适用于https。我现在可以不用支持https了。

  2. 为Internet Explorer实施asynchronous protocol plugin,拦截所有http请求。我知道JavaScript文件总是使用http检索,因此我可以拦截对swfobject JavaScript文件的访问并生成我自己的文件。唉,这似乎也是不可能的,Microsoft support page解释

      

    Internet Explorer忽略了使用CLSID以外的值覆盖HKEY_CURRENT_ROOT \ PROTOCOLS \ Http的天真尝试

    这听起来好像用自定义协议处理程序挂钩'http'是行不通的;在任何情况下,如果存在现有的http协议处理程序,这种方法也会有问题。

  3. 有没有比这两种方法更好的解决方法?

3 个答案:

答案 0 :(得分:3)

根据您的要求的复杂性,Fiddler可能是自定义代理的有用替代方法,因为它可以自动重写请求和响应,并且可以快速编写您想要的脚本。

它也适用于HTTPS,因此该部分是“免费的”。

  

想让Fiddler根据您指定的规则自动重写请求和响应,添加或删除标头,或标记/忽略会话?查看FiddlerScript Cookbook

Here is a link to the cookbook

如果您需要嵌入它,它也可以嵌入FiddlerCore

正如@MSalters在下面指出的那样,Fiddler的可选SSL拦截是你应该考虑使用它之前的权衡。它已记录在案here,并且我已经写了一篇关于它如何运作的简短摘要in this answer

答案 1 :(得分:2)

只需记下一个想法,就可以在自己的进程中挂钩WinSock send()和recv()函数。这是一种中间人。这种解决方案具有很高的复杂性缺点。

答案 2 :(得分:1)

简单,只是translate the URL。将swfobject网址更改为file://网址,指向您的副本。

(你实际上并没有启动IExplorer.EXE,不是吗?这不是你应该打开网页的方式。你要么用ShellExecute启动一个URL,把浏览器选择留给用户,要么就是你在您自己的应用程序中嵌入了IE的核心MSHTML.Internet Explorer不是Windows的一部分,可能不存在,例如在Windows N上。)