題:
逆向工程Earthsiege 2 3D模型格式
user45623
2015-12-10 02:11:24 UTC
view on stackexchange narkive permalink

作為一個個人項目,我一直在嘗試對舊的Dynamix遊戲Earthsiege 2(該遊戲早已被棄用,並且最近由當前版權所有者Hi-Rez免費發行)進行美術資產反向工程。解碼圖像/紋理是小孩子的工作,但是我一直在遇到二進制3D模型格式的麻煩。 DTS是專有的二進制格式(little-Endian),是“ Dynamix Three-Space”的縮寫。我找不到有關反轉ES2-era DTS文件的任何資源。

在這篇文章中,我將重點介紹《啟示錄》。

The Apocalypse in-game; take note there are discrete parts rather than a single mesh

Apocalypse模型存儲在 Apoca.dts 中。該文件以如下形式開始(以十六進制形式,帶有註釋):

  |檔案大小| ? | ChunkMarker |塊長度02 | 7C 7F 01 00 | 4B 1F 3D 7F | 03 00 1E 00 | FC 5F 00 00 | FF FF 00 00 0E 08 BF FF CC FF 23 04 01 00 15 00 14 00 70 46 00 00 FF FF 00 00 B7 06 BF FF CC FF 23 04 1B 00 14 00 14 00 4A 01 00 00 01 00 0C 00 AB 01 FB FF 22 00 7B 05 18 00 0F 00 10 00 06 <-Faces00 02 00 03 00 04 00 05 00 02 00 05 00 07 00 08 00 0A 00 0B 00 04 00 03 00 03 00 02 00 08 00 0A 00 0B 00 07 00 05 00 04 00 0A 00 08 00 07 00 0B 00 00 00 1D 00 FF 07 00 00 00 00 00 00 24 FF 72 <-這裡有些頂點01 82 05 DC 00 72 01 82 05 DC 00 C0 FE 8C 05 24 <-FF C0 FE 8C 05 00 F8 00 00 00 00 24 FF E8 FE 00 <-05 24 FF 04 01 60 04 00 08 00 00 00 00 DC 00 04 <-01 60 04 DC 00 E8 FE 00 05 00 00 7A 07 2A FD 00 <-00 4F F8 CE FD 00 00 BB FD 55 F8 02 00 00 04 02 00 00 04 00 00 00 14 00 00 00 14 14 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF 1B 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 19 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF 03 00 14 00 0A 00 0 0 00 00 00 02 00 04 00 00 00 00 00 03 00 14  

有關格式化/彩色編碼的分析,請參見 http://postimg.org/image/8e56re90n/

要完整查看文件的前三個塊,請參閱 http://pastebin.com/RTFkdiBd

當前知識

每個DTS文件分為多個塊。第10-13個字節是塊開始標記;我認為這是每個文件中的 03 00 1E 00 。接下來的四個字節是該塊的大小,後跟FF00。一個新的塊將在上一個結束後立即開始。我不知道這些塊現在如何分割數據,但是看來確實有多個塊包含頂點。這可能與以下事實有關:模型被明顯分為離散部分,而不是單個網格。

每個頂點都是6個字節的集合,由3個 signed 組成該頂點的X,Y和Z坐標的縮寫。該文件的第一個頂點為24 FF 62 01 82 05,轉換為十進制時其坐標為-220、354、1401。我提供的示例包含以下頂點:

  24 FF 72 01 82 05 DC 00 72 01 82 05 DC 00 C0 FE 8C 05 24 FF C0 FE 8C 0524 FF E8 FE 00 0524 FF 04 01 60 04DC 00 04 01 60 04 DC 00 E8 FE 00 05  

這些頂點定義了c部。有趣的是,actually部實際上位於文件中定義的3D空間中的頭部上方,因此必須在某處進行平移。我已經測試並通過在遊戲運行時在RAM中編輯這些字節來驗證上述字節是否包含the部,這在我單擊回游戲窗口時立即使模型失真。

請注意,在這些頂點中的某些頂點之間是兩組六個字節,它們看起來好像不是頂點(它們不對應於模型上的任何點,並且在RAM中更改時也不起作用)。我不知道如何處理這些問題:

  00 F8 00 00 00 0000 08 00 00 00 00  

模型的其餘部分在整個文件中都是分塊定義的。頂點被分為幾組,我認為每次定義一個形狀。除了武器和腿以外,我都能找到所有頂點。腿部具有動畫效果,因此它們的定義可能不同,或者位於不同的文件中。武器是在單獨的文件中定義的。

在頂點之前是一些具有較小值的短褲,例如06 00 0200。這些與面孔有關;我的猜測是它們通過索引引用頂點以定義面。我已經通過在遊戲運行時在RAM中編輯這些面孔來驗證這些面孔的影響,但是尚未完全解碼它們。

