[閒聊] 開圖、防開圖及反防開圖

看板WarCraftChat作者 (麥子)時間13年前 (2010/11/12 23:58), 編輯推噓27(2817)
留言36則, 28人參與, 最新討論串1/2 (看更多)
※ [本文轉錄自 WarCraft 看板 #1CtM8kKq ] 作者: sitos (麥子) 站內: WarCraft 標題: [閒聊] 開圖、防開圖及反防開圖 時間: Fri Nov 12 23:50:04 2010 之前寫了一個小的防開圖程式,算是長久以來對開圖與防開圖一些想法的實驗, 也發現自己對這些事,累積的一些認識和想法,不如就整理出來和大家分享。 畢竟過去在討論開圖的事上面,也有許多板友零零星星地提過一些想法, 雖然多數人沒有程式能力可以自己實作這些想法,但提出想法的時候, 若是對於開圖以及防開圖這些事,沒有基本的了解,很多想法就只是空談而不可行。 如果能夠把相關的背景介紹給一些稍有背景的人了解,也許也能得到一些回饋, 或至少在未來討論的時候,能夠把焦點放在一些可能的方法上面,比較有建設性。 廢話就不多說了,首先我們得要從 Warcraft III 的多人遊戲運作原理開始講起, 這會告訴我們為什麼可以開圖,以及應該要怎麼樣做才能開圖。 Warcraft III 基本上是以 peer-to-peer 的方式進行連線,也就是在多人遊戲當中, 只有玩家和玩家之間彼此互連,並沒有透過伺服器。這代表遊戲中的頻寬是受限的, 而且遊戲的狀態必定是以某種分佈方式儲存在玩家的電腦上。 我想以 Warcraft III 發佈時的網路頻寬,這樣的選擇算是合理的選擇。 畢竟 Blizzard 的玩家眾多,如果所有的遊戲都一定要在線上伺服器進行, 讓所有的人都連到伺服器,那麼伺服器的維護成本相對就會較高, 恐怕遊戲本身就沒辦法以買斷的方式讓玩家不斷地去玩。反而可能像是 WoW 這樣, 是以月費的方式來維持線上服務的進行。這在當時恐怕銷售上會有困難。 既然玩家彼此互連,就不可能像伺服器一樣可以控制可取得的頻寬, 因此在設計的時候就得要先假設頻寬可能是很受限的。因此,傳遞的資料應該精簡。 傳遞的資料可以簡單的分為兩種選擇,一種是直接玩家需要知道的遊戲狀態, 這樣做的優點是,可以只把玩家知道的資訊曝露出來,而玩家不應該知道的, 就根本不傳送出去,如此一來就可以避免玩家取得不應該取得的資訊。 然而缺點也很明顯,整個遊戲正在改變的事物太多,如果每一小段時間, 就必須要把所有改變的事物都傳出去,對於網路頻寬的需求太高, 以 Warcraft III 當時開發的環境而言,實作上恐怕是有困難的。 另外一種方式,就是只把玩家的動作傳送出去。就算是高估一個玩家的動作, 當作每一秒有五個動作,也只不過是每 0.2 有一個簡單的描述就夠了, 封包裡面大概就描述一下是什麼動作,對象或座標等等,傳輸量不大。 而接收到動作的那一端,再自行計算相應這個動作,遊戲狀態應該有的改變, 並把計算的結果呈現給玩家就可以了。這樣做的優點是傳輸的量相對較小。 但缺點是,很多將被看見的遊戲狀態,都是取決於未被看見的部份, 因此必須要讓玩家擁有原本看不見的狀態,才有可能作出正確的計算。 既然這些資料已經存在在玩家的電腦之中,試著竊取出來就容易多了。 因此,遊戲的狀態不可能是被切割成很多份存在不同的玩家電腦上, 反而必須要每一個人都存有一份完整的資料。這樣做的好處, 除了只傳送動作進而自行演算遊戲狀態可以減少網路頻寬的使用以外, 另一個好處是,每一個人都有完整的遊戲狀態,可以對其它玩家的指令, 進行驗證,避免其它玩家直接鎖定血量、更改等級等等, 自己卻無法驗證這樣的動作本身是否合法,而造成遊戲不公平。 然而,人人都有一份遊戲狀態的缺點,就是很容易可以取得不應有的資訊。 最著名的例子,當然就是顯示陰影中的單位,也就是所謂的開圖。 相應著 Warcraft III 本身的寫法,開圖只需要要求 Warcraft III , 把原本因為被陰影遮住,而不顯示的那些單位,要求它顯示就可以了。 由於是否要顯示的判斷是寫在 Warcraft III 的二進位檔案當中, 只要能夠對這個檔案,或者是載入記憶體後的資料作適當的修改。 就可以讓 Warcraft III 在遊戲當中顯示這些原本不應該顯示的資訊。 當然,這並不是唯一開圖的方法,不過目前常見的開圖軟體, 基本上都是透過這個方式進行的,因此我們就暫且只討論這種開圖方式。 現在主導遊戲資訊顯示的二進位檔,是 game.dll 這個檔案, 因此只要可以修改這個檔案,或者是在遊戲進行中, 對這個檔案在記憶體中相對的位子作修改,就可以達到開圖的效果。 例如某個開圖軟體,要求你輸入 Warcraft III 所在資料夾, 並在啟用後才能開啟 Warcraft III ,就是透過第一種方式。 當你選啟用以後,它實際上的動作是修改 game.dll , 因此當你開啟 Warcraft III 後,便是載入了開圖版本的 game.dll 。 而當你把這個程式關閉的時候,它會再將 game.dll 還原, 因此像是取消開圖一樣, Warcraft III 的執行又回歸正常。 不過事實上,對檔案的修改是永久的,當你選擇啟用開圖以後, 如果直接從工作管理員關閉這個開圖程式,它就沒有機會改回來。 因此 game.dll 就會永遠都在開圖狀態,即使你不再打開開圖程式, 只要 Warcraft III 執行起來,都持續會有開圖的效果。 當然,這不是一件好事情,修改二進位執行檔也可能有法律問題。 而且這種會帶來永久副作用的方式,也讓人不太舒服。 另一種方式,也是更為傳統的方式,是待這個檔案載入記憶體後, 直接修改記憶體的內容,同樣也可以達到開圖的效果。 優點是,幾乎沒有副作用,只要程式被關閉,開圖的效果就消失了。 再一次打開,又是乾乾淨淨的 Warcraft III ,也比較沒有法律問題。 不過兩者的原理其實是相通的,目的就是希望在執行時, 記憶體當中的那一份 game.dll 是要被修改過來取得開圖資訊的。 那麼,相應著各式各樣的開圖機制,防開圖又是怎麼做的呢? 基本上可以粗略地方成三類。第一,偵測開圖的程式。 第二,阻擋開圖的動作。第三,偵測 game.dll 在記憶體中的狀態。 第一種偵測開圖的程式,也是最早被實際應用的方式。 大致上的方法脫離不了找尋開圖程式的視窗或者是特定的特徵, 如果找到已經被開啟的開圖程式,就認定玩家有開圖。 早期的 Garena 也是用類似的作法。 然而,偵測開圖程式基本上已經完全無效了。原因很簡單, 一旦開圖完成,開圖程式就可以被關閉,而一旦開圖程式關閉了, 就無法透過偵測開圖程式來偵測開圖。然而即使這樣,開圖的效果還在。 就形成了實際上有開圖,但是偵測不到的死角。 這也就是早期你只要先開啟 Warcraft III 開好圖,再開 Garena , 就可以快快樂樂開圖的原因。因此後來 Garena 作了一些修改, 讓 Garena 一定要先執行,再透過 Garena 執行 Warcraft III , 才會替 Warcraft III 轉送封包,藉此確保執行開圖動作時, Garena 一定是處於啟動的狀態,以便可以偵測開圖。 可惜這樣的作法也是徒勞無功,只要用 Process Explorer 之類的工具, 讓 Garena 的執行暫停,再進行開圖的動作,接著關閉開圖程式, 再恢復 Garena 的運作,就一點也沒有機會可以偵測到已關閉的開圖程式。 那麼,第二種方式如何? 如果我們可以阻擋開圖,是否就能禁止開圖? 有一段時間這個作法是挺成功的。如果我的印象沒有錯的話, 大概就是 Garena 跟輸入法衝突的時候。由於當時多數的開圖程式, 都是透過 WriteProcessMemory 修改記憶體內容,因此只要阻擋這個函式, 就可以避免開圖程式修改 Warcraft III 的記憶體進而避免開圖。 可惜這個方法也有很大的問題,第一方面就造就了剛剛講的, 直接修改 game.dll 檔案的開圖方式。 Garena 不可能阻檔修改檔案, 因此,只要改過檔案再開 Warcraft III 就根本擋不到了。 第二種方式就是把 WriteProcessMemory 的阻擋解開。 一般阻擋的方式就是對 WriteProcessMemory 進行全域的勾載, 把對這個函式的呼叫導到別的地方,讓它不起作用。因此, 只要將這個函式呼叫進去的位置還原,讓它能有原本的作用,防護就不在了。 既然偵測開圖的手段和阻擋開圖的手段都沒有用,直接偵測記憶體內容, 算得上是最釜底抽薪的作法。只要檢查一下記憶體的內容,看看是否正確。 就可以知道 Warcraft III 是否有被竄改過,就知道有沒有開圖。 我認為這是三種作法裡面最好的作法,也是反制上較為困難的作法。 不過依據實作的方式不同,還是有很容易繞過的方式。 但既然目前這個作法似乎還能夠運作,破解方式就先不講了。 -- 活著的目的是為主活 然後為主死 死亡的目的是為主死 然後為主活 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.24.61

11/12 23:51,
快推 不然人家以為我們看不懂
11/12 23:51

11/12 23:52,
我承認我電梯向下了
11/12 23:52

11/12 23:53,
看不懂~囧
11/12 23:53

11/12 23:54,
不小心按到end了
11/12 23:54

11/12 23:54,
好文推
11/12 23:54

11/12 23:56,
雖然沒有很懂 還是推一個認真
11/12 23:56

11/12 23:56,
目前坊間有用最後一種方法的嗎
11/12 23:56

11/12 23:57,
COOL
11/12 23:57

11/12 23:58,
專業文,推
11/12 23:58
-- 我實實在在的告訴你們,一粒麥子不落在地裡死了, 仍舊是一粒,若是死了,就結出許多子粒來。 約翰福音 12:24 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.24.61

11/12 23:59, , 1F
發錯板了... Orz
11/12 23:59, 1F

11/12 23:59, , 2F
YA 我變頭推
11/12 23:59, 2F

11/13 00:05, , 3F
WWW 發在主版也可以啊
11/13 00:05, 3F

11/13 00:11, , 4F
比較喜歡這邊的討論風氣 :)
11/13 00:11, 4F

