人人都可以製作的三種基礎外掛教程(附GitHub源碼)

假期期間看見親戚朋友熱衷於各種小遊戲,看他們樂此不疲的同時我隱隱覺得對於其中一些簡單的遊戲應該可以利用簡單的程(wai)序(gua)實現自動完美通關。一番搜索後發現果然如此。於是在假期中,雖然之前對外掛零基礎,我基於網上的信息改進、完成並實測了幾款小遊戲的外掛。

有了這段經歷後,我覺得製作簡單的外掛非常適合CS新生迅速熟悉課本之外的知識,或者非CS但對計算機有興趣的人了解計算機的一部分工作原理。於是我從中選擇了三種有代表性的外掛,並整理出這篇文章。

以下三個程序都是使用python編寫的。我們作為體驗者而非職業外掛製作者,使用python可以有效提升我們的代碼效率,避免陷入無謂的細節中。

1.(故事的開始)跳一跳

關鍵字:安卓設備,圖像處理

GitHub鏈接:這裡

跳一跳的外掛在前一陣子非常火,甚至有些全工科狂歡的勢頭。從最開始的圖像識別法、偽造數據包法,到後來的圖像識別法、甚至OpenCL+機械手臂模擬法,可謂八仙過海各顯神通。我只想安安靜靜簡簡單單刷一個分而已,於是選擇了最簡單的圖像識別法。

這個方法非常簡單易懂:利用安卓調試程序(Android Debug Bridge,簡稱adb)在安卓機調試模式下可以截圖並且模擬按鍵。在進入遊戲後啟動外掛,整個程序就在:

  1. 截圖,將手機屏幕保存到指定路徑
  2. 分析截圖,獲得 當前棋子 和 下一落點 的位置
  3. 根據兩者位置模擬按下按鍵適當時間長度
  4. 等待若干秒回到步驟一

這四步進行。整個難點在分析截圖,好在網上有各種現成方案可以借鑒。經過實測,可以無壓力刷到2000分甚至更高(只要願意等)。

跳一跳外掛沒有不可逾越的技術難點,大多方案也只是在分析截圖這一步各有不同。我們可以將這個套路應用到其它類似的手機遊戲上。實際上由於手機屏幕的限制和大多數手機遊戲的休閑定位,大多數手機遊戲外掛都可以被如此製作出來。

對於一些流程邏輯/信息呈現比較複雜的手機遊戲,依靠分析截圖獲取信息只是理論上可行,實際耗費工作量太大,需要直接讀取內存中遊戲數據,而這就不在這篇文章的討論範圍之內了。

另外對於實時性遊戲(比如節奏大師),需要注意的是截圖並保存的延時比較高,我們需要另想辦法,比如只獲取屏幕上若干像素點進行快速判斷或者同樣讀取內存中遊戲數據等。

由於跳一跳邏輯簡單+單人,我認為它最適合成為外掛的入門自學案例。

2.(有網路接入的情況)頭腦王者

關鍵字:安卓設備,網路數據截取

Github鏈接:這裡

頭腦王者則是一個進階的微信小遊戲。它的主要遊戲內容是匹配另一位玩家,然後雙方同時儘快正確回答5道四選一選擇題,得分高的一方勝出。選擇題的內容範圍非常廣,從琴棋書畫到天文地理都有。

乍一看這個遊戲的外掛非常難製作,畢竟回答問題這個任務是現在自然語言處理的熱門方向,無數頂尖團隊為攻克它正在進行研究,我們能行嗎?但是GitHub上一位程序員敏銳發現由於手機尺寸大小的限制導致題目長度有限,幾乎所有題目都無法涉及邏輯推理而只能考察簡單的事實判斷。於是他提出並實現了如下大致思路:

  1. 獲取題目
  2. 在本地資料庫中搜索是否曾經遇到過此題
    1. 如遇到過,則直接獲得正確答案選項,進入步驟4
    2. 如沒遇到,則進入步驟3
  3. 對題目在百度上進行搜索,統計四個選項在百度返回的頁面中的出現頻率,由此推斷正確選項。
  4. 模擬用戶點擊選擇選項。
  5. 如這是一道新題,則將題目和伺服器返回的正解存入本地資料庫。否則忽略此步驟。
  6. 回到步驟1

再加上簡單的自動排位等功能,完全可以實現24小時無間斷全自動答題上分。經過實測,這個大智若愚的方法勝率很高,在我有限的測試中最高達到了至少30+連勝(有可能更高的連勝紀錄我沒看到)。

