用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通訊還提供了一個用戶友好的格式。

    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM