搜尋

特戰英豪《特戰英豪》ValorantValorant遊戲修改器

返回清單
切換到指定樓層
通知這文章過時或找檔案 發表主題

[電玩遊戲] 《特戰英豪》Valorant Reversal、Structs and Offsets 逆向分析與偏移資料整理 記憶體結構整理、SDK偏移、FName解密與角色名稱提取

[複製連結]
1
STEAM ( Lv.30 大天使 ) 發表於 昨天 21:40 | 只看該作者 回覆獎勵 |降序瀏覽 |閱讀模式

快速閱讀精華



  • 🔍 這篇文章整理了《特戰英豪》Patch 12.07 的 核心記憶體偏移(Offsets)與結構(Structs),適合想要深入研究遊戲引擎層的開發者與逆向工程愛好者
  • 🛡️ 所有偏移已驗證支援 HVCI(Hypervisor-Protected Code Integrity)開啟狀態,但請注意:本文資料已標示為 OUTDATED,Patch 12.08 更新即將推出
  • 💡 涵蓋主題包括 GWorld 定位、FName 解密演算法、角色 ESP 名稱提取、骨骼矩陣、武器系統、炸彈邏輯 等關鍵模組
  • ⚠️ 重要提醒:本文僅供技術研究與學習用途,實際應用於線上遊戲可能觸犯服務條款並導致帳號永久停權


前言介紹



想要深入理解《特戰英豪》的運作原理嗎?這款由 Riot Games 開發的戰術射擊遊戲採用 Unreal Engine 5 打造,其底層記憶體結構與偏移資訊對於模組開發、資料分析或單機環境的技術研究都極具參考價值。

我們整理了來自社羣的最新 Patch 12.07 偏移資料,包含從 世界座標定位到角色骨骼矩陣的完整資訊。無論你是想理解 UE5 的記憶體佈局,或是研究 Vanguard 反作弊系統的防護機制,這份筆記都能幫你快速找到關鍵入口點。

【重要提醒】
這份資料目前標示為 OUTDATED(過期),Patch 12.08 的更新版本即將釋出。使用過期偏移可能導致程式崩潰或無法正確讀取記憶體。建議在實際應用前,先確認遊戲版本與偏移資料的對應關係。


核心引擎偏移(Core Engine Offsets)



UE5 引擎的幾個關鍵全域指標,是定位遊戲世界的起點:

GWorld = 0xC1AD2A0
FNamePool = 0xC34B800
FNameState = 0xC536280
FNameKey = 0x40 // FNameState + 0x40
ProcessEvent = 0x1B74230
FMemoryMalloc = 0x1747C10
TriggerVeh = 0x177F496
StaticFindObject = 0x1BA05C0
StaticLoadObject = 0x1BA40F0

【小知識】UE5 與 UE4 最大的差異之一:Vector 與 Rotator 等結構改為使用 double(雙精度浮點數)而非 float,這在整理記憶體時需要特別注意資料型態的對齊方式。


關鍵函式偏移(Key Functions)



這些函式偏移對於理解遊戲內部的運算邏輯至關重要:

BoneMatrix = 0x40EBC10
SetOutlineMode = 0x407F040
GetSpreadValues = 0x62DEAA0
GetSpreadAngles = 0x6F04280
GetFiringLoc = 0x6AA7A30
VecNormalize = 0x1847290
AngleNormalize = 0x1841A90
PlayFinisher = 0x62424D0


世界與關卡結構(World & Level)



理解世界層級的記憶體佈局,有助於追蹤遊戲中的動態實體:

PersistentLevel = 0x0038
GameState = 0x0178
Levels = 0x0190
OwningGameInstance = 0x01D8
ClientGameInstance = 0x02B8


玩家與角色結構(Player & Actor)



這是實作 ESP(透視輔助)與角色資訊顯示的核心基礎:

ActorArray = 0x00A0
LocalPlayer = 0x0040
PlayerController = 0x0038
AcknowledgedPawn = 0x0510
PlayerState = 0x0480
PawnPrivate = 0x04E0
TeamComponent = 0x06A0
CameraManager = 0x0520
CameraCachePriv = 0x20A0
ControlRotation = 0x04E0
RootComponent = 0x0288
RelativeLocation = 0x0170
RelativeRotation = 0x0188
RelativeScale3D = 0x01A0
ComponentVelocity = 0x01B8
DamageHandler = 0x0C68
BlindManager = 0x0A28
BoundsScale = 0x047C
LastSubmitTime = 0x0480 // BoundsScale + 0x4
LastRenderTime = 0x0484 // LastSubmitTime + 0x4


