前言
最近需要开发一个新的项目,对接客户的浏览器,拦截他的登录信息,但是只能使用IE浏览器,所以就准备开发一款IE插件。但是网上对chrome
的开发教程比较多,IE的教程很少,所以我把我的开发过程记录下来,希望能够给需要的同学一些帮助。这里我们使用的开发语言是C#
Ie的插件有以下几种方式:
- ActiveX:这种必须在网页内嵌入
object
对象,本身就已经存在于网页内才能使用,如果网站是自己开发的,可以使用这种方式。 - BHO:全名浏览器辅助对象,这个是编写独立运行的扩展,和
chrome
的扩展差不多。 - 注册表:这种方式可以绑定脚本到IE的右键菜单里,像迅雷或旋风在IE右键里加的“用**下载”就是这种方式
先上效果图:
文件目录结构:
一、开发代码
创建一个包类型的项目,继承Com类实现自己的业务代码,这里省略具体的代码,只需要关注步骤就行
- 编写代码
using System; | |
using System.Reflection; | |
using System.Runtime.InteropServices; | |
using System.Runtime.InteropServices.Expando; | |
using Microsoft.Win32; | |
using SHDocVw; | |
using MSHTML; | |
namespace TrandeIeExtension | |
{ | |
[ | |
] | |
public interface IObjectWithSite | |
{ | |
[ | ]|
int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site); | |
[ | ]|
int GetSite(ref Guid guid, out IntPtr ppvSite); | |
} | |
public class TradeIeExtension : IObjectWithSite | |
{ | |
public const string BHO_REGISTRY_KEY_NAME = | |
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects"; | |
private WebBrowser webBrowser; | |
public int SetSite(object site){ | |
// 如果网页为空卸载委托事件 | |
if (site == null){ | |
this.webBrowser.DocumentComplete -= this.OnDocumentComplete; | |
this.webBrowser = null; | |
} | |
// 网页不为空挂载委托事件 | |
else{ | |
webBrowser = (WebBrowser) site; | |
webBrowser.DocumentComplete += this.OnDocumentComplete; | |
} | |
return 0; | |
} | |
public void OnDocumentComplete(object pDisp, ref object URL){ | |
HTMLDocument document = (HTMLDocument) this.webBrowser.Document; | |
HTMLHeadElement head = (HTMLHeadElement) ((IHTMLElementCollection) document.all.tags("head")).item(null, 0); | |
IHTMLScriptElement scriptObject = (IHTMLScriptElement) document.createElement("script"); | |
scriptObject.type = @"text/javascript"; | |
scriptObject.text = "alert(1)"; | |
head.appendChild((IHTMLDOMNode) scriptObject); | |
} | |
public int GetSite(ref Guid guid, out IntPtr ppvSite){ | |
IntPtr punk = Marshal.GetIUnknownForObject(this.webBrowser); | |
int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite); | |
Marshal.Release(punk); | |
return hr; | |
} | |
[ | ]|
public static void RegisterBHO(Type type){ | |
RegistryKey registryKey = | |
Registry.LocalMachine.OpenSubKey(BHO_REGISTRY_KEY_NAME, true); | |
if (registryKey == null) | |
registryKey = Registry.LocalMachine.CreateSubKey( | |
BHO_REGISTRY_KEY_NAME); | |
string guid = type.GUID.ToString("B"); | |
RegistryKey ourKey = registryKey.OpenSubKey(guid); | |
if (ourKey == null){ | |
ourKey = registryKey.CreateSubKey(guid); | |
} | |
ourKey.SetValue("NoExplorer", 1, RegistryValueKind.DWord); | |
registryKey.Close(); | |
ourKey.Close(); | |
} | |
[ | ]|
public static void UnregisterBHO(Type type){ | |
RegistryKey registryKey = | |
Registry.LocalMachine.OpenSubKey(BHO_REGISTRY_KEY_NAME, true); | |
string guid = type.GUID.ToString("B"); | |
if (registryKey != null) | |
registryKey.DeleteSubKey(guid, false); | |
} | |
} | |
} |
- 编译dll
编译成dll,打开AssemblyInfo.cs
中的Com可见,这个很重要,否则后面不能注册
[assembly: ComVisible(true)]
导入的系统依赖,比如SHDocVw,MSHTML
请设置为编译时复制,否则插件可能不会执行。
二、强签名
生成的dll默认没有签名,系统认为是不安全的,我们要手动签名,主要会用到ilasm.exe和ildasm.exe这两个工具
- Visual Studio
如果你使用的visual studio
那么你可以直接在开始菜单打开Developer Command Prompt for VS xxxx
控制台,就可以使用这两个工具
- 系统自带
如果你没有visual studio
环境,那可以使用系统自带的这两款工具,所在目录:
ildasm:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe
ilasm:C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe
- 签名步骤
这里使用的visual studio
控制台,假设我们的dll文件叫main.dll
// 创建snk文件,名字自取 | |
sn -k /your/path/main.snk | |
// 创建.il文件,请用绝对路径,名字自取 | |
ildasm \your\path\main.dll /out:\your\path\main.il | |
// 使用snk签名dll并生成新dll,mainEx.dll是签名后新生成的dll名字 | |
ilasm your\path\main.il /res:your\path\main.res /dll /key:your\path\main.snk /out:your\path\mainEx.dll | |
// 检查一下生成的新dll是否可用 | |
sn -vf mainEx.dll |
最终命令行会输出以下内容,表示签名成功
Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved | |
Writing PE file | |
Signing file with strong name | |
Operation completed successfully |
三、注册组件
会使用到Regasm.exe这个工具
Regasm是系统自带比较老的Com注册工具,请进入它的目录再使用,所在目录径:
regasm:C:\Windows\Microsoft.NET\Framework\v4.0.30319
执行注册命令
Regasm /codebase your\path\mainEx.dll /u | |
Regasm /codebase your\path\mainEx.dll |
命令行会输出以下内容,表示注册成功
Microsoft .NET Framework 程序集注册实用工具版本 4.7.3190.0 | |
(适用于 Microsoft .NET Framework 版本 4.7.3190.0) | |
版权所有 (C) Microsoft Corporation。保留所有权利。 | |
成功注册了类型 |
四、调试
打开IE浏览器,会提示是否加载新插件,点确定。随便访问一个网页,如果成功执行了我们的代码,说明插件运行成功