[閒聊] 操控連線狀態的理論與實務

看板WarCraftChat作者 (麥子)時間14年前 (2010/11/07 01:11), 編輯推噓38(3806)
留言44則, 37人參與, 最新討論串1/1
先前 Warcraft 板聚,很感謝大家願意看我玩很多人可能沒興趣的東西, 但我相信忽視事實永遠不會比了解事實讓我們更能妥善地去面對這些。 不論你是支持也好,反對也好,或者是覺得根本無所謂,了解後才能選擇自己的立場。 首先,談到操控連線狀態,也許在心頭浮現的是,這是個什麼東西? 相對於遊戲當中遇到開圖或者是傳送金錢的玩家,操控連線的作弊方式, 顯然更不容易被察覺,也幾乎沒有反制之道。然而使用得當的話, 對於遊戲造成的不公平程度,恐怕也不亞與妥善使用開圖程式的使用者。 但是,不能察覺的作弊方式,不代表不存在,也不代表沒有人使用。 所謂的連線操控,我自己給的廣義定義,就是藉由各種手段, 改變主機與其它玩家之間的連線狀態,從而影響玩家對於遊戲中角色的操作, 以達到干擾或破壞對方戰略、戰術及戰鬥的作弊方式。 通常可以在應用程式層或者是系統層達到特定操控目的的效果。 連線可以有各式各樣不同的方式,而在 Warcraft III 當中主要造成的影響有三類。 斷線、延遲或者是讀秒。以下將先簡介 Warcraft III 的連線方式, 再接著介紹不同的操控連線方式如何造成上述三種不同的效果。 在 Warcraft III 的遊戲進行當中,每一個使用者都會有自己一份遊戲狀態。 所有使用者的操作動作都會傳送到主機,再由主機配發給每一個使用者。 再接收到配發回來的動作後,每個使用者的 Warcraft III 會依據先前的遊戲狀態, 搭配新收到的操作動作,計算出下一時間的遊戲狀態。由於所有的使用者, 初始的遊戲狀態相同,且收到每一步的操作也都相同,因此可計算出相同的狀態。 一旦任何一個使用者或者主機,發現某一個動作是無法被操作的, 那就代表這個使用者跟主機之間遊戲狀態不一致, Warcraft III 將無法繼續運算, 因此使用者與主機之間的連線就會斷開,進而造成斷線。 因此若是用遊戲修改大師之類的軟體直接修改本機遊戲狀態, 例如鎖定血量之類,事實上並沒有效果。因為當這個角色因為鎖血而活在本機, 在其它人的遊戲狀態裡面,它早已因為被攻擊而死,一旦該角色再進行動作, 其它的 Warcraft III 將會發現這個角色已經死亡,不應再進行動作,而造成斷線。 因此,同步化遊戲狀態的工作,有賴於主機定時將所有玩家的動作, 轉傳給所有玩家,唯有每一個人都能收到一樣的遊戲指令,才能確保遊戲正確進行。 也因此,每一個 Warcraft III 上面的遊戲狀態,完全取決於收到的動作指令。 因此,只要操作主機送出動作指令的封包,就可以直接操縱玩家遊戲狀態的進行。 第一、若是主機直接對特定玩家的連線,關閉其網路端口(socket), 即會直接造成該玩家斷線,這也就是俗稱的踢人程式。要達成這個目標, 方法其實有很多種。即使不使用專為 Warcraft III 設計的外掛, 也可以透過防毒軟體或防火牆,關閉特定的連線而達到相同的效果。 只是不為 Warcraft III 設計的外掛,通常沒有玩家 ID 與連線的對應, 除了亂猜以外,使用者只能夠自行想辦法判斷哪一個連線是哪一個玩家。 第二、若是主機不中斷連線,但是也不把應該要送給玩家的封包送出, 那麼玩家將會收不到遊戲中的動作。因此,遊戲的狀態就無法繼續, 在這樣的情況下, Warcraft III 會暫停遊戲的進行,以等待必須收到的封包。 而對玩家而言,顯示出來的行為就是開始讀秒。若是 45 秒內未收到封包, 則玩家可自行決定中止遊戲的進行。 第三、若是主機仍送出封包,但是故意延遲送出。玩家的遊戲狀態的同步就會較晚。 簡言之,玩家若是總是收到三秒前的封包,那麼就只能計算出三秒前的遊戲狀態, 自己送出的動作,也會在三秒後才收到,產生的效果就是讓使用者感到延遲。 值得注意的是,若是採用此法,由於原本的玩家和主機之間的遊戲狀態是同步的, 如果突然將所有封包都延遲三秒送出,會讓玩家的遊戲有三秒的停頓, 且在三秒停頓後所有的動作都會延遲三秒,可能成為可供辨識的特徵。 因此在實作時,應該將延遲送出的時間慢慢增加,以減少突然停頓的狀況, 避免其它玩家懷疑主機使用外掛造成額外的延遲。 在實作方面,最簡單的實作方式,就是透過勾載(hook) Warcraft III 的 send 函式, 在裡面進行關閉連線、阻檔連線或延遲連線的動作。首先,關閉連線是最容易實作的, 直接將該 socket 關閉即可。阻檔連線與延遲連線,都有可能之後恢復正常的連線, 因此仍必須保持玩家與主機間遊戲狀態的一致性。因此,只要是尚未送出的封包, 都應該先另行儲存,之後再依序送出,以確保依序正確地傳送指令。 在這個原則下,阻檔連線就是簡單地停止傳送封包,而延遲連線則是每個封包, 都延遲一段時間再送出,即可達到先前所提的改變連線狀態的效果。 剩下的問題只有,我們如何分辨哪一個連線是對應到哪一個使用者。 最簡單的作法是用特定的字串辨別連線。當 Warcraft III 在遊戲中送出訊息時, 主機只會把訊息送給有需要收到的人,因此直接送出特定字串, 就可以在 send 時找到對應的連線,從而改變連線的狀態, 優點是實作相當容易,缺點會在 replay 當中留下痕跡。 使用鍵入 bye 來中斷的程式即是故意採用這樣的方式,以避免作弊程式的濫用。 而其它真正以操作連線為手段,為達成改變戰局目的的操控連線, 都是直接在本機端進行連線的操作。可能透過其它的圖型介面來選擇連線。 此時就必須要把使用者的 ID 和連線進行對應。這個對應可以透過觀察連線, 在使用者加入遊戲時傳送的使用者 ID 和新增的連線來進行對應。 由於 Warcraft III 內部會給每一個連入的使用者一個編號, 在有新使用者加入時,主機會將該使用者的編號和 ID 一起傳給其它玩家, 因此只要記住編號和新產生的連線的對應,即可對應 ID 與連線。 此一編號的編碼原則,可以想像成總共有一排坐位, 先進來的玩家就依續從前面坐起,然而若有人離開,原本已經有坐位的不會移動。 而再有新進玩家時,會優先填補前面的空缺,而不是從有人的坐位後一個開始坐起。 掌握這個原則,即可簡單地找到連線、編號與 ID 之間的對應。 有了對應以後,只要讓使用者透過圖型介面選取 ID ,再對相應的連線作處理, 即可達成針對特定使用者改變其連線狀態的效果。 實際應用方面,可以針對對方強勢的後期英雄,採取延遲連線的攻擊, 導致對方無法精確控制英雄而居於劣勢。或者是針對不喜歡的玩家, 不時阻檔其連線造成讀秒,使得其它玩家希望他退出遊戲。 或者是在玩家角色死亡後踢除,造成因為被殺而中離的假象。 只要搭配適當的遊戲情境,確保多數人的連線暢通,即可避免被懷疑使用外掛。 在現階段而言,仍然可以算是相當強勢的作弊方式,唯一的限制是只有主機能用, 但優勢在於,幾乎沒有任何可能的阻止方法。因為同樣的現象也可能因網路品質不良, 而產生斷線、讀秒與延遲的後果,無法準確地判斷是否由外掛造成。 然而使用外掛者卻能精確控制所需的效果,偽裝成網路或遊戲平台的問題。 唯一的自保之道,恐怕就是不要加入別人的房間,由自己或朋友開房最好。 -- 我實實在在的告訴你們,一粒麥子不落在地裡死了, 仍舊是一粒,若是死了,就結出許多子粒來。 約翰福音 12:24 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.24.61