玩家狀態與 ESP 額外資訊(PlayerState & ESP Extras)



PlayerID = 0x0460
Ping = 0x0464
PlatformPlayer = 0x0698
SpectatedPlayer = 0x06F0
HideAccountLevel = 0x0758
AccountLevel = 0x075C
CompetitiveTier = 0x0760
WasInvisible = 0x0F52 // 例如:夜殼終極技能
WasIntangible = 0x0F53 // 例如:芮娜的潰散
WasAlly = 0x0F58


戰鬥與傷害邏輯(Combat & Damage Logic)



CachedLife = 0x0200
bAlive (Damageable) = 0x01F9
DamageSections = 0x01E8
Life (Section) = 0x0124
MaxLife (Section) = 0x0128
bAlive (Section) = 0x0120
LocalBlindState = 0x0118
GunRecoveryTime = 0x1B90 // UStabilityComponent
Stability_Mobile = 0x1108 // AGun_C


武器、庫存與外觀(Weapon, Inventory & Cosmetics)



Inventory = 0x0C08
CurrentEquippable = 0x0248
EquippableModels = 0x00E8
TotemModels = 0x0338
CharmMap = 0x0438
SkinDataAsset = 0x0FB0
CharmDataAsset = 0x0FD8
CosmeticRandomSeed = 0x1060
AttachName = 0x0FFC // RightHandWeaponAttachName


骨骼與網格(1P/3P)(Bones & Mesh)



ComponentToWorld = 0x02D0
MeshComponent = 0x04E8
BoneArray = 0x0738
BoneCount = 0x0740 // BoneArray + 0x8
BoneArrayCache = 0x0748 // BoneArray + 0x10
bForceWireframe = 0x0906
Mesh1P (AresEquip) = 0x0DD8
Mesh3P (AresEquip) = 0x0DE8
Mesh1P (Character) = 0x0F30
MeshOverlay1P = 0x0F38
Mesh3PMIDs = 0x0F80
Mesh1PMIDs = 0x0F90
Mesh1POverlayMIDs = 0x0FA0
ProcMeshBodySetup = 0x06E8


炸彈邏輯(Spike / Bomb Logic)



BombTimeRemaining = 0x05A8
PlantedAtSite = 0x05B8
BombDefused = 0x05B9
DefuseProgress = 0x05D0


遊戲設定與介面(Game Settings & UI)



GameUserSettings = 0x0320
AresSettingsManager = 0x0200
bUseVSync = 0x0030
ResolutionSizeX = 0x0090
ResolutionSizeY = 0x0094
FloatSettingValues = 0x0330
IntSettingValues = 0x0380
BoolSettingValues = 0x03D0
StringSettingValues = 0x0420


技能範圍繪製(Drawing Abilities Bounds)



在 UObject 迴圈中,過濾相關實體後可使用以下方法繪製技能範圍:

template<typename T>
T* AActor::GetChildComponentByClass(UClass* class_)
{
    return Mem::CallVirtual<T*, 232>(tdis, class_);
}

// define tdese by just using find object.
USphereComponent::StaticClass() // Engine.SphereComponent
Engine.SphereComponent.GetScaledSphereRadius() // Engine.SphereComponent.GetScaledSphereRadius
UBoxComponent::StaticClass() // Engine.BoxComponent
UBoxComponent::GetScaledBoxExtent() // Engine.BoxComponent.GetScaledBoxExtent
AActor::GetLocation() // Engine.Actor.K2_GetActorLocation
AActor::GetRotation() // Engine.Actor.K2_GetActorRotation

auto sphereComponent = actor->GetChildComponentByClass<USphereComponent>(USphereComponent::StaticClass());

if (sphereComponent)
{
    FVector origin = actor->GetLocation();
    float radius = sphereComponent->GetScaledSphereRadius();
    DrawSphereOutline(origin, radius, Color_t(0, 255, 0, 150), 48);
}

auto boxComponent = actor->GetChildComponentByClass<UBoxComponent>(UBoxComponent::StaticClass());

if (boxComponent)
{
    FVector origin = actor->GetLocation();
    FRotator rotation = actor->GetRotation();
    FVector extent = boxComponent->GetScaledBoxExtent();
    DrawBoxOutline(origin, extent, rotation, Color_t(0, 255, 0, 150));
}


FName 解密演算法(FName Decryption)



