前言
最近答題類的應(yīng)用實(shí)在是太火了,什么沖頂大會(huì)、百萬英雄啊汰翠,動(dòng)不動(dòng)就幾十上百萬的獎(jiǎng)金锈拨,著實(shí)讓人看著很是眼紅...然后本弱雞學(xué)疏才淺...題目全靠蒙砌庄,便不湊什么熱鬧了。之后沒過幾日有個(gè)小程序倒是在辦公室里面火了一把,就是這次需要拿來開刀的《頭腦王者》娄昆,其實(shí)也是個(gè)答題的小程序佩微,所以還是不擅長就是了。雖然我不擅長答題萌焰,但我好歹是個(gè)程序員呀喊衫,所以我走上了一條程序員的通頂之路...
成果
每輪游戲需要答5題,全對(duì)并且快速作答才能拿到滿分杆怕,滿分是1200分族购。有了這種戰(zhàn)績,世界第一不是夢陵珍!當(dāng)然玩游戲是為了樂趣寝杖,本弱雞只是出于興趣使然,這種答題類的游戲還是自己玩比較有意思互纯。
準(zhǔn)備工作
在開始寫這種游戲的輔助之前先思考幾個(gè)問題瑟幕。
如何偽造接口請(qǐng)求?
如何實(shí)現(xiàn)精準(zhǔn)答題留潦?
如何完成自動(dòng)答題只盹?
如何偽造接口請(qǐng)求?
首先小程序的接口請(qǐng)求都是基于HTTPS的兔院,具體捕獲Https的方式我這邊還是采用Anyproxy去捕獲殖卑,需要安裝對(duì)應(yīng)的Https證書才可以。之前的文章也有提及坊萝,這里再贅述一遍孵稽。
本文采用的Anyproxy,使用其他的代理工具也是一樣的十偶。
1. 安裝node.js
2. npm i -g anyproxy
3. anyproxy-ca // 生成證書
4. anyproxy -i // 以代理https的方式啟動(dòng)
// 然后手機(jī)端配置代理的IP及PORT菩鲜,默認(rèn)端口為8001,
// Anyproxy的WebService的默認(rèn)端口為8002惦积,這里可以查看到接口
// 手機(jī)端配置代理以后需要下載證書并信任接校,
// 蘋果端的可以在手機(jī)的Safiri里面輸入xxx.xxx.xxx.xxx:8002/fetchCrtFile的方式下載到證書
// 高版本的iOS可能需要在兩處地方信任。
配置完以后狮崩,打開游戲就能抓取到頭腦王者對(duì)應(yīng)的請(qǐng)求包了蛛勉。我先模擬了一次好友對(duì)戰(zhàn),然后需要分析了哪些包是需要的厉亏。這里我就直接把一些重要的接口給貼出來了
login接口(登錄接口董习,這里重要的信息是uid和token)
intoRoom接口 (進(jìn)入房間的接口)
beginFight接口 (開始對(duì)戰(zhàn)接口)
findQuiz接口 (找題目接口)
choose接口 (答題接口)
getResults接口 (獲取比賽結(jié)果的接口)
leaveRoom接口 (離開房間接口)
先從接口看一下,這是一個(gè)非常順暢的游戲流程爱只,但是拿到這些接口我就可以開始為所欲為了嗎皿淋?顯然是不可能的招刹,如果每個(gè)人都能有權(quán)限肆意使用別人的接口的話,豈不是可以很輕松的做到DDoS攻擊或者很輕松地獲取到自己想要的信息了嗎窝趣?對(duì)于一家有經(jīng)驗(yàn)的公司來說顯然是不會(huì)犯這種錯(cuò)誤的疯暑,那么我隨便拿一個(gè)接口來稍作分析。
上圖是天梯排位匹配接口哑舒,從Body中可以看到需要傳給服務(wù)端matchId妇拯、npcId、uid洗鸵、t越锈、sign五個(gè)參數(shù),這5個(gè)參數(shù)都是必須的膘滨,只有有一個(gè)參數(shù)出錯(cuò)甘凭,那請(qǐng)求就無法成功,前四個(gè)其實(shí)好理解火邓,關(guān)鍵是第五個(gè)簽名參數(shù)sign丹弱,是怎么來的呢?
這里就需要用到逆向工程了...簡單的描述就是...拿到小程序中頭腦王者壓縮后的源碼铲咨,并分析出其中的加密規(guī)則躲胳,篇幅有限,這里就直接描述其加密規(guī)則了纤勒。
sign的生成規(guī)則:Body內(nèi)所有的參數(shù)(除去sign)+ token(login接口獲扰髌弧)并按照key值排序以后對(duì)齊進(jìn)行MD5加密,
比如uid=111, t=222踊东, token=333北滥,那么加密前子串應(yīng)為t=222token=333uid=111
既然sign也有了,那其實(shí)就很簡單了闸翅,然后我就用node寫一個(gè)簡單的client去做偽造了接口請(qǐng)求。
如何實(shí)現(xiàn)精準(zhǔn)答題菊霜?
目前也有許多沖頂大會(huì)坚冀、百萬英雄的輔助,他們的思路是答題的時(shí)候快速識(shí)別到題目并進(jìn)行快速的搜索題目進(jìn)行輔助答題鉴逞,但對(duì)于這款游戲记某,如果想實(shí)現(xiàn)精準(zhǔn)的答題的話,最好的辦法就是匹配題庫构捡,那么問題就是題庫怎么來液南?當(dāng)然是通過爬蟲去爬取的了,OK...來讓我們找一找題庫的接口勾徽!顯然這是不可能的滑凉!要是對(duì)外開放了題庫的接口,這個(gè)游戲也太容易被攻破了把。但是從上述的一步中畅姊,其實(shí)我們已經(jīng)實(shí)現(xiàn)了開房模擬對(duì)戰(zhàn)了咒钟,那么是不是可以一直開房間一直對(duì)戰(zhàn)的方式獲取到題庫呢?所以我這里采用的就是這種思路若未。
success是腳本自動(dòng)答題打?qū)Φ念}目(一共5題)朱嘴,total是總共的題庫數(shù)量。從這個(gè)規(guī)拇趾希可以看出來萍嬉,正確率已經(jīng)是極高的了,說明題庫的數(shù)量應(yīng)該估計(jì)只有17000左右的范圍隙疚,但是由于剩下的題庫仍然在補(bǔ)充且最后的10%會(huì)需要較大的成本才能覆蓋到壤追,其實(shí)題庫做到這一步已經(jīng)足夠了,80%+的滿分概率...幾乎已經(jīng)是無人匹敵了吧甚淡?
如何實(shí)現(xiàn)自動(dòng)答題大诸?
自動(dòng)答題的方案有兩種:
類似跳一跳游戲,通過截屏=>OCR讀取題目=>匹配題庫=>模擬點(diǎn)擊答案
Anyproxy代理贯卦,寫rule文件修改請(qǐng)求资柔,捕獲findQuiz請(qǐng)求接口,server重新發(fā)起請(qǐng)求并等待數(shù)據(jù)返回=>判斷返回的題目是否已經(jīng)存在于數(shù)據(jù)庫=>匹配答案直接作答或返回題目
本弱雞在這里使用的就是第二種方案(具體實(shí)現(xiàn)就不贅述了撵割,大家可以直接看源碼)
總結(jié)
不太善于寫文章贿堰,上述很多步驟都簡單帶過了,在這里只是簡單地描述了一下過程啡彬,然后我會(huì)開源這部分的代碼羹与,寫得有些簡陋希望各位大佬們不要嘲笑(由于在寫Anyproxy的rule的時(shí)候沒法使用babel,所以我用require取代了import)庶灿。最后希望大家能給與我一點(diǎn)支持及肯定纵搁,給點(diǎn)star吧...只要10個(gè)不過分吧!有好心能請(qǐng)我喝杯咖啡那就萬分感謝了往踢。>.<
項(xiàng)目地址GitHub: 頭腦王者輔助
本文作者:lyh2668
原文地址:我是如何次次《頭腦王者》獲得滿分的-實(shí)戰(zhàn)教程-小程序社區(qū)-微信小程序-微信小程序開發(fā)社區(qū)-小程序開發(fā)論壇-微信小程序聯(lián)盟