崙?zhàn):FModel提取Pak模型+Dumper-7避坑指南)
聊到UE5資源逆向很多人第一反應(yīng)就是神秘高深覺(jué)得那是搞外掛、搞破解的人才會(huì)碰的東西。其實(shí)把概念拆開(kāi)它不過(guò)是一套標(biāo)準(zhǔn)的資源格式還原流程。你用UnrealPak打出一個(gè).pak里面裝著.uasset、.uexp、.ubulkFModel的作用就是把這些冷冰冰的二進(jìn)制文件重新組織成可視化的目錄樹(shù)點(diǎn)一下就能預(yù)覽模型、貼圖一鍵導(dǎo)出。這篇不是從零教安裝的開(kāi)胃菜而是直接給你一份能跑通的實(shí)戰(zhàn)記錄FModel怎么設(shè)置才能打開(kāi)UE5.1/5.2打包的pak模型怎么導(dǎo)出才能在Blender里正常顯示以及Dumper-7這玩意兒到底什么時(shí)候才需要、為什么老有人在這兒翻車(chē)。1. 開(kāi)工之前先把.pak和FModel的關(guān)系搞明白1.1 一個(gè).pak文件被拆開(kāi)之后長(zhǎng)什么樣你手里拿到的.pak本質(zhì)上是一個(gè)用UnrealPak打包出來(lái)的容器文件。它的內(nèi)部不是簡(jiǎn)單地塞了一堆文件而是按照UE的資源序列化格式組織成了一段連續(xù)的二進(jìn)制流。你用壓縮軟件硬解是看不到東西的因?yàn)槔锩鎵焊鶝](méi)有傳統(tǒng)意義上的“文件名和文件夾”。拆開(kāi)之后你會(huì)看到三類(lèi)最常見(jiàn)的資源后綴.uasset資源主體里面裝著這個(gè)資源的分區(qū)信息、依賴引用列表和序列化頭但要注意它不等于全部數(shù)據(jù)。.uexpuasset的表達(dá)式塊大量實(shí)際屬性數(shù)據(jù)和數(shù)組內(nèi)容都存放在這個(gè)文件里uasset和uexp一般成對(duì)出現(xiàn)。.ubulk大塊二進(jìn)制數(shù)據(jù)通常存的是紋理的Mip、頂點(diǎn)緩沖區(qū)、索引緩沖區(qū)這類(lèi)對(duì)加載性能更友好的數(shù)據(jù)。到了UE5時(shí)代很多項(xiàng)目會(huì)改用IoStore格式也就是.pak里面再配.ucas和.utoc兩個(gè)文件。.utoc相當(dāng)于索引目錄.ucas才是實(shí)際數(shù)據(jù)容器。FModel對(duì)這兩種格式都能處理但前提是你得在設(shè)置里把UE版本選對(duì)。很多時(shí)候用戶反饋“pak打開(kāi)是空的”十有八九是FModel沒(méi)識(shí)別出IoStore的索引目錄加載不出來(lái)。1.2 FModel能干什么、不能干什么FModel的定位可以理解成“UE資源瀏覽器”。它能讀取.pak里的目錄樹(shù)能預(yù)覽StaticMesh、SkeletalMesh、Texture2D、SoundWave、CurveTable等常見(jiàn)資源還能把這些資源導(dǎo)出成外部工具能識(shí)別的格式。但它有非常明顯的邊界它無(wú)法完整還原一個(gè)Engine工程。材質(zhì)節(jié)點(diǎn)網(wǎng)絡(luò)不能還原藍(lán)圖只能還原到邏輯表達(dá)層面動(dòng)畫(huà)曲線經(jīng)常導(dǎo)出后需要人工修正。所以別抱著“提取完就能直接拖回UE里重新編譯”的天真想法FModel解決的是“看到資源、拿出資源”而不是“反向構(gòu)建一個(gè)完整項(xiàng)目”。1.3 Dumper-7在這套流程里到底排第幾位Dumper-7是一個(gè)UE的SDK Dump工具用來(lái)從運(yùn)行中的UE進(jìn)程中提取GNames、GObjects、GWorld這些全局指針的偏移并生成一個(gè)SDK頭文件。它的應(yīng)用場(chǎng)景偏向內(nèi)存分析、Mod開(kāi)發(fā)、以及一些自動(dòng)化腳本編寫(xiě)。FModel提取模型根本不需要經(jīng)過(guò)Dumper-7。FModel依賴的是靜態(tài)的.pak文件結(jié)構(gòu)和可選的AES解密密鑰它不關(guān)心運(yùn)行時(shí)內(nèi)存里的對(duì)象關(guān)系。只要你能拿到.pak和對(duì)應(yīng)的AES KeyFModel就能直接導(dǎo)出模型。所以如果你看得某篇教程一上來(lái)就教你先用Dumper-7 dump什么偏移量再配合什么工具去解包那大概率是在繞遠(yuǎn)路。先把FModel這條主線走通再考慮Dumper-7順序不能錯(cuò)。2. 環(huán)境準(zhǔn)備下載、版本選擇和兩個(gè)關(guān)鍵變量2.1 工具清單別多裝也別漏裝做這套流程真正必需的工具其實(shí)只有三個(gè)FModel主工具負(fù)責(zé)讀取、預(yù)覽、導(dǎo)出.pak資源。Blender用于把導(dǎo)出的模型格式轉(zhuǎn)為可用資源這里推薦安裝PSK/PSA導(dǎo)入插件如果你用glTF導(dǎo)出的話Blender 2.8以上自帶導(dǎo)入器不用額外裝插件。啟動(dòng)前的文本工具比如Notepad或者VS Code用來(lái)快速翻看導(dǎo)出的.uasset二進(jìn)制文件頭輔助判斷資源類(lèi)型和引用路徑。不建議一上來(lái)就裝一堆“全家桶”像什么奇怪的解包助手、模型轉(zhuǎn)換器很多這類(lèi)工具要么版本老舊要么帶捆綁內(nèi)容。FModel一個(gè)工具就能覆蓋大部分需求模型轉(zhuǎn)換交給Blender的導(dǎo)入導(dǎo)出功能即可。2.2 FModel版本和UE版本之間的關(guān)系FModel的Release版本更新頻率不算快但新UE版本出來(lái)之后舊版FModel大概率會(huì)出兼容問(wèn)題。UE5.0的資源結(jié)構(gòu)相對(duì)UE4變化不大但UE5.1之后IoStore格式的普及率上升UE5.2、UE5.3的項(xiàng)目你拿一個(gè)一年前的FModel版本去打開(kāi)經(jīng)常出現(xiàn)“目錄加載成功但資源始終刷不出來(lái)”。我現(xiàn)在的做法是先看目標(biāo)pak對(duì)應(yīng)的UE版本再對(duì)照FModel Release頁(yè)面確認(rèn)哪個(gè)版本做了對(duì)應(yīng)更新。如果目標(biāo)項(xiàng)目是UE5.2以上優(yōu)先用最新Release版老版本扔著備用。別迷信“最穩(wěn)定版”在UE逆向這個(gè)場(chǎng)景里新版本工具對(duì)新格式的支持幾乎總是優(yōu)先的。2.3 AES Key和平臺(tái)差異UE的.pak包可選AES加密。打包時(shí)如果勾選了加密FModel打開(kāi)時(shí)就需要提供對(duì)應(yīng)的64位十六進(jìn)制Key。很多自己打包的測(cè)試項(xiàng)目AES Key就在打包配置里寫(xiě)著找個(gè)文本編輯器把Config目錄翻一遍就能定位到。商業(yè)游戲如果啟用了加密Key通常不會(huì)明文出現(xiàn)要么從程序內(nèi)存里分析要么從某個(gè)配置服務(wù)器下發(fā)那套流程已經(jīng)超出“FModel正常打開(kāi)pak”的范疇了。FModel支持“Auto Detect AES”它會(huì)在運(yùn)行中的UE進(jìn)程里嘗試自動(dòng)提取密鑰。前提是游戲進(jìn)程在運(yùn)行、且你有權(quán)限讀取其內(nèi)存。對(duì)于自己項(xiàng)目調(diào)試這個(gè)功能偶爾能省事對(duì)線上商業(yè)游戲我勸你別指望這個(gè)功能合規(guī)風(fēng)險(xiǎn)很高。如果你手上的.pak根本沒(méi)加密FModel里密鑰欄留空即可。IoStore的解析還涉及一個(gè)“UE Version”的選擇。有時(shí)候同一份pak在FModel里選擇Game還是Auto會(huì)得到完全不同的目錄結(jié)果。遇到列不出目錄的情況優(yōu)先切換這個(gè)選項(xiàng)。3. 實(shí)戰(zhàn)把模型從.pak里拖出來(lái)3.1 第一次啟動(dòng)FModel三項(xiàng)設(shè)置千萬(wàn)別填錯(cuò)啟動(dòng)FModel后主界面左上角的“Directory”按鈕是選擇游戲根目錄也就是包含.pak或.ucas文件的那一層目錄。注意不是選.pak文件本身而是選pak文件所在的上一級(jí)目錄。然后點(diǎn)“Settings”進(jìn)入配置頁(yè)三樣?xùn)|西必須確認(rèn)UE Version必須匹配目標(biāo)pak的UE版本。選錯(cuò)的結(jié)果是目錄能讀到但資源解析全亂。Game如果你加載的是某個(gè)已知游戲可以先選對(duì)應(yīng)的預(yù)設(shè)。沒(méi)有預(yù)設(shè)就選“Undetected”不影響后續(xù)手動(dòng)解析。AES Key有加密就填沒(méi)有就留空。切回主界面后點(diǎn)一次“Folder”按鈕選擇DirectoryFModel會(huì)開(kāi)始掃描所有pak和IoStore容器。首次掃描比較大的項(xiàng)目會(huì)花幾十秒到幾分鐘期間界面像“卡死”其實(shí)是在構(gòu)建緩存。等左下角狀態(tài)欄出現(xiàn)“Done”再雙擊對(duì)應(yīng)的.pak才能進(jìn)入資源樹(shù)。3.2 從資源樹(shù)定位到一個(gè)模型進(jìn)入.pak目錄后你會(huì)看到類(lèi)似Content結(jié)構(gòu)的多級(jí)文件夾。模型資源通常集中在這幾類(lèi)目錄下StaticMesh靜態(tài)網(wǎng)格比如場(chǎng)景道具、建筑部件。SkeletalMesh骨骼網(wǎng)格比如角色、怪物。Mesh或Geometry某些項(xiàng)目自定義的資源歸類(lèi)。用左側(cè)搜索框輸入關(guān)鍵字過(guò)濾比手動(dòng)翻目錄快得多。比如你要找某個(gè)叫“SM_Car01”的靜態(tài)車(chē)模直接搜關(guān)鍵字“Car01”FModel會(huì)列出所有路徑中帶這個(gè)名字的資源。右鍵目標(biāo)資源選擇“Preview”會(huì)在右側(cè)打開(kāi)預(yù)覽窗口轉(zhuǎn)動(dòng)視角確認(rèn)這就是你要的模型然后再右鍵選擇“Export Mesh as PSK”或“Export Mesh as glTF”。3.3 導(dǎo)出格式怎么選PSK、glTF還是RAWFModel導(dǎo)出模型時(shí)最常見(jiàn)的三個(gè)選項(xiàng)是PSK、glTF和RAW。PSK是一種老牌的UE網(wǎng)格導(dǎo)出格式保留UV、材質(zhì)插槽、頂點(diǎn)權(quán)重和骨骼信息。Blender需要裝PSK/PSA插件才能導(dǎo)入但導(dǎo)入之后的數(shù)據(jù)結(jié)構(gòu)非常接近UE內(nèi)部表現(xiàn)適合做資源重建和骨骼動(dòng)作綁定。glTF是更通用的選擇尤其是導(dǎo)出glb格式之后Blender原生支持導(dǎo)入Maya、3ds Max也有對(duì)應(yīng)導(dǎo)入器。缺點(diǎn)是部分UE特有的屬性會(huì)丟失比如材質(zhì)表達(dá)式、LOD分組、自定義碰撞體這些都不在glTF標(biāo)準(zhǔn)里。RAW格式最接近UE內(nèi)部序列化導(dǎo)出的是一個(gè)可被UAssetGUI等工具繼續(xù)解析的原始資源文件適合做深度分析但無(wú)法直接被DCC軟件打開(kāi)。我的建議是目標(biāo)只是看模型、做參考、做展示選glTF目標(biāo)是繼續(xù)在UE里使用或研究骨骼權(quán)重選PSK。不要一上來(lái)就導(dǎo)出RAW除非你知道接下來(lái)要干嘛。3.4 貼圖和材質(zhì)鏈別漏了模型導(dǎo)出來(lái)只是第一步?jīng)]有貼圖的模型就是個(gè)白模。FModel導(dǎo)出的模型文件里只記錄了材質(zhì)插槽名稱不會(huì)自動(dòng)把貼圖打包進(jìn)去。你需要回到資源樹(shù)找到該模型引用的材質(zhì)資源Material右鍵材質(zhì)在預(yù)覽面板里看它引用了哪些貼圖再逐個(gè)導(dǎo)出Texture2D為PNG。更高效的辦法是在FModel預(yù)覽模型時(shí)點(diǎn)開(kāi)“Assets”選項(xiàng)卡查看該模型的完整依賴列表里面會(huì)列出所有引用的Material和Texture資源。然后把依賴列表里的貼圖一批導(dǎo)出最后在Blender里手動(dòng)建材質(zhì)球并連接貼圖。這一步?jīng)]法完全自動(dòng)化因?yàn)镕Model不會(huì)為你重構(gòu)圖譜化的材質(zhì)參數(shù)。實(shí)際做的時(shí)候我一般是先把所有依賴的貼圖導(dǎo)出到同一個(gè)文件夾按PNG文件名對(duì)應(yīng)到材料槽再在Blender里逐個(gè)連接BaseColor、Normal、Roughness。大概20分鐘能搞定一個(gè)中等復(fù)雜度的角色模型。4. Dumper-7避坑指南應(yīng)該說(shuō)清楚的三件事4.1 什么場(chǎng)景下Dumper-7才算必需品先潑一盆冷水如果你只是想從.pak里提取模型Dumper-7根本不在你的工具鏈里。標(biāo)題里帶“Dumper-7避坑指南”這個(gè)“避坑”首先就是讓你們別把它當(dāng)成解包前置步驟。真正需要Dumper-7的場(chǎng)景是你想對(duì)UE程序做運(yùn)行時(shí)分析。比如你想寫(xiě)一個(gè)內(nèi)存修改工具、想通過(guò)外部腳本讀取游戲中的對(duì)象屬性、想自動(dòng)化調(diào)用游戲內(nèi)部函數(shù)這時(shí)候你需要知道GObjects的地址、UObject數(shù)組的偏移、FNamePool的實(shí)現(xiàn)細(xì)節(jié)。Dumper-7會(huì)被注入到UE進(jìn)程中通過(guò)掃描PE頭、查找GName和GObject相關(guān)的模式串把一套最新的SDK頭文件生成出來(lái)供你后續(xù)編譯代碼。這個(gè)過(guò)程和FModel解包是兩個(gè)方向FModel是靜態(tài)打開(kāi)文件Dumper-7是動(dòng)態(tài)分析進(jìn)程。兩者沒(méi)有依賴關(guān)系。所以“用FModel提取模型要配Dumper-7”這種說(shuō)法可以判定為錯(cuò)誤示范。4.2 編譯Dumper-7時(shí)的經(jīng)典翻車(chē)點(diǎn)真要上Dumper-7你大概率會(huì)先在編譯階段被坑一次。翻車(chē)率最高的點(diǎn)有兩個(gè)**第一VS版本不匹配。**Dumper-7項(xiàng)目對(duì)MSVC工具集有版本要求用太老的VS2017經(jīng)常編不過(guò)用太新的VS2022也可能因?yàn)閃indows SDK版本沖突報(bào)錯(cuò)。我踩過(guò)的是VS2019Windows SDK 10.0.19041組合相對(duì)穩(wěn)妥但這也要看你的源碼分支。**第二UE源碼版本嚴(yán)重不匹配。**UE5.0、5.1、5.2之間的內(nèi)部結(jié)構(gòu)差異很大Dumper-7在5.0上能用、到5.2直接崩潰的情況非常常見(jiàn)。Dumper-7內(nèi)部會(huì)引用一些UE頭文件常量版本一錯(cuò)GNames池的偏移計(jì)算方式就變了輕則dump出來(lái)的SDK字段錯(cuò)亂重則運(yùn)行秒崩。解決這個(gè)問(wèn)題沒(méi)有捷徑老老實(shí)實(shí)去核對(duì)目標(biāo)項(xiàng)目的UE分支號(hào)確認(rèn)你本地Dumper-7對(duì)應(yīng)分支與目標(biāo)主線一致。別信“通用版”三個(gè)字UE逆向領(lǐng)域里沒(méi)有一勞永逸的通用。4.3 運(yùn)行時(shí)的坑合規(guī)邊界和系統(tǒng)誤報(bào)Dumper-7這類(lèi)工具的性質(zhì)決定了它一定會(huì)觸發(fā)殺毒軟件和Windows Defender的報(bào)毒。因?yàn)樗男袨楸举|(zhì)是進(jìn)程注入和內(nèi)存讀取安全軟件的啟發(fā)式查殺基本必報(bào)。我自己測(cè)試時(shí)都是先把工程目錄加入排除列表然后在一個(gè)隔離的虛擬機(jī)或測(cè)試環(huán)境里跑。這里必須把界限說(shuō)清楚Dumper-7只能用于你有權(quán)限測(cè)試的應(yīng)用程序比如你自己開(kāi)發(fā)的項(xiàng)目、開(kāi)源項(xiàng)目、或者你被授權(quán)測(cè)試的軟件。任何針對(duì)在線游戲或商業(yè)軟件做注入分析的行為既違反用戶協(xié)議也容易觸碰法律紅線。我寫(xiě)這些內(nèi)容是為了讓你們理解工具的定位和坑不是教你們?nèi)グ巧虡I(yè)游戲的運(yùn)行時(shí)數(shù)據(jù)。4.4 放棄Dumper-7的替代路線大多數(shù)時(shí)候你需要的東西可以繞開(kāi)Dumper-7拿到。如果是想看某個(gè)資源的內(nèi)部引用關(guān)系用FModel右鍵選擇“Show Assets”就夠了它會(huì)把一個(gè)資源依賴的所有子資源列成列表完全靜態(tài)、完全安全。再不行用UAssetGUI打開(kāi)導(dǎo)出的.uexp文件可以直接查看屬性表格和引用結(jié)構(gòu)比Dumper-7生成的SDK更貼近資源本身。如果你真的需要運(yùn)行時(shí)信息先檢查目標(biāo)資源是不是可以通過(guò)UE自帶的控制臺(tái)命令或調(diào)試命令輸出。很多開(kāi)發(fā)和調(diào)試構(gòu)建版本還保留著完整的命令行接口先跑一遍help可能你要找的偏移就在某個(gè)調(diào)試命令的輸出里完全不需要做進(jìn)程注入。5. 常見(jiàn)問(wèn)題與翻車(chē)實(shí)錄我把踩過(guò)的坑按順序列一遍5.1 pak打不開(kāi)目錄直接空這個(gè)問(wèn)題占了我接觸到的求助案例的一半。排查順序建議固定為先看FModel版本再看UE Version選項(xiàng)最后查AES。之前遇到一個(gè)UE5.1打包的IoStore包老版本FModel怎么刷新都是空目錄。換到支持IoStore分塊加載的新版本后同樣設(shè)置一次就列出來(lái)了。如果版本沒(méi)問(wèn)題那就是UE Version選錯(cuò)把5.1的包留在“4.27”預(yù)設(shè)下解析會(huì)導(dǎo)致區(qū)塊偏移錯(cuò)亂結(jié)果就是目錄刷不出來(lái)。AES錯(cuò)了更直接加載時(shí)會(huì)報(bào)解密失敗這個(gè)錯(cuò)誤信息反而是最好定位的。5.2 模型導(dǎo)出來(lái)是黑臉或沒(méi)有貼圖這不算Bug是流程缺了一步。FModel導(dǎo)出模型時(shí)只會(huì)把網(wǎng)格數(shù)據(jù)寫(xiě)進(jìn)文件貼圖是獨(dú)立的資源需要你手動(dòng)回到Texture目錄里去導(dǎo)。黑臉問(wèn)題基本就是BaseColor貼圖沒(méi)連上。注意一個(gè)細(xì)節(jié)用PSK格式導(dǎo)出時(shí)模型自帶的UV通道和材質(zhì)插槽會(huì)保留Blender導(dǎo)入后把圖像紋理連到BaseColor即可。導(dǎo)出時(shí)在FModel里勾選“Export Textures”不會(huì)自動(dòng)建立材質(zhì)只是把貼圖文件一起轉(zhuǎn)存別誤以為會(huì)生成一個(gè)完整的材質(zhì)球。5.3 骨骼錯(cuò)位、模型比例不對(duì)Blender導(dǎo)入PSK時(shí)經(jīng)常遇到的“模型躺平”現(xiàn)象是軸向系統(tǒng)差異導(dǎo)致的。UE使用Z軸向上而某些PSK插件默認(rèn)使用Y軸向上導(dǎo)入時(shí)需要在Blender里把模型旋轉(zhuǎn)X軸90度。比例不對(duì)的情況則多半是單位的鍋。UE的場(chǎng)景單位是厘米Blender如果導(dǎo)入時(shí)選擇了“導(dǎo)入為米”一個(gè)2米高的人物會(huì)變成2厘米。導(dǎo)入設(shè)置里務(wù)必確認(rèn)單位選項(xiàng)PSK插件和glTF導(dǎo)入器都有這個(gè)選項(xiàng)不調(diào)整的話后面對(duì)照骨骼長(zhǎng)度和動(dòng)畫(huà)位移會(huì)非常難受。5.4 Dumper-7編譯通過(guò)但運(yùn)行秒崩如果編譯都過(guò)了但一運(yùn)行就崩十有八九是UE版本與Dumper-7的SRC版本不匹配。我遇到過(guò)5.0能用、5.1直接FNamePool not found的情況。Dumper-7對(duì)FNamePool也就是UE5里的GNames高度敏感UE5重做了名字池的哈希索引結(jié)構(gòu)5.1起又做了一些偏移調(diào)整舊版Dumper-7根本找不到入口。解決方法是先確認(rèn)目標(biāo)UE版本再找對(duì)應(yīng)分支的Dumper-7源碼或者自己逆向分析FNamePool的地址并手動(dòng)填入配置。不要試圖在崩潰日志里找“補(bǔ)丁”老老實(shí)實(shí)對(duì)版本才是唯一出路。5.5 導(dǎo)出后模型出現(xiàn)多余網(wǎng)格或破碎面這個(gè)一般是LOD和Nanite引起的問(wèn)題。UE5的資源文件里模型分為多個(gè)LOD層級(jí)Nanite網(wǎng)格還包含專(zhuān)門(mén)的分塊結(jié)構(gòu)。FModel默認(rèn)導(dǎo)出時(shí)如果選了Lowest LOD有可能導(dǎo)出的是Nanite的簡(jiǎn)化代理網(wǎng)格看著像破碎面。解決方法是右鍵導(dǎo)出時(shí)手動(dòng)指定LOD層級(jí)選擇LOD 0完整精度。如果不確定先在預(yù)覽窗口里切換LOD 0和LOD 1看哪個(gè)是完整模型再導(dǎo)出。這個(gè)操作在FModel的預(yù)覽面板左下角下拉框里別看漏了。最后說(shuō)點(diǎn)實(shí)際的我個(gè)人在實(shí)際操作中的體會(huì)是UE5資源逆向這件事工具鏈越短越不容易出事。FModel加Blender就能解決90%的模型提取需求Dumper-7這種重量級(jí)SDK工具只屬于另一條技術(shù)分支。你先別急著裝一堆工具把FModel的目錄結(jié)構(gòu)、UE版本、AES這三個(gè)點(diǎn)摸透比什么都有用。還有個(gè)小技巧如果你導(dǎo)出的模型在Blender里紋理怎么都連不上先返回到FModel里查一下貼圖的尺寸和格式。UE5很多貼圖是BC7壓縮格式導(dǎo)出成PNG時(shí)需要FModel自行解碼偶發(fā)情況下解碼會(huì)失敗生成一張臟圖。這時(shí)候直接重導(dǎo)一次或者改用“Export as TGA”再轉(zhuǎn)PNG往往就正常了。資源逆向的坑往往不是原理多深而是這些看起來(lái)不值一提的細(xì)節(jié)。能把這些細(xì)節(jié)整理明白你的效率就已經(jīng)超過(guò)大半同行了。