ForzaTech extraction tools
Collection of patterns, scripts and more for reverse engineering ForzaTech game engine resources used in Forza game series since 2015, starting with Forza Motorsport 6.
Patterns
ImHex patterns for .carbin and .modelbin game resources.
Scripts
You need to edit .js files to configure input file or change preferences.
cd D:\ForzaTech-extraction-tools-main\scripts
node string_extractor.js
carbin_converter.js
It deserializes the Forza Horizon 5 input file and then serializes the Forza Horizon 4 output file compatible with 3DSimED 3.2c. Actually, it just replaces the first byte with 05 and drops 5 unnecessary bytes at the end of model chunks. Forza Horiozn 5 also has an updated .materialbin file format not supported by 3DSimED, so a lot of warnings should be skipped.
string_extractor.js
Prints a list of all strings contained in the input file in the following formats:
<u32 length> <u8 data[length]>
<u16 length> <u8 data[length]>
For example, 0A 00 00 00 6E 75 6C 5F 63 61 72 5F 30 30 is a string "nul_car_00" 10 bytes long. It was useful for researching .carbin and _skeleton.modelbin.
Resources
media\Cars\*\*.carbin
279 / 397 bytes unknown
Hierarchy
- Root
- ChunkA[0]
- Model[0]
- Model[1]
- ...
- ...
- ChunkB[0]
- Model[0]
- Model[1]
- ...
- ...
- ChunkA[0]
Structures
- Root (1*5+2=7 / 42 bytes unknown)
- type
05 00FH4, FH5 NUL_Car_00
06 00FH5 - guid
- car name
- skeleton path
01at the end (type 6 only)
- type
- ChunkA (1*7+4*8=39 / 43 bytes unknown)
- ChunkB (4+(1*13+4*8)+((4))=53 / 67 bytes unknown)
Upgrade parts?03 00type
- Model (4*16+2+1+4+(4)+8+4+(1*2+1*27)+1*19+1*20+4+(16)+5=180 / 245 bytes unknown)
- type
10 00FH4
12 00FH5 - guid
- 5 unknown bytes at the end (type 18 only)
- type
Links
media\Cars\*\*.modelbin
Structures
- Entry
-
tag
Reversed because it is stored as a number.[link] In C++ it looks like this:
uint32_t type = *(uint32_t *)("Grub"); std::cout << std::hex << type; // Expected output: 62757247
- Skel - Skeleton
- count: 1
- no properties
- Mrph - Morph
- count: 0-1
- no properties
- MatI - Material Info
- properties
- Name
- Id
- properties
- Mesh
- properties
- Name
- BBox
- properties
- IndB - Index Buffer
- count: 0-1
- properties
- Id
- VLay - Vertex Layouts
- properties
- Id
-1FH5 DOD_caliperLR_006
- Id
- properties
- VerB - Vertex Buffer
- properties
- Id
- properties
- Skin
- properties
- Id
- properties
- MBuf
- Modl - Model
- count: 1
- properties
- BBox
- TRef (optional)
- Skel - Skeleton
-
properties
- Name
- Id
- BBox - Bounding Box
- TRef
- array of unknown 4-byte elements
-
data address
- aligned to 4 bytes
-
Links
media\Stripped\gamedbRC.slt
It seems to be necessary for correct scaling and positioning of wheels and selecting of tires.
Decrypt
Tutorial
ForzaHorizon5.exe (CRC32: BFCEECA8)
00000001408FCFFE: call DecryptSQL(_, _, destination address, size, _)
Stage 1: Arxan TransformIT.
Stage 2: SQL specific. The executable contains encryption algorithm.
Links
- Download decrypted
- Data_Car table
- 010 Editor pattern
- https://github.com/0x1F9F1/Swage/blob/master/src/crypto/tfit.h
- https://github.com/EOSIO/mojey/blob/main/MojeyCommon/Arxan/TFIT/TFIT.h
media\Stripped\StringTables\EN\*.str
Related to gamedbRC.slt tables.
Structures
- Root
00 04version- table name buffer
- StringInfo
- id
The first byte of the placeholder name hash.
_&1697222648290251756139 C7 E1 40 10 76 89 EB"IDS_DisplayName_1"
- id
Links
Other tools
3DSimED
Keygen is available on Forsaken Customs.
3DSimED3.exe v3.2.3.1 (CRC32: C7FD36C3, protection: PC Guard 5.01, OEP: 007CC646, IAT: 008B1000)
IAT invalid imports:
008B141C: kernel32.ExitProcess
008B15D8: ?
008B15DC: ?
008B15E0: ?
008B1BC8: ?
The first four APIs are mentioned here. I couldn't find which DLLs they refer to. Maybe they are used to load import/export modules dynamically.
Environment
- Node.js v18.14.0
- ImHex v1.30.1
- Forza Horizon 5 v1.405.2.0 (Steam) [EMPRESS]
- Forza Horizon 4 v1.466.445.0 (Steam) [EMPRESS]
- Forza Horizon 3 v1.0.37.2 (UWP) "OpusDev"
Thanks
The XeNTaX community for sharing their research of .carbin and .modelbin file structure and creating tutorials for researching unknown 3D formats.