11/07 01:24, , 1F
11/07 01:24, 1F

11/07 01:27, , 2F
11/07 01:27, 2F

11/07 01:29, , 3F
11/07 01:29, 3F

11/07 01:41, , 4F
加入LOL
11/07 01:41, 4F

11/07 01:55, , 5F
11/07 01:55, 5F

11/07 01:57, , 6F
11/07 01:57, 6F

11/07 02:10, , 7F
大推!!!
11/07 02:10, 7F

11/07 03:52, , 8F
11/07 03:52, 8F

11/07 04:02, , 9F
11/07 04:02, 9F

11/07 13:50, , 10F
麥子大 不愧是台大資工的 好厲害!
11/07 13:50, 10F

11/07 14:44, , 11F
跟我以前猜的一樣 ....
11/07 14:44, 11F

11/07 14:51, , 12F
跟我以前夢的一樣 ....
11/07 14:51, 12F

11/07 15:41, , 13F
推!!
11/07 15:41, 13F

11/07 16:22, , 14F
快推 不然別人會以為我看懂
11/07 16:22, 14F

11/07 16:24, , 15F
太神了, 膜拜 m_O_m
11/07 16:24, 15F

11/07 17:05, , 16F
快推 不然別人以為樓下看不懂
11/07 17:05, 16F

