破解某單機遊戲到學習fiddler腳本改包

  • 2019 年 10 月 6 日
  • 筆記

寫在前面

前段日子出去玩了,遊山玩水的,網太差,就下了個單機耍耍。水墨風,打鬥效果挺不錯的(那麼,請問哪裡能夠下載到呢?)

像我這種0氪玩家,肝是不可能肝的,這輩子都不可能的,陰陽師我都沒肝過XD,氪也是不可能氪的,身上錢只能夠吃吃飯而已......

開搞

不說了,web狗開始逆向!AndroidKiller打開,拖入apk,點擊開始反編譯!what??某數字加固寶,AndroidKiller關閉!自閉中.......

逆向又不會,只能回歸自己老本行-開始抓包。

請求分析

像這樣的單機遊戲app實在沒有太多請求,大概發現下面這些:

  1. 訪問 /fightingx/utils/timeUtil2.php 返回一個時間戳
  2. 輸入cdk向伺服器兌換CDK
  3. 充錢請求

3的充錢是加密的亂碼,如果不能逆向出源碼找出解密,是基本不用看了。

至於2的請求,伺服器返回的是json:{"ret":2},僅靠這樣的數據是很難構造返回包的。除非:一是逆向出源碼,找出是怎麼解析的,再構造相應數據;二是找到一個cdk,構造一個陳工兌換的返回包,每次兌換都會返回這個。這是可行的,可是上哪找cdk呢,社工?(我加群水了半天也沒水到一枚cdk)......

發現漏洞

最後我從1下手,這涉及到一個遊戲機制的問題。遊戲當中有一個「探索」的機制,即你從現在開始探索,經過6個小時後你就可以獲得收穫,受益不少。

探索

我一開始修改系統時間,提前了6個多小時,但是發現並沒有什麼用,然後通過抓包修改1請求的返回包,改成第二天的時間,發現「探索」就立馬結束了!!我只要不停的重複這個動作,「富可敵國」指日可待。

自動化實現

碰到的問題

我使用burp的正則匹配進行返回包替換,將返回的時間戳換成幾天或者幾個月之後的,但是這個替換並不是一勞永逸的,**我需要不停的替換,使替換的時間每次都比上次的時間多6個小時。** 因為每次的出發時間點都是上一次結束的時間點,這也太累了吧,我手機操作就算了,每次還要修改burp......

fiddler改包

我要實現的功能很簡單,就是使返回的時間戳每次都比上一次請求的多21600秒,或者更多,burp是沒法實現的,還是我沒找到。我將目光投向了fiddler,雖然不怎麼用這東西。

fiddler修改返回包有三種方法

  1. 通過AutoResponder進行修改,具體操作是左邊選擇需要修改的請求,右邊再點擊AutoResponder按鈕,添加規則,需要制定一個txt文本
autoresponder修改返回包
  1. 通過Automatic Breakpoints進行改包,點擊rules,再選擇斷點方式
image.png

斷點之後,每當有請求時,都會出現在下面。

image.png

雙擊進入,然後點擊break on response,再點擊textview即可修改返回包,修改完成後點擊run to completion。

image.png
  1. 通過FiddlerScript改包,點擊rules,再點擊Customize Rules,就進入腳本編輯
image.png

這是採用c#編寫的,也自定義了一部分函數和方法。腳本編寫是再此基礎上進行修改。我們要修改的是OnBeforeResponse

image.png

下圖我打馬賽克的部分就是腳本編寫的位置。

image.png

最簡單的實例,當請求host為www.baidu.com時候,返回baidu:

if (oSession.HostnameIs("www.baidu.com")){            oSession.utilSetResponseBody('baidu');        }            
image.png
image.png

實現不斷遞增返回時間戳達到破解效果

http是無狀態,這裡也是,OnBeforeResponse這個函數每當有請求返回的時候都會重新運行一次,也就是我並不能在這實現一個類似於計數器的東西,每當請求某網站時就n+1,然後再某個時間基數上乘以n*21600.

但我並不需要返回值使這期間間隔的值為一個確切的值,我只需要大於一個值。

假設我探索出發的時間為a,通過修改返回包,返回來的時間為a+b,b>21600,第二次探索出發的時間為a+b,則第二次返回回來的時間為a+b+c,c>21600,第三次探索出發的時間為a+b+c......

也就是說,我需要找到一個遞增的值,這個值在我探索出發,和探索結束這段時間內,增大的數值需要大於21600.

有什麼是不斷變大的,又不受狀態影響呢?**系統時間戳**

我通過程式碼取系統時間戳,截取這個時間戳的後面幾位為g,g是遞增的,我讓g乘以一個數字,使g在探索的時間裡,增加的值與這個數字的乘積大於21600.

程式碼如下:

if (oSession.HostnameIs("www.xxxxxgames.cn")){                oSession.utilDecodeResponse(); //解碼                var now = new Date();                var ts = now.getTime();                var d = ts.ToString();                var t = d.Substring(0,10);                var ttt = t.Substring(t.Length - 4);                    var f = int.Parse(t);                var g = int.Parse(ttt);                    var time = f + g*1000;                oSession.utilReplaceRegexInResponse('^1568.*$',time);                    }

自動刷錢

當不用不停的修改返回時間戳來達到破解效果時,實現自動刷錢自動探索就容易的不少。簡單思路就是Android開啟USB調試連接手機,通過滑鼠操控手機。再用按鍵精靈不停重複探索動作,即可。

合影

最後成果:百萬金幣加上數不盡的紫裝 :D

成果

思考

如何實現更加精確的動態修改返回包?

Tags: