小程序模板網(wǎng)

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

發(fā)布時(shí)間:2018-01-24 10:47 所屬欄目:小程序開(kāi)發(fā)教程

前言最近答題類的應(yīng)用實(shí)在是太火了,什么沖頂大會(huì)、百萬(wàn)英雄啊,動(dòng)不動(dòng)就幾十上百萬(wàn)的獎(jiǎng)金,著實(shí)讓人看著很是眼紅...然后本弱雞學(xué)疏才淺...題目全靠蒙,便不湊什么熱鬧了。之后沒(méi)過(guò)幾日有個(gè)小程序倒是在辦公室里面火 ...

 
 
 

前言

最近答題類的應(yīng)用實(shí)在是太火了,什么沖頂大會(huì)、百萬(wàn)英雄啊,動(dòng)不動(dòng)就幾十上百萬(wàn)的獎(jiǎng)金,著實(shí)讓人看著很是眼紅...然后本弱雞學(xué)疏才淺...題目全靠蒙,便不湊什么熱鬧了。之后沒(méi)過(guò)幾日有個(gè)小程序倒是在辦公室里面火了一把,就是這次需要拿來(lái)開(kāi)刀的《頭腦王者》,其實(shí)也是個(gè)答題的小程序,所以還是不擅長(zhǎng)就是了。雖然我不擅長(zhǎng)答題,但我好歹是個(gè)程序員呀,所以我走上了一條程序員的通頂之路...

成果

每輪游戲需要答5題,全對(duì)并且快速作答才能拿到滿分,滿分是1200分。有了這種戰(zhàn)績(jī),世界第一不是夢(mèng)!當(dāng)然玩游戲是為了樂(lè)趣,本弱雞只是出于興趣使然,這種答題類的游戲還是自己玩比較有意思。

準(zhǔn)備工作

在開(kāi)始寫這種游戲的輔助之前先思考幾個(gè)問(wèn)題。

