用C#搭建IE BHO勾子, 取表单密码

摘要:
授权CSDN,请求许可后请转载作者:陈佳,NetSecureInc,加拿大,软件工程师微软于1997年正式退出BrowserHelperObject(BHO),使程序员能够更好地进行IE的二次开发和操作。在编写BHO程序几个月后,我希望将我的一些经验告诉那些刚刚起步的人,以避免走弯路。我个人非常喜欢C++。因为C++对内存的直接操作可以节省大量内存损失,而且速度更快

授权CSDN, 请在征求同意后转载. 作者: 陈嘉, NetSecure Inc, Canada, 软件工程师


微软在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开发, 而且你才开始学. 我想这片篇文章对您有点帮助.

这篇文章本来是用英文写成的. 因为工作环境的原因, 中文已经越来越生疏. 如果有错误或者不太明显的地方. 请参考英文原文

http://www.horizonideas.com/writings/article.php?id=11

下面竟让我们开始.

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

用C#搭建IE BHO勾子, 取表单密码第1张

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

用C#搭建IE BHO勾子, 取表单密码第2张

需要我们注意的是, 我们这个文件必须被命名为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并不是一个类, 而是一个接口.

用C#搭建IE BHO勾子, 取表单密码第3张

不要忘记添加 System.Runtime.InteropServices

用C#搭建IE BHO勾子, 取表单密码第4张

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

用C#搭建IE BHO勾子, 取表单密码第5张

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

用C#搭建IE BHO勾子, 取表单密码第6张

为了使用微软的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

用C#搭建IE BHO勾子, 取表单密码第7张

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

用C#搭建IE BHO勾子, 取表单密码第8张

Add SHDocVw 

用C#搭建IE BHO勾子, 取表单密码第9张用C#搭建IE BHO勾子, 取表单密码第10张

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

用C#搭建IE BHO勾子, 取表单密码第11张

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

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

用C#搭建IE BHO勾子, 取表单密码第12张

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

用C#搭建IE BHO勾子, 取表单密码第13张

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

用C#搭建IE BHO勾子, 取表单密码第14张

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

用C#搭建IE BHO勾子, 取表单密码第15张

Add one more reference

用C#搭建IE BHO勾子, 取表单密码第16张

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

用C#搭建IE BHO勾子, 取表单密码第17张

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

用C#搭建IE BHO勾子, 取表单密码第18张

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

用C#搭建IE BHO勾子, 取表单密码第19张

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

用C#搭建IE BHO勾子, 取表单密码第20张

然后就成功了.

用C#搭建IE BHO勾子, 取表单密码第21张

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

用C#搭建IE BHO勾子, 取表单密码第22张

我们注册完了, 下面就是来写我们的住程序来控制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 .......

用C#搭建IE BHO勾子, 取表单密码第23张

There you go, see?

用C#搭建IE BHO勾子, 取表单密码第24张

下面我们试另外一个方法叫 BeforeNavigate() .它的触发是在你开始下一个页面之前. 也就是说例如你要提交一个表单, 页面要变化了, 他就被触发.实际上MS提供了两个类似的接口 BeforeNavigate and BeforeNavigate2(). 大家可以查MSDN看看有什么区别. 这里我们不多讲了.

用C#搭建IE BHO勾子, 取表单密码第25张

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

用C#搭建IE BHO勾子, 取表单密码第26张

添加EVENTHANDLER

用C#搭建IE BHO勾子, 取表单密码第27张

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

用C#搭建IE BHO勾子, 取表单密码第28张

See, how easily, you can get it.

用C#搭建IE BHO勾子, 取表单密码第29张

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

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

project template下载TEMPLATE 

用C#搭建IE BHO勾子, 取表单密码第30张

  • 相关阅读:
    调停者模式
    组合模式
    单例模式
    策略模式
    代理模式
    AJPFX简述Context.startService()和Context.bindService
    AJPFX简述abstract class和interface的区别
    AJPFX关于抽象类和接口的区别
    AJPFX关于StringBuffer,StringBuilder类 总结(一)
    AJPFX关于StringBuffer,StringBuilder类总结(二)
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668466.html
  • 免责声明:文章转载自《用C#搭建IE BHO勾子, 取表单密码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

    上篇通过浏览器批量下载文件到zip压缩包以银行转账为例分析分布式事务的解决方案下篇

    宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

    相关文章

    Delegate 委托 C#

    delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。A delegate declaration defines a reference type that can be used to encapsulate...

    react antd form 自定义表单验证validator 需要注意的细节,否则会无法触发表单提交。

    1、每一个if判断后,都需要加入callback(),否则会阻塞表单的提交。 validateNoChinese = (_, value, callback) => { const reg = /^d+$|^d*.d+$/g; const startValue = value?.split('.') if(!value){...

    GHO文件内IE主页的修改方法

    修改方法: 1、先打开映像 GHOSTexp 打开GHO文件 2、提取注册表文件 C:WINDOWSSYSTEM32CONFIG 下就是系统的注册表文件,详细见下 3、打开本地的注册表,加载配置单元(即加载刚才提取的注册表文件,加载时名字可随意取) 4、修改主页: 再依次打开HKEY_CURRENT_USERSoftware——Microsoft——Int...

    入门者初试 Cell(华表)结合C#的应用

    本次内容主要包括1.Cell(华表)与VS.NET中常用报表 的 对比参照2.简单的Cell(华表)在C#中的示例因工作需要,现开始接触Cell(华表),用该国产报表软件进行报表开发。和水晶报表及ReportServices等可以在服务器端进行操作的报表不同,Cell(华表)是需要JavaScript或VBScript在客户端进行操作。 Cell对照VS自...

    IE首页被恶意篡改的十二种解决方法

    浏览网页时,很容易出现造成注册表被修改,使得IE默认连接首页、标题栏及IE右键菜单被改为浏览网页时的地址(多为广告信息),更有甚者使浏览者的电脑在启动时出现一个提示窗口显示自己的广告,而且有愈演愈烈之势,遇到这种情况我们该怎样办呢? 一、注册表被修改的原因及解决办法 其实,该恶意网页是含有有害代码的ActiveX网页文件,这些广告信息的出现是因为浏览者的...

    EASYUI 表单(FORM)用法

    http://blog.sina.com.cn/s/blog_3ecf39a70102ux8x.html 1,ajax提交只是简单的异步和文本提交。提交的数据需要序列化或程序指定。同时,数据也需要自己验证。如果使用easyui的验证组件validatebox,则需要在提交前调用,如下: if ($("#formname").form("validate")...