您當前位置>首頁 » 新聞資(zī)訊 » 小程序相關(guān) >
揭密微信跳一跳小遊戲那些外挂
發表時間:2021-3-31
發布人:葵宇科技
浏覽次數:34
作者:Hahn, 騰訊高級UI工程師(shī)
商(shāng)業(yè)轉載請聯系騰訊WeTest獲得授權,非商(shāng)業(yè)轉載請注明出處。
原文(wén)鍊接:http://wetest.qq.com/lab/view/364.html
WeTest 導讀
張小龍:這個(gè)遊戲發布以後,其實它的效果有點超出我們的預期,我們自己開玩笑說,這個(gè)遊戲突然變成了有史以來可(kě)能用戶規模最大的一個(gè)遊戲,因為它的DAU大概到了1點幾億,但同時出現了很多外挂,我沒有想到這麼小的一款遊戲也會有那麼多外挂,我朋友圈的朋友也打出了特别高的分,但是我相信不是他自己打出來的。
1 月(yuè) 15 日微信在廣州召開 2018 年的微信公開課 Pro,張小龍不僅當場玩了一把跳一跳遊戲并取得了900多的高分,還特别提到了跳一跳小遊戲的外挂:
在跳一跳這樣一個(gè)小的遊戲裡面,如(rú)果一個(gè)用戶看到裡面有一堆外挂得了很高的分,對其他一些每天在練習,試圖把自己的水平提高,而打一個(gè)高分的人就很不公平,他可(kě)能就沒有動(dòng)力繼續去練習,繼續超越自己個(gè)人的最高分數。所以這樣一個(gè)行為,外挂行為其實會破壞整個(gè)系統的規則,并且讓規則立即變得失效。
所以,我們這個(gè)小遊戲發布以後,我們就開始花(huā)了很多很多時間來打擊外挂。
本着鑽研技術(shù)的學習态度,我對目前幾款比較火的外挂進行了源碼分析,總結出了它們的一些破解思路(lù),其實這些作者都并非惡意,作為一個(gè)程序員,還有什麼比用技術(shù)挑戰規則,突破極限要有成就感呢(ne)?
一、梳理
跳一跳的遊戲可(kě)以細分為兩步驟:距離(lí)判斷 + 按壓模拟,這兩步都有下(xià)面這些解決方案:
1、距離(lí)判斷:
● 簡單方案:像素點判斷
● 進階方案:OpenCV 圖像分析
2、按壓模拟:
● 簡單方案:adb/wda 指令
● 進階方案:機械臂模拟手指點擊(原創)
下(xià)面逐一介紹這裡的實現方法,非常有意思。
二、距離(lí)判斷
1. 像素點判斷
該方法采用自目前最火的跳一跳小遊戲「輔助程序」:wechat_jump_game。
如(rú)上圖所示,我們先定義了「棋子(zǐ)」和(hé)「棋盤」,需要找到的兩個(gè)目标點用橙色點标注,首先針對棋子(zǐ)的目标點的判斷,可(kě)以這麼做:
相關(guān)代碼:
而針對棋盤中(zhōng)心點的确認的思路(lù)則是這樣的:
當然還有一些其他方法來盡量縮小棋盤中(zhōng)心點的檢測區域,這裡簡單介紹下(xià):
當然,如(rú)果恰好跳到中(zhōng)心點,下(xià)一個(gè)棋盤中(zhōng)間會有白色點,則可(kě)以直接匹配中(zhōng)心點的色值,得到棋盤中(zhōng)心點,這種情況基本百發百中(zhōng):
相關(guān)代碼:
但棋盤種類比較多,形狀也各異,而且棋盤表面并非純色,還有其他顔色,所以即使像素判斷的代碼裡增加了很多特殊 case,依舊不能做到非常完美:
總結一下(xià),目前這個(gè)方案基本沒有太大問(wèn)題,但如(rú)果跳一跳遊戲把背景改成了非線性漸變,或随機飄落一些物體,或棋盤表面更加複雜,那這裡的算法就基本不可(kě)用了。
2. OpenCV 圖像分析
基于像素點的判斷低效而且不夠健壯,而利用 OpenCV 計算機視覺庫則可(kě)以從圖像分析層面進一步簡化判斷邏輯提升效率,首先采用該方法的跳一跳小遊戲「輔助程序」來自 wechat_jump_jump。它是這麼得到棋子(zǐ)的位置的:
相關(guān)代碼:
接下(xià)來找棋盤的中(zhōng)心點,假如(rú)下(xià)一個(gè)棋盤存在白色的示意點,同樣采用上面的模闆匹配方法進行匹配,若匹配不上(匹配值小于某阈值,也許下(xià)個(gè)棋盤本身就是白色,所以灰度圖分辨不出),則采用第二種方案:
這裡是否準确的精髓就在于高斯濾波去除圖像噪音的臨界點以及 Canny 函數中(zhōng)阈值的設定,需要不斷調整參數到最優狀态。
相關(guān)代碼:
三、按壓模拟
1. adb/wda 指令
這兩個(gè)分别是針對 Android 和(hé) iOS 的命令行工具,可(kě)以将手機和(hé)電腦連接起來,并通(tōng)過命令行發送指令,指令中(zhōng)就包含了屏幕的截圖和(hé)按壓模拟。不過 iOS 配置起來稍微麻煩一點,具體操作指引可(kě)以參考 這裡。其核心的命令有:
當然,如(rú)果嫌配置麻煩,還可(kě)以通(tōng)過 Android 的 AirDrop App 或 iOS 的 QuickTime 把手機屏幕投到電腦中(zhōng),然後通(tōng)過 Python 的 Pillow 庫來截取投屏的内容,再做進一步的圖像識别工作。
還有一點值得一提,按壓時間這部分還是有優化的空間,前面提到了跳躍距離(lí)和(hé)按壓時間基本是線性關(guān)系,但越到後面可(kě)以越發現,距離(lí)并非和(hé)按壓時間絕對成線性比例,因為遊戲本身不是一個(gè)純 2D 的平面場景(2.5D),所以我們測量到的直線距離(lí)在 2.5D 場景中(zhōng)是有變化的,雖然影響不大,但在遊戲後期棋盤越來越小,距離(lí)越來越大時,容易凸現出問(wèn)題來,所以關(guān)于距離(lí)的計算有幾種不同的解決:
拟合函數的細節可(kě)以參考:
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. 機械臂模拟手指點擊
本着學術(shù)探究的态度,結合之前折騰開源硬件的經曆,所以也鬥膽想給跳一跳小遊戲增加一點動(dòng)手環節,把觸摸模拟這一操作通(tōng)過機械臂來物理完成,于是在萬能淘寶裡淘了一個(gè)一百多快錢的機械臂和(hé)部分配件,自己編寫了控制代碼,把按壓時間傳輸作為機械臂按下(xià)的停留時間,想法确定後便開始購置物品:
到貨後折騰一兩個(gè)晚上,最後成功搭建好了,大家看看效果(電容筆偶爾還是會觸碰不良)
視頻鍊接:https://v.qq.com/x/page/s0532...
四、最後
反對一切使用外挂行為!
反對一切使用外挂行為!
反對一切使用外挂行為!
通(tōng)過對外挂程序源碼的研讀,學習到了非常多創新的思維,這也算是外挂留給代碼世界的果實。
關(guān)于騰訊WeTest手遊安全測試團隊
騰訊WeTest手遊安全測試團隊從2011年初開始對手遊安全領域進行探索和(hé)技術(shù)積累,旨在通(tōng)過提前發現遊戲版本的安全漏洞,預警風險,打造出業(yè)界領先的手遊安全測試技術(shù)方案,在工具上已經支持所有騰訊在研和(hé)運營的手遊項目。團隊通(tōng)過使用與正式服同樣的遊戲客戶端和(hé)服務器(qì),模拟外挂工作室制作外挂的過程,依靠自身的技術(shù)積累來提高專業(yè)程度,持續保持漏洞的發現率。
目前提供了專家測試服務,希望通(tōng)過提前發現遊戲版本的安全漏洞,預警風險,幫助提高騰訊遊戲的品牌和(hé)口碑。
服務目前已經對外開放,點擊http://wetest.qq.com/product/sr 即可(kě)使用