背景
    由于某宝最近升级,导致朋友买的刷单软件不能用了;在又付过钱之后,那个刷单软件供应商竟然捐款跑路了...于是,朋友委托我做一个功能一样的软件。
功能
    他给我描述的软件功能,是这个样子的:在网页登陆我的某宝之后,在【已买到的宝贝】页面,有待付款、待发货、待收货、待评价数量,软件可以随意修改这些数据;页面下边还有交易单,软件还可以隐藏指定的单据...然后他把之前买的软件发给我,让我研究研究...
分析
    按照他的描述,我概括之后,软件的功能就是修改网页数据。我先用Reflector打开朋友给我的程序,看看能不能反编译,要是能反编译就好办了,0.0,结果反编译不了,看来自己得从头开始找资料...
实现一
    工作之余,开始百度相关信息,无意进入一个网站,有个人上传了一个工具,名字好像是淘宝数据修改器之类的,他的附件上附带了一句话,“用BHO实现”!!!然后我赶紧百度【BHO】,百度百科说,BHO(Browser Helper Object,浏览器辅助对象,简称BHO) BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。我瞬间两眼放光,赶紧百度个BHO的例子,这个例子的功能是在打开的网页上添加3个按钮。我按照步骤,在我的电脑上跑例子,我第一次打开的是64位的IE浏览器,打开网页之后,网页还是原来的样子;第二次打开的是32位的IE,IE首页上多了3个按钮,再打开一个标签页,上面也有三个按钮!!!
    能在网页上添加3个按钮,就说明它能修改网页的html数据,那这不就正是我要的么!
    工程都不用新建了,直接在原程序上进行开发,看了程序之后,了解了程序的工作原理:首先得在注册表注册dll,这个dll必须实现IObjectWithSite接口,IE在启动的时候,会自动加载已注册的dll。在SetSite函数里,可以获取到浏览器对象,然后就可以注册各种事件,修改网页数据是在DocumentComplete事件里进行,因为在这个事件之后,DOM才允许修改...
    因为是dll,并且是浏览器自己加载dll,因此没有办法调试,附加到IE的进程里调试,断点也不会命中...要是能打个断点,在断点处查看HtmlDocument对象多好,现在还得苦逼的打日志...
    现在的工作是怎么遍历HtmlDocument找到目标节点,并且修改节点的数据。
    我在网上没有找到遍历HtmlDocument的资料,只能多输出点日志信息分析了。经过分析发现,HtmlDocument是一个树,并且每个节点都实现IHtmlElement,每个节点的子节点集合都实现IHtmlElementCollection,So,知道怎么遍历了...我是在尝试了无数次typeof之后才知道的...一定要把节点转换为IHtmlElement之后再用typeof,否则你只会得到System._ComObject类型...
    找到节点之后,修改数量值很好实现,把目标节点的innerHTML改为指定文本就行;隐藏单据就是隐藏一个节点,把节点的Style.Display置为none就行了。
    就这样,这个BHO版本的实现了,但是在测试过程中,发现有点不完美:因为我是在DOM完成之后才修改的数据,但是浏览器是收到多少数据,就解析多少显示多少,那么就在浏览器【显示原始数量数据】之后 到 【整个页面】完成,这段期间,页面显示的将是真实数据,而不是我修改的数据。这个空白期理论上不可消除,除非你的网速达到光速,配置达到天河二号...
    我把情况给朋友说了之后,朋友说在他电脑上跑跑,看看效果。周日晚上,在朋友的电脑上,程序跑起来之后,他进入到已买到的宝贝页面,刷新再刷新,数据还是真实的数据,不是修改过的数据,OMG,我登时傻眼了...
    朋友:这玩意支持搜狗浏览器吗?刷单不能用IE...
    我:不知道,我下个搜狗试试...
    我赶紧下个搜狗,跑起来,进入已买到的宝贝页面,刷新再刷新,KAO,不行...
    我马上对朋友说,这个版本的不行,我下周整个新版本的...
实现二
    上次惨败之后,我又重新分析这个程序到底该怎么做才能让它支持各种浏览器,并且是在数据达到浏览器之前进行修改。
    首先想到的是对本地网卡进行抓包,监视所有的包,把符合规则的数据修改之后再放行:抓包好抓,但是分析数据就有难度了,http的还好,https的怎么办...
    我又去分析朋友给我的软件,我发现里面还有3个dll,我尝试用Reflector打开,顶,全部打开!!!他买的程序竟然是用C#开发的,那我肯定也能做出来。我分别百度他们,直到输入fiddler之后,我已经看到胜利的曙光了。
    Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思)。 Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。

    Fiddler 是用C#写出来的,它包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,它的灵活性非常棒,可以支持众多的http调试任务,并且能够使用.net框架语言进行扩展。
    
我先下载了Fiddler调试工具,在调试工具里,我成功的更换了百度首页的logo,把搜索输入框后边的【百度一下】替换为【yp一下】,并且百度是https的。有了Fiddler这个利器,改个网页数据应该不是问题。
    容我简单介绍下Fiddler的工作原理:Fiddler是以代理的方式进行工作的,相当于中间人的角色,浏览器把请求交给Fiddler,Fiddler处理后再发出去,Fiddler接收到数据之后,处理完再发给浏览器,也就是浏览器数据进出都要经过Fiddler,浏览器发出接收的数据也都是Fiddler处理过的数据。
    下面写我开发过程中的几个关键点:
    1.在C#程序中怎么启动Fiddler?
    FiddlerApplication.Startup(m_Port, true, true, true);
    
