1.準備工作
首先當然是下載安裝和配置Fiddler,基本上是按照論壇里bigbirdl大神寫的教程一步一步做的,https://www.52pojie.cn/thread-1171662-1-1.html
因為我用的是MACOS,只能在虛擬機里進行安裝,需要注意的是因為Fiddler所運行的主機(既我的Windows虛擬機)需要和手機在同一個局域網(Wifi)里,所以在虛擬機的網絡設置里,需要改為“橋接網絡(Wifi)”,否則無法正常抓取手機上的數據包。Fiddler設置好并運行后如下圖
另外,個人習慣是把“Rules”菜單下的“Hide CONNECTs”選項給勾選上,這樣可以不看建立連接用的數據包(這些數據包里沒有我們關心的數據),避免刷屏。另外,抓手機的數據包里,可以暫停本機(電腦)數據包的抓取,方法是單擊一下左下角的那個“Capturing”字樣處,該處無顯示時即可。
2.開始抓包
手機打開某干教網程序,登錄后進入在線學習頁面,在開始學習前,可以在Fiddler當前Session列表(即顯示一大堆已經抓到的數據包相關信息的窗口)里按“Ctrl+X”快捷鍵把之前操作過程中抓到的數據清除,準備尋找和分析學習記錄上傳的相關數據包。
選了一個2學時的課程,獲得學時需要1小時2分24秒。老實說課講得都非常好,但是我們只要學時,就對不起王老師了😂。開始播放后,我點擊了暫停(實際上在后來的分析中發現,App會定時自動回傳學習記錄,也會在用戶暫停的時候馬上回傳一次學習記錄)。Fiddler上馬上抓到了一系列數據包,我們來逐個看一看。
先是幾個"isLogin",應該是判斷登錄信息是否過期的,跳過。然后重點來了,這個"addStudyRecord.json"你們覺得可疑不可疑?這命名簡直太規范了,還有下面那個"addNtStudyTime.json",初步鎖定就是這兩個文件之一了,至于后面的coursedetail這些課程信息相關的,直接忽略不計了。然后分別點開兩個包觀察了一下,addNtStudyTime.json里并沒有相關數據,而addStudyRecord.json這個請求里,可以看到如上圖中的studyRecordList這個值,里面的字段也很好辨認(確實是命名很規范),前面是課程和學生的ID,然后是進入視頻的時間accessTimeStr、退出(暫停)時間exitTimeStr,接下來是playlength和playTime這兩個字段,從兩個字段的值可以明顯看出來應該是playlength,因為它的值正好就是退出時間減進入時間,單位看來是秒。那么只要把這個值改為我們想要的時長,在服務器端不作數據驗證(比如用exitTime減accessTime,算一下是否和playlength一致)的情況下,應該就可以達到我們速刷的目的了。
3.手動修改數據包
在Fiddler里設置斷點,當App向服務器上傳數據的時候截獲并暫停,待我們修改相關數據以后再放行。
上面兩個圖中的辦法都可以,也可以參考右圖上的快捷鍵,我們需要設的斷點是“Before Requests”,也就是App的請求發出前。然后回到手機上,恢復播放后再一次暫停。這時Fiddler上會顯示有請求被截獲并暫停,一開始可能并沒有我們關心的addStudyRecord請求,可以直接點工具欄上的“Go”(綠色小三角那個圖標)放行,直到addStudyRecord出現,直接雙擊該數據包session,在右邊的窗口中修改。
將playlength改為3600(即1小時),修改完以后一定要按“回車”(好像要這樣才能保存修改,新手小白表示不明真相),之后點“Go”放行。在手機上看一下,修改生效了。
學習進度從0%直接到96%了,實際上剛才修改的時候再多改一點(比如7200秒),就能直接學完課程拿學時。至此,目的達到,學時到手。不過還沒完,還有一個小彩蛋。
4.自動修改數據包
既然上一章叫手動修改數據包,當然會有一個自動修改數據包的彩蛋。雖然能夠直接修改學習時長,比拿手機看1小時快多了,但是還是需要反復操作,挺麻煩不是。Fiddler還有一個很強大的功能,可以自動修改request數據(response當然也能)。進入Fiddler的Rules菜單,點擊Customize Rules...,快捷鍵CTRL+R,進入Fiddler ScriptEditor,直接修改Fiddler的自動化腳本。
方便起見,幾張圖我就放一起了。在Fiddler ScriptEditor中進入Go菜單下的to OnBeforeRequest,跳轉到相應的函數里,然后在函數的最后面加上如下代碼。
[JavaScript] 純文本查看 復制代碼
if (oSession.fullUrl.Contains("http://mstudy-bjce.bjdj.gov.cn/mobile/module/mobile/mobileinterface/v1/mobilecourse/addStudyRecord.json")){ var reqStr=oSession.GetRequestBodyAsString(); //將playlength中的值修改 var prevInd=reqStr.indexOf('playlength%22%3A')+16; var nextInd=reqStr.indexOf('%2C%22playTime'); var myReqStr=reqStr.substring(0,prevInd)+'3600'+reqStr.substr(nextInd); Fiddler.FiddlerApplication.Log.LogString(myReqStr); oSession.utilSetRequestBody(myReqStr);}
需要說明的是if判斷里的那個URL是在抓到addStudyRecord數據包后,右擊該數據包,選擇copy菜單下的Just URL,然后再粘貼出來的,也就是只針對這個請求進行修改。實際上,我自己在寫這段代碼的時候遇到很多麻煩,首先是RequestBody的值我一開始一直以為是JSON格式,但后來仔細看了一下數據包的TextView,發現并非如此。想用正則來替換playlength部分,在網上查了半天,發現Fiddler Script好像并不支持正則(如果有大神知道如何用正則煩請告知為謝),于是就只好用了個笨辦法,先找到playlength的位置,再找到后面playtime的位置,把兩頭的字符串都截出來,再加上我想要的學習時長,拼接成想要的RequestBody,然后發送。
|