如何偽造接口請(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可能需要在兩處地方信任。

配置完以后,打開(kāi)游戲就能抓取到頭腦王者對(duì)應(yīng)的請(qǐng)求包了。我先模擬了一次好友對(duì)戰(zhàn),然后需要分析了哪些包是需要的。這里我就直接把一些重要的接口給貼出來(lái)了

login接口(登錄接口,這里重要的信息是uid和token)
intoRoom接口 (進(jìn)入房間的接口)
beginFight接口 (開(kāi)始對(duì)戰(zhàn)接口)
findQuiz接口 (找題目接口)
choose接口 (答題接口)
getResults接口 (獲取比賽結(jié)果的接口)
leaveRoom接口 (離開(kāi)房間接口)

先從接口看一下,這是一個(gè)非常順暢的游戲流程,但是拿到這些接口我就可以開(kāi)始為所欲為了嗎?顯然是不可能的,如果每個(gè)人都能有權(quán)限肆意使用別人的接口的話,豈不是可以很輕松的做到DDoS攻擊或者很輕松地獲取到自己想要的信息了嗎?對(duì)于一家有經(jīng)驗(yàn)的公司來(lái)說(shuō)顯然是不會(huì)犯這種錯(cuò)誤的,那么我隨便拿一個(gè)接口來(lái)稍作分析。

上圖是天梯排位匹配接口,從Body中可以看到需要傳給服務(wù)端matchId、npcId、uid、t、sign五個(gè)參數(shù),這5個(gè)參數(shù)都是必須的,只有有一個(gè)參數(shù)出錯(cuò),那請(qǐng)求就無(wú)法成功,前四個(gè)其實(shí)好理解,關(guān)鍵是第五個(gè)簽名參數(shù)sign,是怎么來(lái)的呢?
這里就需要用到逆向工程了...簡(jiǎn)單的描述就是...拿到小程序中頭腦王者壓縮后的源碼,并分析出其中的加密規(guī)則,篇幅有限,這里就直接描述其加密規(guī)則了。

sign的生成規(guī)則:Body內(nèi)所有的參數(shù)(除去sign)+ token(login接口獲?。┎凑誯ey值排序以后對(duì)齊進(jìn)行MD5加密,
比如uid=111, t=222, token=333,那么加密前子串應(yīng)為t=222token=333uid=111
既然sign也有了,那其實(shí)就很簡(jiǎn)單了,然后我就用node寫一個(gè)簡(jiǎn)單的client去做偽造了接口請(qǐng)求。

如何實(shí)現(xiàn)精準(zhǔn)答題?

目前也有許多沖頂大會(huì)、百萬(wàn)英雄的輔助,他們的思路是答題的時(shí)候快速識(shí)別到題目并進(jìn)行快速的搜索題目進(jìn)行輔助答題,但對(duì)于這款游戲,如果想實(shí)現(xiàn)精準(zhǔn)的答題的話,最好的辦法就是匹配題庫(kù),那么問(wèn)題就是題庫(kù)怎么來(lái)?當(dāng)然是通過(guò)爬蟲(chóng)去爬取的了,OK...來(lái)讓我們找一找題庫(kù)的接口!顯然這是不可能的!要是對(duì)外開(kāi)放了題庫(kù)的接口,這個(gè)游戲也太容易被攻破了把。但是從上述的一步中,其實(shí)我們已經(jīng)實(shí)現(xiàn)了開(kāi)房模擬對(duì)戰(zhàn)了,那么是不是可以一直開(kāi)房間一直對(duì)戰(zhàn)的方式獲取到題庫(kù)呢?所以我這里采用的就是這種思路。

success是腳本自動(dòng)答題打?qū)Φ念}目(一共5題),total是總共的題庫(kù)數(shù)量。從這個(gè)規(guī)??梢钥闯鰜?lái),正確率已經(jīng)是極高的了,說(shuō)明題庫(kù)的數(shù)量應(yīng)該估計(jì)只有17000左右的范圍,但是由于剩下的題庫(kù)仍然在補(bǔ)充且最后的10%會(huì)需要較大的成本才能覆蓋到,其實(shí)題庫(kù)做到這一步已經(jīng)足夠了,80%+的滿分概率...幾乎已經(jīng)是無(wú)人匹敵了吧?
如何實(shí)現(xiàn)自動(dòng)答題?
自動(dòng)答題的方案有兩種:

類似跳一跳游戲,通過(guò)截屏=>OCR讀取題目=>匹配題庫(kù)=>模擬點(diǎn)擊答案

Anyproxy代理,寫rule文件修改請(qǐng)求,捕獲findQuiz請(qǐng)求接口,server重新發(fā)起請(qǐng)求并等待數(shù)據(jù)返回=>判斷返回的題目是否已經(jīng)存在于數(shù)據(jù)庫(kù)=>匹配答案直接作答或返回題目

本弱雞在這里使用的就是第二種方案(具體實(shí)現(xiàn)就不贅述了,大家可以直接看源碼)

總結(jié)

不太善于寫文章,上述很多步驟都簡(jiǎn)單帶過(guò)了,在這里只是簡(jiǎn)單地描述了一下過(guò)程,然后我會(huì)開(kāi)源這部分的代碼,寫得有些簡(jiǎn)陋希望各位大佬們不要嘲笑(由于在寫Anyproxy的rule的時(shí)候沒(méi)法使用babel,所以我用require取代了import)。最后希望大家能給與我一點(diǎn)支持及肯定,給點(diǎn)star吧...只要10個(gè)不過(guò)分吧!有好心能請(qǐng)我喝杯咖啡那就萬(wàn)分感謝了。>.<
如有在嘗試的時(shí)候碰到問(wèn)題,也可以加本弱雞的wx: lyh2668

項(xiàng)目地址GitHub: 頭腦王者輔助



易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開(kāi)源 碼云倉(cāng)庫(kù):starfork
本文地址:http://22321a.com/wxmini/doc/course/19607.html 復(fù)制鏈接 如需定制請(qǐng)聯(lián)系易優(yōu)客服咨詢:800182392 點(diǎn)擊咨詢
QQ在線咨詢