歡迎你們前往雲+社區,獲取更多騰訊海量技術實踐乾貨哦~html
做者:Hahn, 騰訊高級UI工程師git
由 WeTest質量開放平臺團隊 發佈於雲+社區程序員
張小龍:這個遊戲發佈之後,其實它的效果有點超出咱們的預期,咱們本身開玩笑說,這個遊戲忽然變成了有史以來可能用戶規模最大的一個遊戲,由於它的DAU大概到了1點幾億,但同時出現了不少外掛,我沒有想到這麼小的一款遊戲也會有那麼多外掛,我朋友圈的朋友也打出了特別高的分,可是我相信不是他本身打出來的。github
1 月 15 日微信在廣州召開 2018 年的微信公開課 Pro,張小龍不只當場玩了一把跳一跳遊戲並取得了900多的高分,還特別提到了跳一跳小遊戲的外掛:算法
在跳一跳這樣一個小的遊戲裏面,若是一個用戶看到裏面有一堆外掛得了很高的分,對其餘一些天天在練習,試圖把本身的水平提升,而打一個高分的人就很不公平,他可能就沒有動力繼續去練習,繼續超越本身我的的最高分數。因此這樣一個行爲,外掛行爲其實會破壞整個系統的規則,而且讓規則當即變得失效。小程序
因此,咱們這個小遊戲發佈之後,咱們就開始花了不少不少時間來打擊外掛。微信小程序
本着鑽研技術的學習態度,我對目前幾款比較火的外掛進行了源碼分析,總結出了它們的一些破解思路,其實這些做者都並不是惡意,做爲一個程序員,還有什麼比用技術挑戰規則,突破極限要有成就感呢?安全
跳一跳的遊戲能夠細分爲兩步驟:距離判斷 + 按壓模擬,這兩步都有下面這些解決方案:服務器
一、距離判斷:微信
● 簡單方案:像素點判斷
● 進階方案:OpenCV 圖像分析
二、按壓模擬:
● 簡單方案:adb/wda 指令
● 進階方案:機械臂模擬手指點擊(原創)
下面逐一介紹這裏的實現方法,很是有意思。
該方法採用自目前最火的跳一跳小遊戲「輔助程序」:wechat_jump_game。
如上圖所示,咱們先定義了「棋子」和「棋盤」,須要找到的兩個目標點用橙色點標註,首先針對棋子的目標點的判斷,能夠這麼作:
相關代碼:
而針對棋盤中心點的確認的思路則是這樣的:
固然還有一些其餘方法來儘可能縮小棋盤中心點的檢測區域,這裏簡單介紹下:
固然,若是剛好跳到中心點,下一個棋盤中間會有白色點,則能夠直接匹配中心點的色值,獲得棋盤中心點,這種狀況基本百發百中:
相關代碼:
但棋盤種類比較多,形狀也各異,並且棋盤表面並不是純色,還有其餘顏色,因此即便像素判斷的代碼裏增長了不少特殊 case,依舊不能作到很是完美:
總結一下,目前這個方案基本沒有太大問題,但若是跳一跳遊戲把背景改爲了非線性漸變,或隨機飄落一些物體,或棋盤表面更加複雜,那這裏的算法就基本不可用了。
基於像素點的判斷低效並且不夠健壯,而利用 OpenCV 計算機視覺庫則能夠從圖像分析層面進一步簡化判斷邏輯提高效率,首先採用該方法的跳一跳小遊戲「輔助程序」來自 wechat_jump_jump。它是這麼獲得棋子的位置的:
相關代碼:
接下來找棋盤的中心點,假以下一個棋盤存在白色的示意點,一樣採用上面的模板匹配方法進行匹配,若匹配不上(匹配值小於某閾值,也許下個棋盤自己就是白色,因此灰度圖分辨不出),則採用第二種方案:
這裏是否準確的精髓就在於高斯濾波去除圖像噪音的臨界點以及 Canny 函數中閾值的設定,須要不斷調整參數到最優狀態。
相關代碼:
這兩個分別是針對 Android 和 iOS 的命令行工具,能夠將手機和電腦鏈接起來,並經過命令行發送指令,指令中就包含了屏幕的截圖和按壓模擬。不過 iOS 配置起來稍微麻煩一點,具體操做指引能夠參考 這裏。其核心的命令有:
固然,若是嫌配置麻煩,還能夠經過 Android 的 AirDrop App 或 iOS 的 QuickTime 把手機屏幕投到電腦中,而後經過 Python 的 Pillow 庫來截取投屏的內容,再作進一步的圖像識別工做。
還有一點值得一提,按壓時間這部分仍是有優化的空間,前面提到了跳躍距離和按壓時間基本是線性關係,但越到後面能夠愈加現,距離並不是和按壓時間絕對成線性比例,由於遊戲自己不是一個純 2D 的平面場景(2.5D),因此咱們測量到的直線距離在 2.5D 場景中是有變化的,雖然影響不大,但在遊戲後期棋盤愈來愈小,距離愈來愈大時,容易凸現出問題來,因此關於距離的計算有幾種不一樣的解決:
擬合函數的細節能夠參考:
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
本着學術探究的態度,結合以前折騰開源硬件的經歷,因此也斗膽想給跳一跳小遊戲增長一點動手環節,把觸摸模擬這一操做經過機械臂來物理完成,因而在萬能淘寶裏淘了一個一百多快錢的機械臂和部分配件,本身編寫了控制代碼,把按壓時間傳輸做爲機械臂按下的停留時間,想法肯定後便開始購置物品:
到貨後折騰一兩個晚上,最後成功搭建好了,你們看看效果(電容筆偶爾仍是會觸碰不良)
視頻連接:https://v.qq.com/x/page/s05329u9gun.html
反對一切使用外掛行爲!
反對一切使用外掛行爲!
反對一切使用外掛行爲!
經過對外掛程序源碼的研讀,學習到了很是多創新的思惟,這也算是外掛留給代碼世界的果實。
騰訊WeTest手遊安全測試團隊從2011年初開始對手遊安全領域進行探索和技術積累,旨在經過提早發現遊戲版本的安全漏洞,預警風險,打造出業界領先的手遊安全測試技術方案,在工具上已經支持全部騰訊在研和運營的手遊項目。團隊經過使用與正式服一樣的遊戲客戶端和服務器,模擬外掛工做室製做外掛的過程,依靠自身的技術積累來提升專業程度,持續保持漏洞的發現率。
目前提供了專家測試服務,但願經過提早發現遊戲版本的安全漏洞,預警風險,幫助提升騰訊遊戲的品牌和口碑。
服務目前已經對外開放,點擊http://wetest.qq.com/product/sr 便可使用。