用C#實現修改網頁數據

背景
    因爲某寶最近升級,致使朋友買的刷單軟件不能用了;在又付過錢以後,那個刷單軟件供應商居然捐款跑路了...因而,朋友委託我作一個功能同樣的軟件
功能
    他給我描述的軟件功能,是這個樣子的:在網頁登錄個人某寶以後,在【已買到的寶貝】頁面,有待付款、待發貨、待收貨、待評價數量,軟件能夠隨意修改這些數據;頁面下邊還有交易單,軟件還能夠隱藏指定的單據...而後他把以前買的軟件發給我,讓我研究研究...
分析
    按照他的描述,我歸納以後,軟件的功能就是修改網頁數據。我先用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通信還提供了一個用戶友好的格式。
css

    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
相關文章
相關標籤/搜索