Visual C#两分钟搭建BHO IE钩子

微软在1997年正式推出Browser Helper Object (BHO), 使程序员能够更好的对IE进行二次开发和操作.
在通过编写BHO程序数月后, 我希望把我的一些经验告诉才开始的同志, 避免走一些弯路.

我本人是非常喜欢C++的. 因为C++对内存直接操作的方式可以节省非常多的内存损耗, 也更快一些. 但是在开发BHO的时候, 我的确也认识到,
C#明显要比C++强大很多. 例如C#提供的FOREACH 循环就可以避免FOR循环产生的溢出. 另外C#的类型转换也明显要强于C++.
毕竟BHO和C#都是出自微软一家, 理所当然, C#更适合BHO开发一些. 我的第一个BHO程序是用C++写的.
对于COM的操作,让我至少弄了几天才搞清楚他们到底想干什么. 但是我的第一个C# BHO程序只用了几分钟就搭建好了钩子. 如果你希望从事BHO开发,
而且你才开始学. 我想这篇文章对您有点帮助.

下面就让我们开始.

首先我们需要在C#中新建一个DLL工程. 因为BHO是通过让IE调用DLL来驱动的. 我用的是VC# EXPRESS. 因为这已经完全够用了. VC#
PROFESSIONAL 并不需要, 而且还很浪费内存.

当我们建立一个空工程以后, 随便添加一个文件夹叫BHO, 然后添加一个文件.

需要我们注意的是, 我们这个文件必须被命名为IObjectWithSite.cs因为这样IE才知道这是一个BHO程序.
如果想知道更多关于IObjectWiteSite接口的内容, 请查询MSDN
http://msdn2.microsoft.com/en-us/library/Aa768220.aspx

在IObjectWithSite中必须有两个方法GetSite和SetSite. 我们主要是对后者进行调用.通过名字大家就可以猜到他们是干什么的.

GetSite:  Gets the last site set with IObjectWithSite::SetSite. If there
is no known site, the object returns a failure code.

SetSite:  Provides the site‘s IUnknown pointer to the object.

请把VS STUIDO 默认的类名给去掉.因为IObjectWithSite并不是一个类, 而是一个接口.

不要忘记添加 System.Runtime.InteropServices

下面我们再添加剂一个叫BHO.CS的主文件.

这个新建的类是基于 IObjectWithSite接口的. 正如同我前面讲的. 你就是通过这个接口来调用IE.

为了使用微软的BHO库.我们必须添加下面两个库: SHDocVw and MSHTML.他们一般都在 Windows\System32 下面

SHDocVw is  Microsoft Shell Doc Object and Control Library

MSHTML is:   All interfaces for accessing the Dynamic HTML (DHTML)
Object Model are based on IDispatch and are the basis of access to the object
model that is also used by scripts.
http://msdn2.microsoft.com/en-us/library/bb498651.aspx

光using SHDocVw" 是不够的, 你需要添加

Add SHDocVw

因为稍后我们需要用到MESSAGEBOX, 所以这里我也添加了一个WINDOWS FORM库

下面添加两个变量: WebBrowser and HTMLDocument. 就如同他们的名字. 一个是IE的变量,
另外一个是IE所访问的HTML页变量.

下面在这个类中田间一个叫 OnDocumentComplete 的函数. 取其他名字也行, 没什么太大关系.
但是这里为了CODE的可用性,我们叫OnDocumentComplete. 这个函数实际上是和CDHTMLDIALO

下面的OnDocumentComplete所对应的.

CDHtmlDialog Class
http://msdn2.microsoft.com/en-us/library/8bed8k60(VS.80).aspx .

OnDocumentComplete的触发是在一个HTML页被LOAD完以后. 你也可以避免用Navigate() or
OnBeforeNavigate(). 他们表示在发出访问和访问之前触发.

Please refer to http://msdn2.microsoft.com/en-us/library/8k5z3ekh(VS.80).aspx
to find out what you need exactly.

在 IObjectWithSite.cs下,你需要找出IE的GUID, 这样才方便注册表的更改.

另外你需要给自己的程序添加一个GUID. 这样IE才能在注册表中找到你的信息. 你可以使用System.Guid.NewGuid() method
来得到一个GUID. 这比C++得到GUID的方法要容易得多了.