Patch 12.07 更新了文字加密機制,以下是支援 HVCI 的新版解密實作:

uint64_t decrypt_xor_keys(const uint32_t key, const uint64_t* state)
{
    const uint64_t hash = 0x2545F4914F6CDD1DULL * (key ^ ((key ^ (key >> 15)) >> 12) ^ (key << 25));
    const uint64_t idx = hash % 7;
    uint64_t val = state[idx];
    const uint32_t hi = (uint32_t)(hash >> 32);
    const uint32_t m7 = (uint32_t)idx % 7;

    auto lfsr1 = [](uint64_t x) -> uint64_t {
        return (x >> 1) ^ ((x >> 1) ^ (2 * x)) & 0xAAAAAAAAAAAAAAAAULL;
    };

    auto bitrev_ror32 = [&](uint64_t x) -> uint64_t {
        uint64_t a = lfsr1(x);
        uint64_t b = (a >> 2) ^ ((a >> 2) ^ (4 * a)) & 0xCCCCCCCCCCCCCCCCULL;
        uint64_t c = (b >> 4) ^ ((b >> 4) ^ (16 * b)) & 0xF0F0F0F0F0F0F0F0ULL;
        uint64_t d = (c >> 8) ^ ((c >> 8) ^ (c << 8)) & 0xFF00FF00FF00FF00ULL;
        return _rotr64(d, 32);
    };

    auto rotr63 = [](uint64_t x, uint32_t r) -> uint64_t {
        uint8_t s = (uint8_t)(r % 0x3F) + 1;
        return (x >> s) | (x << (64 - s));
    };

    if (m7 == 0) {
        val = bitrev_ror32(lfsr1(bitrev_ror32(val)));
    }
    else if (m7 == 1) {
        val = rotr63(~val, hi + (uint32_t)idx);
    }
    else if (m7 == 2) {
        val = ~(uint64_t)(uint32_t)(hi + (uint32_t)idx) ^ (val - (uint32_t)(hi + 2 * (uint32_t)idx));
    }
    else if (m7 == 3) {
        val = ~rotr63(val, hi + 2 * (uint32_t)idx);
    }
    else if (m7 == 4) {
        val = ~bitrev_ror32(val);
    }
    else if (m7 == 5) {
        val = lfsr1(~val);
    }
    else {
        val = (uint32_t)(hi + (uint32_t)idx) + bitrev_ror32(val);
    }

    return val ^ key;
}


角色名稱提取與 ESP(Agent Name Extraction / ESP)



透過 KismetSystemLibrary 取得物件名稱,再對應到正確的角色字串:

取得物件名稱函式:

FString get_object_name(UObject* obj)
{
    auto function_name = (L"Engine.KismetSystemLibrary.GetObjectName");
    static UObject* functions;
    if (!functions)
        functions = UObject::StaticFindObject(nullptr, nullptr, function_name, false);

    struct
    {
        UObject* obj;
        FString out;
    } Args;

    Args.obj = obj;
    functions->ProcessEvent(static_class(), functions, &Args);
    return Args.out;
}


角色對應表:

