跳至主要內容

Cheat Engine 指標掃描:找出重啟遊戲後依然有效的位址

Cheat-Engine.net 作者:Cheat-Engine.net 閱讀需 9 分鐘 25 次瀏覽

為什麼每次重啟遊戲位址都會改變、多層指標如何運作,以及如何使用指標掃描、指標地圖與重新掃描,建立能持續有效的項目。

你找到了生命值,存進 CE 修改表 (Cheat Table),重啟遊戲後,項目卻顯示 ?? 或一個隨機數字。這不是你的錯。大多數遊戲數值每次執行時都位於不同的位址。指標就是從一個不會移動的起點通往該數值的路徑,而 Cheat Engine 的指標掃描器就是幫你找出這類路徑的工具。

本指南假設你已經會用 First Scan 和 Next Scan 找出數值;如果還不會,請先閱讀Cheat Engine 新手教學。請只在單人和離線遊戲中使用這些技巧,並且在實驗前先備份你的存檔。

為什麼位址在重啟後會改變

遊戲的大部分資料都是在執行時建立的。載入關卡時,遊戲會向系統要求一塊記憶體給玩家物件,另一塊給道具欄,依此類推。這稱為動態配置,每個區塊最後落在哪裡,取決於之前還配置了什麼,而這在每次執行甚至每個載入畫面之間都不同。你的生命值儲存在玩家物件內的固定位置,但玩家物件本身會移動。

此外,基於安全考量,Windows 會以不同的基底位址載入程式及其模組(主執行檔和它的 DLL)。這就是為什麼穩定的位址總是以模組為基準來寫,例如 "game.exe"+01A2B3C0,而不是一個純數字。

在掃描結果清單中,Cheat Engine 會以綠色顯示屬於某個模組的位址。這些是靜態位址:每次執行時它們在模組內的偏移量都相同。黑色位址則是動態的。你在意的大部分數值都是動態的。

多層指標如何運作

指標其實就是存放著某個位址的數值。遊戲裡到處都是指標:全域的「遊戲管理器」存著世界的位址,世界存著玩家的位址,玩家存著屬性區塊的位址,而屬性區塊在偏移量 18 的位置存放生命值。從靜態起點沿著這樣的鏈走下去,無論物件被配置在哪裡,最終都會落在該數值目前的位址。

"game.exe"+01A2B3C0   read the 8-byte address stored here  (level 1)
  + 10                read the address stored here         (level 2)
  + 18                this is the health value

Cheat Engine 以括號表示法將同一條路徑寫成 [["game.exe"+01A2B3C0]+10]+18:每一對括號代表「讀取存放在此處的位址」。偏移量為十六進位。只有一個偏移量的路徑是單層指標;大多數實際遊戲需要兩到五層。

步驟 1:找出數值目前的位址

照常找出數值並加入位址清單。請確認類型正確,因為指標項目會沿用該類型;如果你不確定生命值是 4 Bytes 還是 Float,數值類型指南可以幫上忙。修改該位址並確認遊戲中有出現變化,以驗證位址正確。

步驟 2(選用):查看是什麼存取了該位址

在項目上按右鍵,選擇 Find out what accesses this address 或 Find out what writes to this address。Cheat Engine 會附加其偵錯器,並在你遊玩時列出接觸該數值的指令。典型的結果看起來像 movss [rbx+18],xmm0 或 mov [rcx+18],eax。括號內的數字,這裡是 18,就是該數值在其物件內的偏移量,而暫存器(rbx 或 rcx)在那一刻存放著物件的位址。選取指令並開啟詳細資訊就能看到暫存器的值。

這是手動追蹤指標的方法:你把物件的位址當成 8 位元組的十六進位數值去掃描,找出是誰指向它,然後對每一層重複這個動作。內建的 Cheat Engine 教學就是這樣教指標的,值得做一次來理解概念。請注意,附加偵錯器可能會讓某些遊戲不穩定;嘗試前請先存檔。

你在這裡找到的指令,也是程式碼注入腳本的起點,這是指標之外的另一種做法,Auto Assembler 基礎指南中有介紹。

步驟 3:執行指標掃描