雖然頭腦王者已經涼了(據說是在最後一次現金賽中出題作大死,然後就立刻被關了),但是我仍覺得這個案例很有學習的價值。因為其中涉及到的網路數據包截取可以讓我們方便地實現更強大的功能。試想,若是我們要根據圖像識別呈現的文字內容,程序的複雜度和可靠性都會受到很大影響。原作者版本中截取頭腦王者的https數據包是使用破解版的Charles。但是破解版的安全性是個問題,同時經過我的調查,實際上更多人使用的是同樣強大但開源免費的Fiddler。於是我將原先的 adb+python+Charles 項目改造成了 adb+python+Fiddler,詳細可以參見Github中源碼。

針對其它遊戲,我們甚至可以利用Fiddler截取/篡改/偽造數據包這一思路,實現各種巧妙且高效的妖路子。

3. (電腦端網路遊戲)連連看

關鍵字:Windows電腦端

Github鏈接:這裡

Windows教學在CS專業中並沒有涉及,所以不少本科甚至研究生畢業後都可能對Windows的一些基本機制不了解。我覺得可以從兩個方面入手熟悉它,一個是MFC,一個就是本連連看外掛。

QQ遊戲的連連看是一個經久不衰的遊戲,它簡直就是Windows電腦端外掛入門的最佳對象。首先騰訊對連連看並不重視,導致遊戲很久未更新而研究對象保持不變,這樣大家才可以進行一致長期的技術交流。第二是其邏輯和美工非常簡單便於從多方面下手,對新手友好。最後是其對實時性要求不高,程序可以從容運行不需要考慮效率。

這個連連看外掛的一個版本是我在GitHub上無意發現的。但是其是用C寫成的,代碼混亂,沒有考慮到不同顯示器的像素問題,而且還需要改正幾處bug後才可以在VS下編譯成功。於是我參考其大致思路,編寫出了更加簡潔易懂的python版本,經過實測可以擊敗任何人類玩家(除非出現難以重現的小概率意外事件)。這個外掛程序的簡化流程如下:

  1. 進入遊戲房間,準備開始遊戲
  2. 開始遊戲後掃描遊戲界面,獲取各個方塊種類位置信息
  3. 計算消去方塊的解法並模擬滑鼠點擊消去所有方塊
  4. 遊戲結束後退出房間,回到步驟一

這個流程看似簡單,實際有不少問題。第一步,進入遊戲房間可能由於網路延時或者騰訊抽風導致進入失敗,這種情況需要處理。進入遊戲房間彈出遊戲窗口後可能對手玩家一直不開始遊戲,這時候也要考慮直接退出房間另找一個。第二步,我們怎麼知道遊戲開始了呢?我依靠某處背景像素顏色來判斷,但假設騰訊升級遊戲(雖然不太可能)讓背景顏色隨機出現怎麼辦呢?第三步,有可能存在無解的情況(所以有」重排「道具),這時候怎麼辦呢?想要實現重排可能會導致程序變複雜,或者乾脆考慮到這種情況出現很少,讓這盤遊戲輸掉算了?再者,如何調整消去速度,防止過快或過慢操作讓對手或自己不開心?(也許可以讀取網路數據包獲取對手準確消去進度,或者根據遊戲界面上方圖案估計對手消去進度,讓自己永遠比最快的選手快一點)第四步,遊戲結束後被藍鑽玩家快速踢出房間出現提示彈窗怎麼處理?窗口莫名抽風卡了一下怎麼處理?

這些問題體現出了它作為一個電腦端相對手機端環境的複雜。由於手機遊戲定位,幾乎所有手機遊戲都是獨佔屏幕,流程簡單,錯誤少。但是電腦端有多個窗口,各種遊戲內/外彈窗導致失去焦點,遊戲提示錯誤(網路延時進入房間失敗,被踢出房間等)等都會成為程序設計的困難。如果想要設計出可以流暢運行24小時的全自動外掛還是需要一些功夫的,而在克服這些困難的路上,我們可以學習到常見的Windows基本機制。

4. 結語

以上就是我介紹的三種不同類型的入門級外掛製作教程的總結,更加簡單的宏外掛(比如dota2中卡爾自動連招),更加複雜的讀取/篡改遊戲數據甚至偽造網路數據包就不是這一篇文章所涉及的了。有興趣的話大家可以以此為開端深入學習,讓興趣成為自己最好的老師從而越走越遠。

(P.S. 不是在犯罪的道路上越走越遠,而是在成長的道路上越走越遠。)

(再P.S. 嚴格意義以上三個不應被稱為外掛而是輔助軟體,因為並沒有破壞或篡改遊戲程序或其數據包本身。)

(再再P.S. 本文僅為學習交流,有任何問題請聯繫作者,作者保留對本文的版權。)


推薦閱讀:

C++對象模型(1) 關於對象
讓角色半透明:從 Ordered Dithering 說起(一)
C++對象模型(2)構造函數語義學
推薦幾款適合孩子玩的編程遊戲

TAG:計算機 | 遊戲編程 |