張小龍:這個(gè)游戲發(fā)布以后,其實(shí)它的效果有點(diǎn)超出我們的預(yù)期,我們自己開(kāi)玩笑說(shuō),這個(gè)游戲突然變成了有史以來(lái)可能用戶規(guī)模最大的一個(gè)游戲,因?yàn)樗腄AU大概到了1點(diǎn)幾億,但同時(shí)出現(xiàn)了很多外掛,我沒(méi)有想到這么小的一款游戲也會(huì)有那么多外掛,我朋友圈的朋友也打出了特別高的分,但是我相信不是他自己打出來(lái)的。
1 月 15 日微信在廣州召開(kāi) 2018 年的微信公開(kāi)課 Pro,張小龍不僅當(dāng)場(chǎng)玩了一把跳一跳游戲并取得了900多的高分,還特別提到了跳一跳小游戲的外掛:
在跳一跳這樣一個(gè)小的游戲里面,如果一個(gè)用戶看到里面有一堆外掛得了很高的分,對(duì)其他一些每天在練習(xí),試圖把自己的水平提高,而打一個(gè)高分的人就很不公平,他可能就沒(méi)有動(dòng)力繼續(xù)去練習(xí),繼續(xù)超越自己個(gè)人的最高分?jǐn)?shù)。所以這樣一個(gè)行為,外掛行為其實(shí)會(huì)破壞整個(gè)系統(tǒng)的規(guī)則,并且讓規(guī)則立即變得失效。
所以,我們這個(gè)小游戲發(fā)布以后,我們就開(kāi)始花了很多很多時(shí)間來(lái)打擊外掛。
本著鉆研技術(shù)的學(xué)習(xí)態(tài)度,我對(duì)目前幾款比較火的外掛進(jìn)行了源碼分析,總結(jié)出了它們的一些破解思路,其實(shí)這些作者都并非惡意,作為一個(gè)程序員,還有什么比用技術(shù)挑戰(zhàn)規(guī)則,突破極限要有成就感呢?
跳一跳的游戲可以細(xì)分為兩步驟:距離判斷 + 按壓模擬,這兩步都有下面這些解決方案:
1、距離判斷:
● 簡(jiǎn)單方案:像素點(diǎn)判斷
● 進(jìn)階方案:OpenCV 圖像分析
2、按壓模擬:
● 簡(jiǎn)單方案:adb/wda 指令
● 進(jìn)階方案:機(jī)械臂模擬手指點(diǎn)擊(原創(chuàng))
下面逐一介紹這里的實(shí)現(xiàn)方法,非常有意思。
1. 像素點(diǎn)判斷
該方法采用自目前最火的跳一跳小游戲「輔助程序」:wechat_jump_game。
如上圖所示,我們先定義了「棋子」和「棋盤」,需要找到的兩個(gè)目標(biāo)點(diǎn)用橙色點(diǎn)標(biāo)注,首先針對(duì)棋子的目標(biāo)點(diǎn)的判斷,可以這么做:
相關(guān)代碼:
而針對(duì)棋盤中心點(diǎn)的確認(rèn)的思路則是這樣的:
當(dāng)然還有一些其他方法來(lái)盡量縮小棋盤中心點(diǎn)的檢測(cè)區(qū)域,這里簡(jiǎn)單介紹下:
當(dāng)然,如果恰好跳到中心點(diǎn),下一個(gè)棋盤中間會(huì)有白色點(diǎn),則可以直接匹配中心點(diǎn)的色值,得到棋盤中心點(diǎn),這種情況基本百發(fā)百中:
相關(guān)代碼:
但棋盤種類比較多,形狀也各異,而且棋盤表面并非純色,還有其他顏色,所以即使像素判斷的代碼里增加了很多特殊 case,依舊不能做到非常完美:
總結(jié)一下,目前這個(gè)方案基本沒(méi)有太大問(wèn)題,但如果跳一跳游戲把背景改成了非線性漸變,或隨機(jī)飄落一些物體,或棋盤表面更加復(fù)雜,那這里的算法就基本不可用了。
2. OpenCV 圖像分析
基于像素點(diǎn)的判斷低效而且不夠健壯,而利用 OpenCV 計(jì)算機(jī)視覺(jué)庫(kù)則可以從圖像分析層面進(jìn)一步簡(jiǎn)化判斷邏輯提升效率,首先采用該方法的跳一跳小游戲「輔助程序」來(lái)自 wechat_jump_jump。它是這么得到棋子的位置的:
相關(guān)代碼:
接下來(lái)找棋盤的中心點(diǎn),假如下一個(gè)棋盤存在白色的示意點(diǎn),同樣采用上面的模板匹配方法進(jìn)行匹配,若匹配不上(匹配值小于某閾值,也許下個(gè)棋盤本身就是白色,所以灰度圖分辨不出),則采用第二種方案:
這里是否準(zhǔn)確的精髓就在于高斯濾波去除圖像噪音的臨界點(diǎn)以及 Canny 函數(shù)中閾值的設(shè)定,需要不斷調(diào)整參數(shù)到最優(yōu)狀態(tài)。
相關(guān)代碼:
1. adb/wda 指令
這兩個(gè)分別是針對(duì) Android 和 iOS 的命令行工具,可以將手機(jī)和電腦連接起來(lái),并通過(guò)命令行發(fā)送指令,指令中就包含了屏幕的截圖和按壓模擬。不過(guò) iOS 配置起來(lái)稍微麻煩一點(diǎn),具體操作指引可以參考 這里。其核心的命令有:
當(dāng)然,如果嫌配置麻煩,還可以通過(guò) Android 的 AirDrop App 或 iOS 的 QuickTime 把手機(jī)屏幕投到電腦中,然后通過(guò) Python 的 Pillow 庫(kù)來(lái)截取投屏的內(nèi)容,再做進(jìn)一步的圖像識(shí)別工作。
還有一點(diǎn)值得一提,按壓時(shí)間這部分還是有優(yōu)化的空間,前面提到了跳躍距離和按壓時(shí)間基本是線性關(guān)系,但越到后面可以越發(fā)現(xiàn),距離并非和按壓時(shí)間絕對(duì)成線性比例,因?yàn)橛螒虮旧聿皇且粋€(gè)純 2D 的平面場(chǎng)景(2.5D),所以我們測(cè)量到的直線距離在 2.5D 場(chǎng)景中是有變化的,雖然影響不大,但在游戲后期棋盤越來(lái)越小,距離越來(lái)越大時(shí),容易凸現(xiàn)出問(wèn)題來(lái),所以關(guān)于距離的計(jì)算有幾種不同的解決:
擬合函數(shù)的細(xì)節(jié)可以參考:
1)https://github.com/metowolf/JumpJumpHelper
2)https://github.com/wangshub/wechat_jump_game/issues/744
3)https://github.com/wangshub/wechat_jump_game/pull/841
2. 機(jī)械臂模擬手指點(diǎn)擊
本著學(xué)術(shù)探究的態(tài)度,結(jié)合之前折騰開(kāi)源硬件的經(jīng)歷,所以也斗膽想給跳一跳小游戲增加一點(diǎn)動(dòng)手環(huán)節(jié),把觸摸模擬這一操作通過(guò)機(jī)械臂來(lái)物理完成,于是在萬(wàn)能淘寶里淘了一個(gè)一百多快錢的機(jī)械臂和部分配件,自己編寫了控制代碼,把按壓時(shí)間傳輸作為機(jī)械臂按下的停留時(shí)間,想法確定后便開(kāi)始購(gòu)置物品:
到貨后折騰一兩個(gè)晚上,最后成功搭建好了,大家看看效果(電容筆偶爾還是會(huì)觸碰不良)
視頻鏈接:https://v.qq.com/x/page/s0532...
反對(duì)一切使用外掛行為!
反對(duì)一切使用外掛行為!
反對(duì)一切使用外掛行為!
通過(guò)對(duì)外掛程序源碼的研讀,學(xué)習(xí)到了非常多創(chuàng)新的思維,這也算是外掛留給代碼世界的果實(shí)。
關(guān)于騰訊WeTest手游安全測(cè)試團(tuán)隊(duì)
騰訊WeTest手游安全測(cè)試團(tuán)隊(duì)從2011年初開(kāi)始對(duì)手游安全領(lǐng)域進(jìn)行探索和技術(shù)積累,旨在通過(guò)提前發(fā)現(xiàn)游戲版本的安全漏洞,預(yù)警風(fēng)險(xiǎn),打造出業(yè)界領(lǐng)先的手游安全測(cè)試技術(shù)方案,在工具上已經(jīng)支持所有騰訊在研和運(yùn)營(yíng)的手游項(xiàng)目。團(tuán)隊(duì)通過(guò)使用與正式服同樣的游戲客戶端和服務(wù)器,模擬外掛工作室制作外掛的過(guò)程,依靠自身的技術(shù)積累來(lái)提高專業(yè)程度,持續(xù)保持漏洞的發(fā)現(xiàn)率。
目前提供了專家測(cè)試服務(wù),希望通過(guò)提前發(fā)現(xiàn)游戲版本的安全漏洞,預(yù)警風(fēng)險(xiǎn),幫助提高騰訊游戲的品牌和口碑。
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)