11/13 00:16, , 5F
推!!
11/13 00:16, 5F

11/13 00:18, , 6F
所以game.dll 無解..
11/13 00:18, 6F

11/13 00:34, , 7F
雖然看不太懂 但有沒有可能這幾種不定時交替偵查?
11/13 00:34, 7F

11/13 00:34, , 8F
其實第三種也有漏洞可鑽....
11/13 00:34, 8F
當然有辦法,而且辦法還有很多種...

11/13 00:35, , 9F
所以確定是game.dll修改所產生的開圖囉??
11/13 00:35, 9F
大多數都是

11/13 00:44, , 10F
我可以請問一下壞模組是如何繞過的嗎
11/13 00:44, 10F
透過 reverse engineer 還是可以找到顯示的位子,再修改程式碼仍可以跳過。 不過新地圖出來如果方法有換可能就要再找一次。 not sure 要問 kloer

11/13 00:46, , 11F
被回文了好興奮 >"< 等我論文弄完也來研究好了.....
11/13 00:46, 11F

11/13 01:11, , 12F
檢查完記憶體在修改記憶體內容?
11/13 01:11, 12F

11/13 04:08, , 13F
歡迎回來
11/13 04:08, 13F

11/13 10:44, , 14F
讓她爆吧!!
11/13 10:44, 14F