我们必须给 SetSite and GetSite 加上内容. 在SETSITE中我们就需要加入一个EVENTHANDLER,
让IE来触发我们的OnDocumentComplete函数.

添加引用

在BHO.CS下我们需要为我们的DLL添加register/unregister 函数.

编译, 我们就有了我们的DLL.

下面通过DOS下的 regasm /codebase "BHO HelloWorld.dll" 命令在注册dll. 这里有一个问题了, 为什么?

因为我们忘了把我们的主类设置成PUBLIC, 所以别人都不能调用到你的类. 自然注册不了.

然后就成功了.

打开注册表, 找到Browser Helper Object under
LOCAL_MACHINE->SOFTWARE->MICROSOFT->WINDOWS->EXPLORER,
看看是不是有变化了?

我们注册完了, 下面就是来写我们的住程序来控制IE了. 下面就是一个例子来抓去你正访问的页面上的所有INPUT 元素的NAME.

在DOCUMENT中, 我们的所有元素都为IHTMLElement, 我们需要调用的是IHTMLInputElement.
所以我们通过GetElementByTagName的方法来查找所有的INPUT ELEMENT. 在找到以后还需要进行类型转换才能找到对应的ATTRIBUTE.
否则IHTMLElement是不代有NAME ATTRIBUTE的. IHTMLElement提供的ATTRIBUTE都是所有元素都有的. 例如ID,
例如TITLE, 例如OnClick等. 有的元素有自己特有的ATTRIBUTE,
例如INPUT有OnFocus这就必须要转换成IHTMLInputElement才能上使用. INPUT对应的IHTMLInputElement,
Select-> IHTMLSelectElement .......

There you go, see?

下面我们试另外一个方法叫 BeforeNavigate() .它的触发是在你开始下一个页面之前. 也就是说例如你要提交一个表单, 页面要变化了,
他就被触发.

实际上MS提供了两个类似的接口 BeforeNavigate and BeforeNavigate2(). 大家可以查MSDN看看有什么区别.
这里我们不多讲了.

同样我们添加一个对应的函数原形(点图片, 看大图).

添加EVENTHANDLER

我们下面要干的是截获页面上的密码.

看,多简单,你也能做到!

我希望您对BHO有一个初步的了解. 如果想知道更多内容, 请访问MSDN. 里面有非常详细的介绍. 这里也引出了一个话题. 我们可以看到,
几乎用不了两分钟我们就可以截获你填写的任何内容, 你觉得IE是安全的吗? 即使他可以通过SSL来对进出网卡的内容加密, 但是在应用层一样是如此的薄弱.
另外大家如果用IE都会发觉泛滥成灾的ADD-ON, 这就是因为BHO惹的祸.

大家如果不想按照我上面的打,可以下我做好的模版.直接放到你的Visual Studio
2005\Templates\ProjectTemplates文件夹下. 当开始一个新工程时候, 点下那个BHO HELLOWORLD就可以了.
所有上面的代码都给你做好了.

Visual C#两分钟搭建BHO IE钩子,布布扣,bubuko.com

时间: 2024-10-14 11:10:09

Visual C#两分钟搭建BHO IE钩子的相关文章

AliOS Things+阿里云 10分钟搭建智慧农业解决方案

摘要: AliOS Things+阿里云 10分钟搭建智慧农业解决方案 1.1 样品介绍 在工业.农业物联网布线场景中以MODBUS类型为主,样品提供MODBUS类型传感器硬件和软件快速接入方案,并将传感器数据上传到阿里云物联网平台,在云端table store数据库存储,在datav数据大屏上可视化展示. AliOS Things+阿里云 10分钟搭建智慧农业解决方案1.1 样品介绍在工业.农业物联网布线场景中以MODBUS类型为主,样品提供MODBUS类型传感器硬件和软件快速接入方案,并将传

用Visual Studio 2012+Xamarin搭建C#开发Andriod的环境

原文:用Visual Studio 2012+Xamarin搭建C#开发Andriod的环境 第一步:安装Visual Studio: Visual Studio 2012(或者Visual Studio 2010),原因是目前为止Xamarin for Visual Studio的插件只支持2010和2012版本的,安装过程在此不再赘述. 第二步:安装Xamarin: 1.到http://xamarin.com/download这里去注册一个账号,就可以下载Xamarin的安装包.如下图: 这

五分钟搭建App设置页面