總有6個字節的0s( 00 00 00 00 00 00 )在面和頂點之間。頂點結束後不久,總會有標記 04 00 00 00 14 00 00 00 14 14 00 00 00 。使用這些知識,我可以通過在這兩個標記之間查看來解析文件的頂點。但是,這是不精確的,最終我得到了一堆垃圾頂點,這些垃圾頂點在模型周圍形成了部分球形殼。 DTS文件;我在這裡過濾掉了一些垃圾頂點,但是在邊緣和中間仍然存在一些垃圾頂點。請注意,臀部和c部位於文件中的軀幹上方 enter image description here

下一步是什麼?

我不希望從頭到尾對整個DTS文件進行解碼-它太長且太複雜-但我希望至少能夠從文件中讀取頂點,並希望將其面對。

我目前最大的掙扎是試圖弄清楚如何確切地知道一組面/頂點在哪裡開始和結束。 我的主要問題是如何精確確定一組面/頂點在哪裡開始和結束,因為它們在每個文件中的位置都不完全相同。您會發現我錯過的任何其他信息都很棒,但這是我的主要目標。

我目前正在為長期被遺棄的2001年韓國MMORPG設計相同的項目。像您一樣,紋理很容易。但是這些對像是我當前卡住的地方。您可以共享任何資源或書籍來幫助您最終解碼目標文件嗎?
-1
這還在繼續嗎?只是想說我能夠使用booto的腳本轉換Earthsiege 1中的某些模型。
一 回答:
booto
2015-12-17 13:17:58 UTC
view on stackexchange narkive permalink

僅通過檢查來確定面/頂點在何處的佈局可能會非常耗時且容易出錯。鑑於可以使用可執行文件來處理這些文件,我認為這可能是一個更好的起點-它明確知道如何處理格式。

我使用IDA Pro分析了加載中涉及的可執行文件中的代碼。數據,使用一些魔術數字(包括您標記為ChunkMarker的0x001e0003)來定位相關部分並從那裡擴展。

您會發現網格中存在一些曲面重複項-我認為基本網格物體只是陰影,但在基本網格物體上像貼花一樣很少使用紋理。

下面是導入Blender的示例。 enter image description here

您可以訪問我編寫的在 github上生成該代碼的代碼。

在這裡,我已經放棄了得到答复的機會。先生,您贏得了所有互聯網。希望我能給您更多的支持。我迫不及待地想給您的腳本打個招呼。我曾經考慮過嘗試使用調試器進入EXE,但我從未嘗試過這樣做,甚至都不知道從哪裡開始。
我假設您正在查看DBSIM.exe?如果您可以輕鬆地解釋如何做您所做的事情,我一定會感激的,但是如果您要向不熟悉IDA或反彙編程序的人解釋這種事情很麻煩,請不要擔心。無論哪種方式謝謝!
您能否指定Python和lib3ds的版本?我從您的打印語句中缺少括號的情況下猜測到Python 2.x嗎?
從外觀看Python 2.7。
實際上,它是“ dbsim.exe”。從0x00405F09開始(通過該魔術數字)並從那裡進行跟踪。您會發現vtable開頭之前的0xc字節是指向包含有關該類的元數據的結構的指針(它可能是borland的rtti的c ++東西使用的?)Lib3ds版本似乎是1.3.0?我剛剛安裝了debian打包的任何版本。
好的,謝謝您的信息。我在Windows 10上並且對Python不太熟悉,因此我仍在弄清楚如何正確設置所有內容。您是否能夠在Debian上運行遊戲(大概是使用模擬器),還是在Windows上進行了測試,但在Linux上設置了腳本?
我沒有安裝或運行遊戲中的任何內容-我只是通過靜態分析來做到這一點。我只是直接從ISO Hi-Rez提供中獲取dbsim.exe。
很抱歉讓您感到困擾,這應該是最後一個問題。我放棄了讓腳本在Windows上運行的嘗試,並設置了Debian虛擬機。我瘋狂地試圖找出如何設置正確的構建環境的原因,因為運行lib3ds_build需要CFFI,而CFFI需要CPython或PyPy,但我不知道它們要使用哪個版本。您能否提供Python的確切版本(包括CPython或PyPy)和您使用的CFFI的確切版本?
我從普通的debian倉庫使用這些軟件包:python2.7 python-cffi python-cffi-backend lib3ds-1-3 lib3ds-dev ... apt應該照顧所有依賴項。我正在使用'stretch'版本,但我認為這不太重要...
我無法使用從apt-get獲取的python-cffi來工作,這給了我一個非常過時的版本,無法與您的lib3ds_build腳本一起使用。我最終使用apt來獲取python-dev,python-pip,python-pip-dev,lib3ds和lib3ds-dev(以及可能我忘記的其他文件),然後從其網絡倉庫下載並安裝最新的CFFI(我必須使用最新的提交;無法為我安裝最新的穩定版本)。從好的方面來說,現在一切正常,我能夠轉換除2或3個Hercs之外的所有!再次感謝!
投票贊成非常好的答案。我也有類似的困境。我可以用來完成提取目標文件並將其加載到3D編輯器中的任何書籍或文章嗎?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...