Fiddler在启动之后,会自动修改IE的代理设置,并把IE改为代理模式。我们把其他浏览器的代理设置改为使用IE代理设置或者使用系统代理设置,就可以对所有浏览器有效。
    FiddlerApplication.ShutDown();
    
当然,退出的时候得关闭Fiddler,关闭Fiddler时,会自动把IE代理设置关闭。
    2.在什么地方处理浏览器接收的数据?
    FiddlerApplication.BeforeResponse += new SessionStateHandler(FiddlerApplication_BeforeResponse);
    
在Fiddler响应浏览器之前进行数据处理,这样就不会出现空白期了。
    3.怎么修改浏览器接收的数据?
    在BeforeResponse事件响应函数FiddlerApplication_BeforeResponse中:
    string strResponse = oSession.GetResponseBodyAsString();

    这句是获取浏览器接收数据的字符串,在处理html格式数据时,用这个方法。
    oSession.utilSetResponseBody(strResponse);
    这句是设置浏览器的接收数据,即把修改之后的数据给浏览器。
    对于strResponse你可以用任意规则处理,0.0...
    4.怎么使修改的数据有效?
    在BeforeRequest事件响应函数中:
    oSession.bBufferResponse = true;
    这样3中的修改才有效。
    5.对于https,证书怎么解决?
    对于证书问题,大家看这里Using FiddlerCore to capture HTTP Requests with .NET,这个链接来之不易,请大家好好珍惜,不客气...
    最后,最后,这个程序如期的做出来了。
后记
    因为这个程序只是修改了浏览器接收到的数据,并没有影响服务器数据,所以我给它起名Madoff。
Over

用C#实现修改网页数据的更多相关文章

  1. 使用fiddlercore修改网页的返回内容

    最近研究了一下FiddlerCore,发现这是个非常强大的工具.可以用来采集网页.修改网页数据.开发页游外挂等等. 使用这个工具,需要掌握一定的html和http知识,官方网站上也有例子可以下载. 看 ...

  2. API例子:用Python驱动Firefox采集网页数据

    1,引言 本文讲解怎样用Python驱动Firefox浏览器写一个简易的网页数据采集器.开源Python即时网络爬虫项目将与Scrapy(基于twisted的异步网络框架)集成,所以本例将使用Scra ...

  3. 网页数据抓取工具,webscraper 最简单的数据抓取教程,人人都用得上

    Web Scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据.例如知乎回答列表.微博热门.微博评论.淘宝.天猫.亚马逊等电商 ...

  4. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  5. 怎么用Python写爬虫抓取网页数据

    机器学习首先面临的一个问题就是准备数据,数据的来源大概有这么几种:公司积累数据,购买,交换,政府机构及企业公开的数据,通过爬虫从网上抓取.本篇介绍怎么写一个爬虫从网上抓取公开的数据. 很多语言都可以写 ...

  6. Vue动态修改网页标题

    业务需求,进入页面的时候,网页有个默认标题,加载的网页内容不同时,标题需要变更. 例:功能授权,功能授权(张三). Vue下有很多的方式去修改网页标题,这里总结下解决此问题的几种方案: 一.最笨方案 ...

  7. 01 UIPath抓取网页数据并导出Excel(非Table表单)

    上次转载了一篇<UIPath抓取网页数据并导出Excel>的文章,因为那个导出的是table标签中的数据,所以相对比较简单.现实的网页中,有许多不是通过table标签展示的,那又该如何处理 ...

  8. 【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl,  visual c++ 2005, ...

  9. jquery无法修改网页标题,无法修改网页标题

    今天遇到一个问题,搜索时动态修改网页标题,用jquery的这段代码无效,无论FF还是IE $("title").html("new title"); 后来只好用 ...

随机推荐

  1. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  2. asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL

    代码: /// <summary> /// HTML Table表格数据(html)导出EXCEL /// </summary> /// <param name=&quo ...

  3. UItableView嵌套UICollectionView

    首先我们需要继承一下UITableView并且遵守<UITableViewDelegate,UITableViewDataSource,UICollectionViewDataSource,UI ...

  4. (谷歌浏览器等)解决css中点击input输入框时出现外边框方法【outline:medium;】

    问题:在使用谷歌浏览器,360浏览器时,点击input输入框会出现带颜色的外边框,如下图所示:

  5. python解析json

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 引用 import json 编码:把一个Python对象编码转换成Json字符串 json.dumps ...

  6. Activiti 删除key值相同的所有不同版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  7. 如何将 DVD 转成 ISO

    Windows 电脑 + 光驱(Mac 下没找到类似 UltraISO 这么好用的软件,知道的朋友推荐一下哈) 安装 UltraISO 软件(试用版即可),http://baoku.360.cn/so ...

  8. 那些在学习iOS开发前就应该知道的事(part 2)

    英文原文:Things I wish I had known before starting iOS development—Part 2 http://www.cocoachina.com/ios/ ...

  9. 致第一次安装RIME的你

    转载自百度RIME吧,作者:半月湾C 原帖地址:http://tieba.baidu.com/p/3288634121   序言 很喜欢小狼毫输入法,喜欢他的简洁,美观以及超强悍的个人定制功能.关于 ...

  10. Scala 深入浅出实战经典 第75讲:模式匹配下的For循环

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...