11/07 17:43, , 17F
屋挖 置底了
11/07 17:43, 17F

11/07 18:29, , 18F
快推 不然別人以為我看不懂
11/07 18:29, 18F

11/07 18:41, , 19F
我以為我在看paper...XD
11/07 18:41, 19F

11/07 18:55, , 20F
麥~神~
11/07 18:55, 20F

11/07 21:29, , 21F
140.112 !!
11/07 21:29, 21F

11/07 23:58, , 22F
關鍵字:只有主機能用,所以跟主機一隊就對了
11/07 23:58, 22F

11/08 00:29, , 23F
麥~神~
11/08 00:29, 23F

11/08 01:39, , 24F
來PK五子棋
11/08 01:39, 24F

11/08 01:53, , 25F
快推 不然別人會發現我看不懂XD
11/08 01:53, 25F

11/08 04:17, , 26F
kloer:太神了, 膜拜 m_O_m
11/08 04:17, 26F

11/08 05:37, , 27F
小資工推 膜拜 根本就神 囧
11/08 05:37, 27F

11/08 09:08, , 28F
有老熊推
11/08 09:08, 28F

11/08 09:08, , 29F
其實我當三國主機時經常會想踢隊友 踢了反而容易贏
11/08 09:08, 29F

11/08 09:09, , 30F
同樣的, os ai少一隻, 勝率就高了不只20%
11/08 09:09, 30F

11/08 09:29, , 31F
11/08 09:29, 31F

11/08 11:22, , 32F
11/08 11:22, 32F

11/08 15:29, , 33F
其實已經有了 殺中前先讓他lag 對面怎麼死的都不知道XD
11/08 15:29, 33F

11/08 15:38, , 34F
快推 不然別人以為我看不懂
11/08 15:38, 34F

11/08 19:41, , 35F
這種文好像之前有被拿出來討論過了,結論我是主機我超強
11/08 19:41, 35F

11/08 20:20, , 36F
可以請問一下 如果我想了解這方面的知識 有沒有推薦
11/08 20:20, 36F

11/08 20:20, , 37F
甚麼書或網站?(好像有點籠統@@)
11/08 20:20, 37F

11/09 13:10, , 38F
回樓上, 首先要有紮實的程式基本功, 沒有的話學不起來
11/09 13:10, 38F

11/09 15:48, , 39F
阿!?假如我說我有,那你肯告訴我嗎?
11/09 15:48, 39F
我個人的話,是沒有特別看什麼書,網站的話就一般 google 搜得到的那些。 你想要查什麼,就丟進去查,通常資訊也不會有什麼系統,得慢慢拼湊。 很多時候拼湊出來的資訊也不怎麼對,剩下的就是苦工了。

11/09 19:12, , 40F
推一個!!
11/09 19:12, 40F
※ 編輯: sitos 來自: 122.116.24.61 (11/09 22:38)

11/09 23:44, , 41F
不想寫程式的話 可以建議先從Cheat Engine開始練起
11/09 23:44, 41F

11/10 00:45, , 42F
謝謝sitos大
11/10 00:45, 42F

11/20 21:44, , 43F
標題好像某堂課名
11/20 21:44, 43F

11/22 23:44, , 44F
有看有推
11/22 23:44, 44F
文章代碼(AID): #1CrOnB4L (WarCraftChat)
文章代碼(AID): #1CrOnB4L (WarCraftChat)