FString CharacterName(FString in)
{
    if (in.ToString().find("Training") != std::string::npos) return FString(L"Bot Lobby");
    if (in.ToString().find("BountyHunter_PC_C") != std::string::npos) return FString(L"Fade");
    if (in.ToString().find("Stealtd_PC_C") != std::string::npos) return FString(L"Yoru");
    if (in.ToString().find("Pandemic_PC_C") != std::string::npos) return FString(L"Viper");
    if (in.ToString().find("Hunter_PC_C") != std::string::npos) return FString(L"Sova");
    if (in.ToString().find("Guide_PC_C") != std::string::npos) return FString(L"Skye");
    if (in.ToString().find("Thorne_PC_C") != std::string::npos) return FString(L"Sage");
    if (in.ToString().find("Vampire_PC_C") != std::string::npos) return FString(L"Reyna");
    if (in.ToString().find("Clay_PC_C") != std::string::npos) return FString(L"Raze");
    if (in.ToString().find("Phoenix_PC_C") != std::string::npos) return FString(L"Phoenix");
    if (in.ToString().find("Wraitd_PC_C") != std::string::npos) return FString(L"Omen");
    if (in.ToString().find("Sprinter_PC_C") != std::string::npos) return FString(L"Neon");
    if (in.ToString().find("Killjoy_PC_C") != std::string::npos) return FString(L"Killjoy");
    if (in.ToString().find("Grenadier_PC_C") != std::string::npos) return FString(L"Kayo");
    if (in.ToString().find("Terra_PC_C") != std::string::npos) return FString(L"Waylay");
    if (in.ToString().find("Cashew_PC_C") != std::string::npos) return FString(L"Tejo");
    if (in.ToString().find("Wushu_PC_C") != std::string::npos) return FString(L"Jett");
    if (in.ToString().find("Gumshoe_PC_C") != std::string::npos) return FString(L"Cypher");
    if (in.ToString().find("Deadeye_PC_C") != std::string::npos) return FString(L"Chamber");
    if (in.ToString().find("Sarge_PC_C") != std::string::npos) return FString(L"Brimstone");
    if (in.ToString().find("Breach_PC_C") != std::string::npos) return FString(L"Breach");
    if (in.ToString().find("Rift_TargetingForm_PC_C") != std::string::npos) return FString(L"Astra");
    if (in.ToString().find("Rift_PC_C") != std::string::npos) return FString(L"Astra");
    if (in.ToString().find("Mage_PC_C") != std::string::npos) return FString(L"Harbor");
    if (in.ToString().find("AggroBot_PC_C") != std::string::npos) return FString(L"Gekko");
    if (in.ToString().find("Cable_PC_C") != std::string::npos) return FString(L"DeadLock");
    if (in.ToString().find("Sequoia_PC_C") != std::string::npos) return FString(L"Iso");
    if (in.ToString().find("Smonk_PC_C") != std::string::npos) return FString(L"Clove");
    if (in.ToString().find("Nox_PC_C") != std::string::npos) return FString(L"Vyse");
    return FString(L"");
}


相關資源下載 🔽





所有站內附件皆會附上安全掃描報告
請會員查看純淨度百分比後判斷使用



相關檔案須知:
取得檔案前,請先詳細閱讀文章內容
避免不必要錯誤與誤會發生。
也可多參考文章討論樓層內容
了解附件檔案相關討論資訊。





常見問題Q&A



Q:這些偏移資料還能用嗎?
A:目前標示為 OUTDATED,Patch 12.08 更新後多數偏移會失效。建議等待新版資料釋出,或自行使用記憶體掃描工具重新定位。

Q:什麼是 HVCI,為什麼要特別提到它?
A:HVCI(Hypervisor-Protected Code Integrity)是 Windows 的一項核心防護機制,Vanguard 反作弊系統會利用它來保護遊戲記憶體。偏移驗證「HVCI ON」表示在最高防護等級下仍能正確讀取。

Q:UE5 的 double 跟 UE4 的 float 差在哪?
A:Unreal Engine 5 將 FVector、FRotator 等結構的數值型態從 32 位元 float 改為 64 位元 double,這意味著記憶體中每個分量佔用 8 bytes 而非 4 bytes,整理時需要調整資料結構定義。

Q:FName 解密失敗怎麼辦?
A:首先確認遊戲版本是否為 Patch 12.07。加密機制每個版本可能變動,過期的解密演算法會產生亂碼或導致程式崩潰。建議追蹤社羣更新或自行分析新的加密流程。

Q:這些技術可以應用在實戰中嗎?
A:強烈不建議。《特戰英豪》使用 Vanguard 反作弊系統,任何記憶體修改行為都可能被偵測並導致永久停權。本文僅供技術研究與學術學習用途。

Q:如何取得最新的偏移資料?
A:可以關注逆向工程社羣的討論串,或使用 Cheat Engine (CE修改器) 7.5 漢化版 中文版《Cheat Engine》V7.6 中文化版超強記憶體解鎖工具:遊戲外掛製作神器! 搭配手動分析來取得最新數值。

致謝與更新紀錄



  • 更新日期:2026/04/17
  • 特別感謝社羣貢獻者:nopesfart420、manhcot123、arturleda、BlackMax97
  • Patch 12.07 偏移驗證與資料整理






大家正在看啥


收藏收藏 分享文章到FB上分享
回覆 使用道具 檢舉
複製專屬你的推廣連結:發至FB與各論壇宣傳:累積點數換GP商品 & 藍鑽
每五點閱率就可以兌換藍鑽積分或遊戲點卡 夢遊推廣文章換GP商品

你需要登入後才可以回覆 登入 | 加入會員

本版積分規則

Copyright (C) 2010-2020 夢遊電玩論壇

廣告合作:請直接聯繫我們,並附上您預刊登位置的預算。  

快速回覆 返回頂端 返回清單