修改器使用教學、記憶體讀取、瞄準輔助原理
《AssaultCube》外掛 開發基礎 快速閱讀精華
🎯 這是一份完整的 External Trainer 外部修改器 原始碼,適合想學習遊戲 外掛開發的新手 🔧 核心功能包含:無限彈藥、無敵模式、無重力、瞬移小刀、自動瞄準 等五大外掛功能 💡 使用 C++ 搭配記憶體讀寫技術,無需注入 DLL 即可修改遊戲數值 ⚠️ 本教學僅供學習用途,線上對戰使用可能導致帳號封鎖 📥 文章底部提供完整專案檔案下載點
本文章目錄
前言介紹
想學習遊戲外掛開發卻不知道從哪裡開始?《AssaultCube》作為一款經典的開源第一人稱射擊遊戲,長期以來都是外掛開發教學的首選平臺。這款遊戲的記憶體結構相對簡單,而且完全免費,非常適合用來練習 External Trainer (外部修改器)的開發技術。
這份原始碼展示瞭如何在不注入 DLL 的情況下,透過 Windows API 直接讀寫遊戲記憶體,實現各種外掛功能。對於想了解 記憶體修改器運作原理 、學習 Cheat Engine 腳本開發 ,或是研究 遊戲安全防護機制 的玩家來說,這是一份極具參考價值的學習素材。
外掛功能說明
這個 External Trainer 提供了以下五項核心功能:
功能名稱 快捷鍵 作用說明 無限彈藥 P 鍵 鎖定彈匣數量為 20 發,無需換彈 無敵模式 L 鍵 鎖定血量為 100,不會受到任何傷害 無重力 0 鍵 消除跳躍後的墜落速度,可無限浮空 瞬移小刀 9 鍵 移除小刀攻擊間隔,實現瞬間連擊 自動瞄準 M 鍵開關 / 右鍵瞄準 自動鎖定敵人頭部,平滑移動準心
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app
技術原理
這份程式碼運用了幾項關鍵的 Windows 程式設計技術:
記憶體讀寫(ReadProcessMemory / WriteProcessMemory)
透過 Windows API 直接存取目標遊戲的記憶體空間,無需將程式碼注入遊戲程序。這種方式稱為「External」外掛,相對於「Internal」內掛(DLL 注入)來說更容易被防作弊系統偵測,但開發門檻較低。
基址與偏移量(Base Address & Offsets)
遊戲重新啟動後,變數所在的記憶體位址會改變,但相對於模組基址的偏移量固定不變。程式透過 `GetModuleBaseAddress` 取得 `ac_client.exe` 的基址,再加上預先定義的偏移量,就能準確找到玩家血量、位置、角度等關鍵數值。
實體列表遍歷(Entity List Traversal)
遊戲會將所有玩家(包含敵人和隊友)儲存在一個實體列表中。程式透過讀取 `entityList` 位址,配合 `playerCount` 和 `entityLoopDistance`,逐一檢查每個實體的血量、隊伍、位置資訊,篩選出有效的敵人目標。
角度計算與平滑瞄準(Angle Calculation & Smootding)
自動瞄準功能需要計算從玩家視線到敵人頭部的角度差。程式使用三角函數計算 `yaw`(水平角度)和 `pitch`(垂直角度),並透過 `smootdingFactor`(平滑係數 0.35)讓準心移動看起來更自然,避免被一眼識破。
核心程式碼整理
以下是幾個關鍵的程式碼區塊,建議搭配原始檔案一起研究:
角度計算函式
這個函式負責計算瞄準敵人頭部所需的角度:
ANGLE CalculateAngle(const POINT3D& localHeadPos, const POINT3D& enemyHead) {
ANGLE angles{ 0.0f, 0.0f };
float deltaX = enemyHead.x - localHeadPos.x;
float deltaY = enemyHead.y - localHeadPos.y;
float deltaZ = enemyHead.z - localHeadPos.z;
float groundDistance = sqrtf(deltaX * deltaX + deltaY * deltaY);
angles.yaw = atan2f(deltaY, deltaX) * (180.0f / static_cast<float>(PI)) + 90.0f;
angles.pitch = asinf(deltaZ / sqrtf(groundDistance * groundDistance + deltaZ * deltaZ)) * (180.0f / static_cast<float>(PI));
return angles;
}
這裡使用了基本的三角函數:atan2f 計算水平偏轉角,asinf 計算垂直仰角。記得將弧度轉換為角度(乘以 180/π),並加上 90 度修正值讓角度對應遊戲的座標系。
自動瞄準核心邏輯
// 尋找視野內最近的敵人
size_t bestTargetIndex = 0;
float closestPhysicalDistance = 99999.0f;
bool targetFound = false;
for (size_t i = 0; i < enemyHeadPositions.size(); i++) {
// 計算實際距離
float dX = enemyHeadPositions.x - localHeadPos.x;
float dY = enemyHeadPositions.y - localHeadPos.y;
float dZ = enemyHeadPositions.z - localHeadPos.z;
float physicalDistance = sqrtf(dX * dX + dY * dY + dZ * dZ);
// 計算角度差
float yawDiff = anglesToEnemies.yaw - xYaw;
float pitchDiff = anglesToEnemies.pitch - xPitch;
// 標準化角度到 -180~180 範圍
while (yawDiff < -180.0f) yawDiff += 360.0f;
while (yawDiff > 180.0f) yawDiff -= 360.0f;
float angleDifference = sqrtf((yawDiff * yawDiff) + (pitchDiff * pitchDiff));
float maxFov = 17.0f; // 視野限制
// 選擇視野內最近的目標
if (angleDifference < maxFov && physicalDistance < closestPhysicalDistance) {
closestPhysicalDistance = physicalDistance;
bestTargetIndex = i;
targetFound = true;
}
}
這段程式碼展示了 FOV(Field of View)瞄準 的實作方式:只鎖定視野範圍內(17度)的敵人,並選擇距離最近的那個。這樣可以避免隔牆瞄準或是突然大角度轉身的異常行為。
平滑瞄準實作
float smootdingFactor = 0.35f;
float smootdedYaw = xYaw + (finalYawDiff * smootdingFactor);
float smootdedPitch = xPitch + (finalPitchDiff * smootdingFactor);
bypass->Write(playerBase + Yaw, &smootdedYaw, sizeof(float));
bypass->Write(playerBase + Pitch, &smootdedPitch, sizeof(float));
平滑係數 0.35 表示每次只移動目標角度的 35%,讓瞄準過程看起來像是人工操作。數值越高移動越快,但越容易被偵測;數值越低越自然,但反應較慢。
操作說明
啟動程式後,請按照以下步驟操作:
先啟動《AssaultCube》遊戲,進入任意地圖 執行編譯好的 Trainer 程式,等待顯示「Successfully hooked game process」 在遊戲中使用以下快捷鍵切換功能:
P 鍵 :無限彈藥 開/關L 鍵 :無敵模式 開/關0 鍵 :無重力 開/關9 鍵 :瞬移小刀 開/關M 鍵 :自動瞄準 開/關按住右鍵 :啟動自動瞄準(需先按 M 開啟)X 鍵 :關閉修改器並結束程式
檔案下載點
這個 External Trainer 專案包含完整的 C++ 原始碼、編譯好的執行檔,以及必要的記憶體偏移量定義檔案。建議搭配 Cheat Engine (CE修改器) 7.5 漢化版 中文版 一起研究,可以更深入瞭解記憶體結構。
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用 相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
常見問題Q&A
Q:這個修改器會被遊戲偵測到嗎?
《AssaultCube》本身沒有內建防作弊系統,所以單機練習時不會有問題。但如果連線到支援 AC(Anti-Cheat)的伺服器,External Trainer 的記憶體讀寫行為很容易被偵測到。建議只在離線模式或私人伺服器使用。
Q:為什麼自動瞄準有時候會抖動或沒反應?
這個實作使用了 17 度的 FOV 限制,如果敵人不在視野範圍內就不會鎖定。另外平滑係數 0.35 會讓瞄準速度變慢,你可以調高這個數值讓反應更快,但會增加被偵測的風險。
Q:如何找到其他遊戲的記憶體偏移量?
需要使用 Cheat Engine (CE修改器) 7.5 漢化版 中文版 進行記憶體掃描。基本流程是:先掃描已知數值(如血量 100),受傷後掃描變化數值,反覆篩選直到找到正確位址,然後觀察該位址與模組基址的相對關係。
Q:這段程式碼可以在其他遊戲使用嗎?
核心架構(記憶體讀寫、角度計算、實體遍歷)是通用的,但偏移量(Offsets)和模組名稱必須針對每款遊戲重新尋找。《AssaultCube》的開源特性讓偏移量相對穩定,商業遊戲通常會隨更新改變記憶體結構。
Q:為什麼編譯後執行會顯示「Could not find active game process」?
請確認《AssaultCube》已經啟動,而且執行檔名稱是 `ac_client.exe`。某些版本或平臺(Steam、獨立安裝)的執行檔名稱可能不同,需要修改程式碼中的 `L"ac_client.exe"` 為正確的執行檔名稱。