![]() |
發佈時間: 2025-8-25 13:51
正文摘要:《Cheat Engine》多級指標與程式碼注入 快速閱讀精華 🔑 本篇核心: 專門解決 CE 官方教學中最具挑戰性的第八關(多級指標)與第九關(程式碼注入)。🎯 第八關「多級指標」通關技巧: 目標是將會變動的數值(動態位址)鎖定為 5000。關鍵在於反覆逆向追蹤,從數值的位址一步步找出上一層的指標,直到找到不會變動的綠色靜態位址(基底位址)為止。最後手動添加指標,並將過程中記錄的偏移量 (Offset) 反向填入,即可成功指向目標數值。 ⚔️ 第九關「程式碼注入」通關技巧: 目標是在不鎖定血量的情況下,讓我方隊伍獲勝。核心是利用「結構分析」功能,找出區分我方陣營與敵方陣營的關鍵數值(例如:陣營ID)。透過「程式碼注入」寫入一小段組合語言腳本,判斷當前程式碼影響的是敵是友。如果為敵方,則直接將其血量歸零;若為我方,則不進行任何操作。 前篇: 《Cheat Engine》CE修改器 v7.6 新手教學攻略(1) 記憶體修改、指針掃描、程式碼注入,官方內建教學全破指南 https://www.game735.com/thread-434932-1-1.html 本文章目錄.article-toc { border: 1px solid #ddd; padding: 15px; background: #f9f9f9; border-radius: 6px; margin: 20px 0; width: 95%;}.toc-title { /* --- 以下是合併進來的 H2 樣式 --- */ font-size: 1.25em; /* 125% */ border-left: 5px solid #2A98DA; border-radius: 2px; padding: 5px 0px 5px 10px; font-weight: bold; margin: 0 0 15px 0; /* 調整了 margin,只留下方 15px */ color: #333; line-height: 1.5; background-color: #f8f8f8; /* --- 樣式合併結束 --- */}.toc-list { list-style: none; padding-left: 0;}.toc-list li { margin: 8px 0;}.toc-list a { color: #2A98DA; text-decoration: none;}.toc-list a:hover { text-decoration: underline;}.back-to-top { display: block; margin-top: 10px; font-size: 0.9em; color: #666;}第八關:多級指標 (Multi-level pointers) 教學document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step8_pointer';- 第一步:找出初始動態位址與第一層偏移量document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step8_part1';- 第二步:反覆追蹤,找出所有偏移量document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step8_part2';- 第三步:找到靜態位址並手動建立指標document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step8_part3';- 第四步:鎖定數值,完成挑戰document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step8_part4';第九關:程式碼注入 (Code Injection) 教學document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step9_injection';- 第一步:找出所有角色的血量位址document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step9_part1';- 第二步:利用結構分析找出陣營IDdocument.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step9_part2';- 第三步:撰寫程式碼注入腳本document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step9_part3';- 第四步:啟動腳本,贏得戰鬥document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#step9_part4';重點回顧document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#recap';Cheat Engine 進階教學常見問題Q&Adocument.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#faq'; 相信許多玩家在學習 Cheat Engine (CE) 時,前面的關卡都還算順利,但到了第八關「多級指標」和第九關「程式碼注入」時,就會開始感到頭痛。這兩關涉及了更底層的記憶體原理,需要更多的耐心和理解。 本篇教學將承接上一篇的基礎,用最白話的方式,一步步帶你拆解這兩個最核心也最困難的關卡,讓你徹底搞懂指標與程式碼注入的運作邏輯。 .video-container { position: relative; padding-bottom: 56.25%; padding-top: 30px; height: 0; overflow: hidden;}.video-container iframe,.video-container object,.video-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%;}外連至此bilibili影片連結 第八關:多級指標 (Multi-level pointers) 教學 這一關的目標是將生命值鎖定在 5000,即使按下「改變指標」按鈕,數值也不會改變。這代表我們不能只修改當前的數值位址,因為它是一個會變動的「動態位址」。我們必須找到儲存這個動態位址的「指標」,然後再往上找指標的指標,直到找到一個遊戲重啟也不會變的「靜態位址」。 第三步:撰寫程式碼注入腳本 回到反組譯器視窗,確保選在剛剛那行扣血指令上。選擇上方選單的「工具」 -> 「自動組合」(或按 Ctrl+A),選擇「模板」 -> 「代碼注入 (Code Injection)」。CE 會自動生成一個腳本框架。我們要在藍色 `originalcode:` 註解的上方插入我們的判斷邏輯。輸入以下組合語言腳本: CMP [RDI+0C],#1 JE originalcode SUB [RDI],[RDI] 複製代碼這段腳本的白話翻譯是: CMP [RDI+0C],#1:比較 [RDI+0C](也就是陣營ID)的數值是否等於 1。JE originalcode:如果等於 1(代表是我方角色),就直接跳轉(Jump if Equal)去執行原本的扣血程式碼,不進行任何修改。SUB [RDI],[RDI]:如果不等於 1(代表是敵方角色),就執行這行。這行的意思是將 [RDI](也就是敵人的血量)減去它自己,結果就是 0。 簡單來說,就是「判斷是不是自己人,不是的話就讓他血量直接變0」。點擊「檔案」 -> 「分配到目前的CT表」,將腳本儲存起來。 第四步:啟動腳本,贏得戰鬥 回到 CE 主視窗,你會在下方清單看到剛剛儲存的腳本。點擊它前面的小方框來啟用 (Active)這個腳本。現在回到遊戲中,隨意攻擊敵人,你會發現敵人的血量會瞬間歸零,而我方隊友受到攻擊時則正常扣血。輕鬆擊敗兩名敵人後,「下一步」按鈕亮起,第九關也順利通關! 《Cheat Engine》多級指標與程式碼注入 重點回顧 多級指標的精髓:核心概念就是「耐心」。透過反覆的「找寫入/存取來源 -> 複製指標位址 -> 16進位掃描」循環,直到找到綠色的靜態基底位址。最後,記得要將記錄的偏移量反向填入手動建立的指標中。 程式碼注入的關鍵:成功的關鍵在於找出判斷條件。本次範例是利用「結構分析」找到代表陣營的唯一ID。只要找到這個區分敵我的鑰匙,就能撰寫腳本,讓修改只對特定目標生效。 以下廣告滑動後還有帖子內容var custom_call_MIR = function (params) {if ( params === null || params.hasAd === false ) {var divRowSide;for (let index = 0; index < ONEADs.length; index++) {if (ONEADs[index].pub.player_mode === "mobile-inread") {divRowSide = ONEADs[index].pub.slotobj;}}var ins = document.createElement('ins');ins.className = 'clickforceads';ins.setAttribute('style', 'display:inline-block;');ins.setAttribute('data-ad-zone', '18264');divRowSide.appendChild(ins);var js = document.createElement('script');js.async = true;js.type = 'text/javascript';js.setAttribute('src', '//cdn.holmesmind.com/js/init.js');js.onload = function(){console.log('[ONEAD MIR] ClickForce Loaded');};divRowSide.appendChild(js);}};var _ONEAD = {};_ONEAD.pub = {};_ONEAD.pub.slotobj = document.getElementById("oneadMIRDFPTag");_ONEAD.pub.slots = ["div-onead-ad"];_ONEAD.pub.uid = "1000509";_ONEAD.pub.external_url = "https://onead.onevision.com.tw/";_ONEAD.pub.scopes = ["spotbuy", "speed"];_ONEAD.pub.player_mode_div = "div-onead-ad";_ONEAD.pub.player_mode = "mobile-inread";_ONEAD.pub.queryAdCallback = custom_call_MIR;var ONEAD_pubs = ONEAD_pubs || [];ONEAD_pubs.push(_ONEAD);var truvidScript = document.createElement('script'); truvidScript.async = true; truvidScript.setAttribute('data-cfasync','false'); truvidScript.type = 'text/javascript'; truvidScript.src = '//stg.truvidplayer.com/index.php?sub_user_id=597&widget_id=3309&playlist_id=2381&m=a&cb=' + (Math.random() * 10000000000000000); var currentScript = document.currentScript || document.scripts[document.scripts.length - 1]; currentScript.parentNode.insertBefore(truvidScript, currentScript.nextSibling); Cheat Engine 進階教學常見問題Q&A Q:在第八關,為什麼我一直找不到綠色的靜態位址? A:請確認每一步操作是否正確。最常見的錯誤是:1. 忘記將掃描類型切換回「十六進位」。2. 複製位址時,複製到錯誤的暫存器值(例如 ESI 而非 RSI)。3. 在「找出是誰寫入/存取」後,沒有觸發遊戲內的數值變動,導致找不到正確的指令。 Q:為什麼手動添加指標時,偏移量要反過來填寫? A:因為我們「尋找」的過程是從最終數值 -> 動態位址B -> 動態位址A -> 靜態位址,是一個逆向追蹤的過程。而我們「建立」指標時,是要讓CE從靜態位址 -> 動態位址A -> 動態位址B -> 最終數值這樣正向去讀取,所以偏移量的順序自然要反過來。 Q:在第九關,如果我在結構分析中找不到明顯的陣營ID怎麼辦? A:這種情況確實可能發生。影片中也提到有時可能不會顯示。這時就需要更多的嘗試和經驗,例如觀察其他數值(可能是0和1,或其他固定數字),或是嘗試不同的偏移量。本關卡的正確偏移量就是 `+C`,即使在結構中沒顯示,直接在腳本中使用 `[RDI+0C]` 也是可行的。 Q:程式碼注入的腳本看起來好複雜,有沒有更簡單的方法? A:程式碼注入屬於 CE 中較為進階的技巧,它能實現比單純修改數值更複雜的功能(例如無敵、一擊必殺等)。雖然需要學習一點組合語言,但它的效果也更強大且穩定。對於需要區分敵我的情況,這是最標準且有效的方法。 Q:第九關的腳本 `SUB [RDI],[RDI]` 是什麼意思? A:這是一行組合語言指令。`SUB` 代表減法。`[RDI]` 在這個情境下,可以理解為儲存著角色血量的記憶體位置。所以 `SUB [RDI],[RDI]` 的意思就是「拿血量所在的記憶體位置的值,減去它自己的值」,任何數字減去自己都會等於0,所以這行指令的效果就是將血量瞬間歸零。 |