手動處理每一層很慢,所以 Cheat Engine 可以自動搜尋所有可能的路徑。在項目上按右鍵,選擇 Pointer scan for this address。設定對話框有很多選項;重要的有:

  • Address to find:會填入你的項目的位址。
  • Maximum offset value:每個偏移量可以多大。預設值是不錯的起點;只有在掃描找不到任何東西時才調高。
  • Max level:要搜尋多少層深。層數越高找到的路徑越多,但耗時長得多,產生的結果也多得多。建議從 5 左右開始。

按下 OK,選擇儲存結果的位置(一個 .PTR 檔加上輔助檔案),然後等待。第一次掃描可能產生數十萬甚至數百萬條候選路徑。其中大部分只是巧合,只在這次遊戲階段有效。接下來的步驟會把它們剔除。

步驟 4:重啟遊戲後重新掃描

這個步驟才是讓指標掃描真正發揮作用的關鍵。

  1. 保持指標掃描視窗開啟,或之後從指標掃描器的選單重新開啟已儲存的 .PTR 檔。
  2. 完全關閉遊戲再重新啟動。載入存檔。
  3. 再次附加 Cheat Engine,並用一般掃描找出數值的新位址。
  4. 在指標掃描視窗中開啟其選單並選擇重新掃描選項。輸入新位址作為要尋找的位址並確認。

Cheat Engine 會用新的執行狀態檢查每一條儲存的路徑,只保留現在能通往新位址的路徑。重複兩到三次,最好有所變化:不同的存檔、不同的關卡,並且至少有一次是在重新開機之後。每一輪都會剔除只是碰巧有效的路徑。當數值已知且很有辨識度時,你也可以改用數值而不是位址來重新掃描。

指標地圖:更聰明的掃描

指標地圖是遊戲記憶體中所有指標在某一時刻的快照,並儲存到硬碟。你可以在遊戲執行時,從位址清單的右鍵選單產生一份,並記錄該次階段中數值的位址。之後在指標掃描設定中,你可以改用已儲存的指標地圖而不是即時記憶體來掃描,並與其他已儲存的地圖比對,每份地圖都搭配該次階段中數值的位址。

好處是你可以先從多次遊戲階段收集地圖,再合併到一次掃描中,不需要在緩慢的過程中一直開著遊戲。最終得到的是與一連串重新掃描相同類型的篩選清單,而且通常更快。

步驟 5:選擇結果並加入修改表

結果清單會顯示 Base Address 欄,例如 "game.exe"+01A2B3C0,接著是每個偏移量各一欄,以及該路徑目前指向的位址。在倖存的結果中挑選時,建議優先選擇:

  • 起點在遊戲主執行檔或其主要引擎模組的路徑;
  • 層數較少、較短的路徑;
  • 通過最多種不同重新掃描的路徑。

雙擊結果即可將其加入位址清單。該項目的位址會帶有 P-> 前綴,表示它是指標。請檢查其類型;指標掃描的項目預設為 4 Bytes,所以如果你的數值需要,請改成 Float 或其他類型。給它一個清楚的描述,然後儲存修改表。

你也可以手動輸入指標:使用按鈕手動新增位址,勾選 Pointer 選項,在基底位址欄位填入模組和偏移量(例如 "game.exe"+01A2B3C0),並為每個偏移量新增一個欄位。輸入時 Cheat Engine 會顯示每一層解析出的位址,讓錯誤很容易被發現。請注意該對話框中偏移量欄位的順序:最先套用的偏移量緊鄰基底位址。

指標的限制

好的指標能撐過重啟,但不一定能撐過遊戲更新。開發者發布修正檔後,靜態基底位址和偏移量可能會改變,你就需要重新掃描。保留你的 .PTR 檔和筆記,才能快速重做。另外也要小心有多份副本的數值,例如隊伍中每個角色的屬性;路徑可能會指向最先被選取的那個角色。

總結

  1. 找出數值並確認。
  2. 可選擇使用偵錯器查看哪些指令存取了它。
  3. 以適中的層數和偏移量設定執行指標掃描。
  4. 重啟遊戲、找出新位址、重新掃描。用不同的遊戲階段重複。
  5. 挑選一條短而一致的路徑,以正確的類型加入修改表,然後儲存。

留言

0
回覆給

不會公開顯示。

留言需經版主審核後才會顯示。

尚無留言

成為第一個分享想法的人吧。