原文出处: 陈燕翔(@燕翔de专注)   欢迎分享原创到伯乐头条 本节主题(Storyboard/模型思想搭建设置页面) 设置(Setting)页面的搭建(实现效果) 开发方式(这里提供两种,个人感觉第二种重用性较高,推荐使用.但第一种较为简单,视开发需求选择) (1)纯代码 + StoryBoard混合 开发 (2)纯代码 + 模型 思想 设置页面的搭建 假设你已经搭建出了这个基本框架<十分钟搭建App主流框架>但这毕竟是个空壳,下面让我们把设置页面简单的搭建一下吧 注:本文仅仅提供简略的搭

使用visual studio 2013 快速搭建phonegap开发环境

前一段时间开发了一款简单的Phonegap应用,遇到了很多坑,其中有一个坑就是在搭建开发环境上.由于Phonegap 2.x 与3.x 区别比较大,导致了开发环境也有所不同.2.x 是这样的http://www.cnblogs.com/Random/archive/2011/12/28/2305398.html这一系列的文章有些没讲清楚版本号,也是入坑的一个原因吧. 3.x 需要通过nodejs安装 生成相应平台的工程文件,然后再开发. 另外,在这再解释一下cordova和phonegap的关系

函数计算搭建 Serverless Web 应用(三)- 三分钟搭建 Web 应用

摘要: 本文对使用自定义域名 + HTTP 触发器搭建 Web 应用的步骤进行详细介绍,手把手带您三分钟搭建稳定可靠的 Web 应用. 简介阿里云 函数计算(Function Compute) 是事件驱动的全托管计算服务,是阿里云的 Serverless 计算平台.基于函数计算构建应用,您无需管理服务器等基础设施,而是专注于应用逻辑的开发,大幅提高开发效率. 函数计算搭建 Serverless Web 应用(一)- HTTP 触发器 中阐述了 Web 应用(Serverless web back

十分钟搭建App主流框架_纯代码搭建(OC),你不知道的框架

十分钟搭建App主流框架_纯代码搭建(OC),你不知道的框架java学习爱好者 2019-06-11 14:28搭建主流框架界面 需要源码的可以私信我达成效果 效果图ps :需要源码的可以加群,668041364导读 我们玩iPhone应用的时候,有没发现大部分的应用都是上图差不多的结构,下面的TabBar控制器可以切换子控制器,上面又有Navigation导航条我们本文主要是讨论主体框架的搭建,数据暂时没有添加分析做项目的基本流程 1.搭建项目主框架(1)先搭建tabBarController

Git 两分钟指南

转载: http://linux.cn/article-4704-1.html 受到Git五分钟指南的启发,我决定更进一步,写一篇更短时间内就能看完的Git教程.当然,这是指最简单的Git!但是对于新手个人开发者来说足够了,同时也给你提供一个可以继续深入的起点. 能够从本指南有所收获的例子也许是这样的,一个高中生正在进行他(或是她)的第一个项目,而且并不需要和别人分享代码.(具体讲其实是我儿子,他已 经写了很多代码,但是没有时间去学习一个版本控制工具.这份指南是为他写的,当然我觉得别人也能用的到

两分钟学会Unity3D布娃娃的使用

在RPG游戏中,为了让人物的死亡更加真实,unity创建布娃娃系统,搞的跟真的一样,尼玛我差点就相信那是真的了. 1.首先打开unity,创建地形,导入已经准备好的人物模块. 2.project下选中该模型,再为该模型添加布娃娃属性:GameObject->Create Other->RagDoll 3.在弹出的框中将布娃娃的各个结点设置进去 4.一定要去掉该人物的Box Collider属性,运行程序,就可以看到人物的死亡效果啦. 两分钟学会Unity3D布娃娃的使用,布布扣,bubuko.

Git两分钟指南 | 程序师【转】

我们发布了很多Git相关的文章,有系列教程(<Pro Git系列>),也有各种独门绝技(<让你的Git水平更上一层楼的10个小贴士>).但这篇两分钟的Git指南算是最精简的.如果想了解更多Git相关的文章,请从这里开始. 以下是Git两分钟指南的正文内容. 受到Git五分钟指南的启发,我决定更进一步,写一篇更短时间内就能看完的Git教程.当然,这是指最简单的Git!但是对于新手个人开发者来说足够了,同时也给你提供一个可以继续深入的起点. 能够从本指南有所收获的例子也许是这样的,一个