11/13 12:17, , 15F
推一個 原PO幹嘛把原本PO在主板的文刪掉??
11/13 12:17, 15F
就說我貼錯板了。我本來就是要發在 WCC ,但是發文前沒檢查,就發在 WC 。 然後跑到 WCC 看,找不到自己的文章,就想說 SVC 也刪得太快了吧... 結果到 allpost 找才發現自己是貼在 WC 。 Orz... ※ 編輯: sitos 來自: 122.116.24.61 (11/13 12:37)

11/13 12:44, , 16F
推一個 但看不懂
11/13 12:44, 16F

11/13 12:54, , 17F
砍文會留屍呀 <sitos>
11/13 12:54, 17F

11/13 13:44, , 18F
MM起來!!!你是開圖專家!!!!!!!!!
11/13 13:44, 18F

11/13 13:58, , 19F
推認真
11/13 13:58, 19F

11/13 15:54, , 20F
推!
11/13 15:54, 20F

11/13 16:13, , 21F
綜觀以上說法,現在要開圖還是算困難的?還是一鍵就搞定?
11/13 16:13, 21F
只要把幾個元件包起來,就可以一鍵搞定了。

11/13 16:53, , 22F
免洗帳號這麼多 不怕你鎖 鎖了再開
11/13 16:53, 22F

11/13 21:15, , 23F
快推 不然人家以為我們看不懂
11/13 21:15, 23F

11/13 23:14, , 24F
有熱心又專業的玩家花心思來對抗作弊行為,只能推了!
11/13 23:14, 24F

11/14 00:25, , 25F
其實麥大先發在主板只是想拿P幣(誤)
11/14 00:25, 25F

11/14 01:16, , 26F
砍文會要回p幣 再加清潔費
11/14 01:16, 26F

11/14 01:50, , 27F
噫!好了!我懂了!
11/14 01:50, 27F

11/14 01:55, , 28F
所以p幣 其實虧了.XD
11/14 01:55, 28F
p 幣對我沒啥用。 ※ 編輯: sitos 來自: 122.116.24.61 (11/14 02:18)

11/14 02:46, , 29F
2000p可以買sc2試玩序號
11/14 02:46, 29F

11/14 14:00, , 30F
麥大應該有永久帳號了吧
11/14 14:00, 30F

11/14 16:36, , 31F
推~不過有點難QQ
11/14 16:36, 31F

11/14 19:19, , 32F
P幣沒有用的話施捨我吧=.= 可以買diablo的裝備唷~!
11/14 19:19, 32F

11/14 20:12, , 33F
專業推
11/14 20:12, 33F

11/17 19:33, , 34F
11/17 19:33, 34F

11/17 20:40, , 35F
好文 推 只是好多字
11/17 20:40, 35F

11/26 20:28, , 36F
11/26 20:28, 36F
文章代碼(AID): #1CtMGpfj (WarCraftChat)
文章代碼(AID): #1CtMGpfj (WarCraftChat)