前一段有個微信小游戲特別火爆,很多朋友都在玩兒,當然各種游戲修改攻略也是滿天飛,有的是修改了小程序的源碼,有的是爆破了協議等等。
這次脫離代碼,單純從抓包的角度分析一下該小游戲。
一、抓包
Android、iOS皆可,這里我用iPhone和charles進行分析。具體怎么配置抓包的過程就不寫了,網上很多詳細的介紹。
數據相關的請求都在這個域名,所以我們可以過濾下域名,只看想要的結果。
二、分析
開打小程序后,可以發現上圖中的這些請求。比較重要的是下面幾個:
獲取id的接口: /api/auth/get_openid
獲服務端數據的接口: /api/auth/get_openid
上傳數據的接口:/api/archive/upload
請求類型為POST
接下來試玩一局,當游戲結束后,會繼續請求上傳數據的接口。那么到這里,我們就可以根據請求大概了解它的數據存儲了過程了。
打開小程序 >>> 獲取id >>> 獲取服務端數據(無數據給默認值,相當于新用戶) >>> 更新本地數據 >>> 上傳新的數據。
通過對比,可以發現,第一次打開小程序時,返回的數據和上報的數據內容是一致的。所以如果這里的校驗不充分的話,就會造成數據被隨意修改的“漏洞”。通過實地測試發現,本地數據是可以覆蓋掉服務端的數據,至此數據的修改就可以分為兩個方向,一是request的修改,二是response的修改。
1、request修改
修改request其實就是模擬協議請求,需要得到用戶的id以及app的secretKey和加密方法等。就是文章開頭說的徹底扒掉小游戲的底褲,遷移出關鍵key和加密算法,用其他語言實現。這種方法比較徹底,可以遠程批量操作,并且不需要登陸微信賬號。這也是一些淘寶店刷金幣、改鉆石的方法。
2、response修改
利用charles,修改返回值,然后利用客戶端上報數據。這種方法的好處就是不用關心請求的加密過程,不要知道內部邏輯,只修改數據即可。不足之處是,只能單個抓包進行,不能大范圍批量應用。
三、實例
先看一下具體的返回值,可以看到主副武器級別、傷害值、最高關卡、金幣、鉆石等數據。
利用charles的rewrite或者map local功能,可以輕松的對這些數據進行修改。比如該實例中,將主副武器飆到滿級1280,射速360,90億金幣等等。
最后,看一下實際的運行效果:
主武器和射速
副武器、金幣、鉆石等
玩了幾把,成功實現了“防沉迷”,因為等級高、武力強、金幣多,顯得略微無趣。
四、總結
通過這個例子,最主要的收獲是注意到什么樣的方式存在風險。例如自己的產品有一個新功能開發出來,會不會也存在類似的“漏洞”。相反大家都看的到的“漏洞”又是不是真的漏洞呢。。。。。。