我是如何次次《頭腦王者》得到滿分的

前言

最近答題類的應用實在是太火了,什麼衝頂大會、百萬英雄啊,動不動就幾十上百萬的獎金,着實讓人看着非常眼紅...而後本弱雞學疏才淺...題目全靠蒙,便不湊什麼熱鬧了。以後沒過幾日有個小程序卻是在辦公室裏面火了一把,就是此次須要拿來開刀的《頭腦王者》,其實也是個答題的小程序,因此仍是不擅長就是了。雖然我不擅長答題,但我好歹是個程序員呀,因此我走上了一條程序員的通頂之路...node

成果

每輪遊戲須要答5題,全對而且快速做答才能拿到滿分,滿分是1200分。有了這種戰績,世界第一不是夢!固然玩遊戲是爲了樂趣,本弱雞隻是出於興趣使然,這種答題類的遊戲仍是本身玩比較有意思。git

準備工做

在開始寫這種遊戲的輔助以前先思考幾個問題。程序員

  1. 如何僞造接口請求?
  2. 如何實現精準答題?
  3. 如何完成自動答題?

如何僞造接口請求?

首先小程序的接口請求都是基於HTTPS的,具體捕獲Https的方式我這邊仍是採用Anyproxy去捕獲,須要安裝對應的Https證書才能夠。以前的文章也有說起,這裏再贅述一遍。 本文采用的Anyproxy,使用其餘的代理工具也是同樣的。github

1. 安裝node.js
2. npm i -g anyproxy
3. anyproxy-ca // 生成證書
4. anyproxy -i // 以代理https的方式啓動
// 而後手機端配置代理的IP及PORT,默認端口爲8001,
// Anyproxy的WebService的默認端口爲8002,這裏能夠查看到接口
// 手機端配置代理之後須要下載證書並信任,
// 蘋果端的能夠在手機的Safiri裏面輸入xxx.xxx.xxx.xxx:8002/fetchCrtFile的方式下載到證書
// 高版本的iOS可能須要在兩處地方信任。
複製代碼

配置完之後,打開遊戲就能抓取到頭腦王者對應的請求包了。我先模擬了一次好友對戰,而後須要分析了哪些包是須要的。這裏我就直接把一些重要的接口給貼出來了數據庫

  1. login接口(登陸接口,這裏重要的信息是uid和token)
  2. intoRoom接口 (進入房間的接口)
  3. beginFight接口 (開始對戰接口)
  4. findQuiz接口 (找題目接口)
  5. choose接口 (答題接口)
  6. getResults接口 (獲取比賽結果的接口)
  7. leaveRoom接口 (離開房間接口)

先從接口看一下,這是一個很是順暢的遊戲流程,可是拿到這些接口我就能夠開始隨心所欲了嗎?顯然是不可能的,若是每一個人都能有權限肆意使用別人的接口的話,豈不是能夠很輕鬆的作到DDoS攻擊或者很輕鬆地獲取到本身想要的信息了嗎?對於一家有經驗的公司來講顯然是不會犯這種錯誤的,那麼我隨便拿一個接口來稍做分析。npm

上圖是天梯排位匹配接口,從Body中能夠看到須要傳給服務端matchId、npcId、uid、t、sign五個參數,這5個參數都是必須的,只有有一個參數出錯,那請求就沒法成功,前四個其實好理解,關鍵是第五個簽名參數sign,是怎麼來的呢?

這裏就須要用到逆向工程了...簡單的描述就是...拿到小程序中頭腦王者壓縮後的源碼,並分析出其中的加密規則,篇幅有限,這裏就直接描述其加密規則了。小程序

sign的生成規則:Body內全部的參數(除去sign)+ token(login接口獲取)並按照key值排序之後對齊進行MD5加密, 好比uid=111, t=222, token=333,那麼加密前子串應爲t=222token=333uid=111bash

既然sign也有了,那其實就很簡單了,而後我就用node寫一個簡單的client去作僞造了接口請求。微信

如何實現精準答題?

目前也有許多衝頂大會、百萬英雄的輔助,他們的思路是答題的時候快速識別到題目並進行快速的搜索題目進行輔助答題,但對於這款遊戲,若是想實現精準的答題的話,最好的辦法就是匹配題庫,那麼問題就是題庫怎麼來?固然是經過爬蟲去爬取的了,OK...來讓咱們找一找題庫的接口!顯然這是不可能的!要是對外開放了題庫的接口,這個遊戲也太容易被攻破了把。可是從上述的一步中,其實咱們已經實現了開房模擬對戰了,那麼是否是能夠一直開房間一直對戰的方式獲取到題庫呢?因此我這裏採用的就是這種思路。babel

success是腳本自動答題打對的題目(一共5題),total是總共的題庫數量。從這個規模能夠看出來,正確率已是極高的了,說明題庫的數量應該估計只有17000左右的範圍,可是因爲剩下的題庫仍然在補充且最後的10%會須要較大的成本才能覆蓋到,其實題庫作到這一步已經足夠了,80%+的滿分機率...幾乎已是無人匹敵了吧?

如何實現自動答題?

自動答題的方案有兩種:

  1. 相似跳一跳遊戲,經過截屏=>OCR讀取題目=>匹配題庫=>模擬點擊答案
  2. Anyproxy代理,寫rule文件修改請求,捕獲findQuiz請求接口,server從新發起請求並等待數據返回=>判斷返回的題目是否已經存在於數據庫=>匹配答案直接做答或返回題目

本弱雞在這裏使用的就是第二種方案(具體實現就不贅述了,你們能夠直接看源碼)

總結

不太善於寫文章,上述不少步驟都簡單帶過了,在這裏只是簡單地描述了一下過程,而後我會開源這部分的代碼,寫得有些簡陋但願各位大佬們不要嘲笑(因爲在寫Anyproxy的rule的時候無法使用babel,因此我用require取代了import)。最後但願你們能給與我一點支持及確定,給點star吧...>.<

項目地址GitHub: 頭腦王者輔助

你們能夠加這個微信:

相關文章
相關標籤/搜索