Skip to content

Recognising an engine ​

A game built on an engine usually shows it in its files: archive formats, file extensions, DLL names, version strings, copyright notices and debug paths. Check these during inventory, before you decompile anything. tools/pe/peinfo.py prints imports, exports, the PDB path and engine fingerprints for Windows binaries; tools/dos/dosinfo.py does the same for DOS programs.

peinfo.py on the sample game's game.exe. It prints the architecture, the image base, the link date, the PDB name, the sections with their entropy, and the imported DLLs with engine.dll first.

Ask your agent ​

Identify the engine. Copy this prompt into your coding agent:

text
In my GameFrame project, identify the engine and the libraries the game uses.

1. Read docs/engines/recognising.md and docs/engines/middleware.md.
2. Check the file extensions and magic numbers, the DLLs, the strings, the PDB path and the
   RTTI names (tools/pe/peinfo.py or tools/dos/dosinfo.py).
3. Write the engine and each library into docs/FINDINGS.md with the evidence for each.
4. Label the library code in Ghidra with a prefix, so later tracing skips it.
5. If the engine's source was released, tell me its version and licence before reading it.

Where to look ​

PlaceWhat to look forHow
File extensions and archive magic.WAD with IWAD/PWAD, .PAK with PACK, .GRP with KenSilverman, .u packages`xxd FILE
Strings in the executableengine names, version strings, copyright notices, error messages, console commands`strings -n 6 GAME.EXE
Libraries beside the executableglide2x.dll, Engine.dll, mss32.dll, binkw32.dll, fmod.dll, smackw32.dllls; peinfo.py lists imports
The PDB path in a Windows binarythe studio's folder names, the engine's folder namespeinfo.py prints it
RTTI class names (MSVC C++).?AVUObject@@, .?AVNiNode@@, .?AVRwFrame@@peinfo.py; strings for .?AV
Configuration files[Engine.Engine] sections, config.cfg with console variablesopen them
The credits and the manual"Uses Bink Video", "Build engine by Ken Silverman"read them

Signatures of common engines ​

EngineTypical gamesSignatures
Wolfenstein 3D engineWolfenstein 3D, Spear of Destiny, Blake StoneVSWAP, GAMEMAPS, MAPHEAD, AUDIOT files
id Tech 1 (Doom)Doom, Doom II, Heretic, Hexen, Strife.WAD starting IWAD or PWAD; lumps THINGS, LINEDEFS, SECTORS
Quake engineQuake, Hexen II.PAK starting PACK; progs.dat (QuakeC byte code); .BSP version 29
Quake II engineQuake II, Heretic II, Kingpin, SiN, Soldier of Fortunegamex86.dll; .PAK; .BSP starting IBSP version 38; .wal textures
Quake III engine (id Tech 3)Quake III Arena, Return to Castle Wolfenstein, Star Trek: Elite Force, Call of Duty.pk3 (ZIP) files; .qvm modules; .BSP IBSP version 46 or 47
GoldSrcHalf-Life, Counter-Strike, Team Fortress Classichl.exe, hw.dll, sw.dll, client.dll, hl.dll; .wad starting WAD3; .BSP version 30
Build engineDuke Nukem 3D, Shadow Warrior, Blood, Redneck Rampage.GRP starting KenSilverman; .ART tiles; .MAP with version 7
Jedi engineStar Wars: Dark Forces, Outlaws.GOB starting GOB\x0a (Dark Forces), .LAB archives (Outlaws); .LEV, .INF, .O files
Unreal Engine 1 and 2Unreal, Unreal Tournament, Deus Ex, Rune, Splinter CellCore.dll, Engine.dll; packages .u, .utx, .unr starting with C1 83 2A 9E
LithTechShogo, Blood II, No One Lives Forever, AvP 2.REZ archives; lithtech.exe; .dat worlds, .abc models
NetImmerse and GamebryoMorrowind, Oblivion, Civilization IV, Dark Age of Camelot.nif files starting NetImmerse File Format or Gamebryo File Format
RenderWareGrand Theft Auto III, Vice City, San Andreas, Burnout.dff models, .txd texture dictionaries, .rws streams; RenderWare strings
Infinity EngineBaldur's Gate, Planescape: Torment, Icewind Dalechitin.key, .bif archives; .bcs compiled scripts; .are, .cre, .itm
Westwood enginesDune II, Lands of Lore, Command & Conquer, Red Alert, Dune 2000.PAK archives (Dune II, Lands of Lore); .MIX archives (from Command & Conquer); .SHP, .VQA, .AUD
Blizzard enginesDiablo, StarCraft, Diablo II, Warcraft III.MPQ archives starting MPQ\x1a; storm.dll
SCUMMMonkey Island, Day of the Tentacle, Sam & Max.LFL, .000, .LA0, .SOU files; resource blocks ROOM, SCRP, LECF
Sierra SCIKing's Quest IV to VII, Space Quest III to 6, Gabriel KnightRESOURCE.MAP, RESOURCE.000; SCIV.EXE or SIERRA.EXE
AGS (Adventure Game Studio)many independent adventuresacsetup.cfg; data appended to the executable, starting CLIB
Unityfrom 2005UnityPlayer.dll, *_Data folder, globalgamemanagers (see re-inventory)
Unreal Engine 3 and laterfrom 2006.upk or .pak; UE3 or UE4 strings (see re-inventory)

A game may also use a modified engine with new formats. When the signatures are close but do not match, compare the header layout with the engine's documented format. A changed version number or one extra field is common.

Libraries that are not the engine ​

The executable often contains code from libraries the game linked in. Ghidra cannot tell your game's functions from a library's. Find and label the library code first, so you do not trace it by mistake.

Library codeHow to spot itWhat to do
The C runtime (MSVC, Watcom, Borland, DJGPP)malloc, printf, qsort, _ftol, startup code before main; copyright stringsApply function signatures for the compiler (Ghidra's Function ID, FLIRT-style signatures), or label by hand from the strings
The C++ standard librarystd:: names in RTTI, basic_stringLabel, do not trace
zlibdeflate 1.1.3 Copyright and similar strings; the CRC table 0x77073096Label; use zlib in the port
Middlewaresee MiddlewareLabel; replace in the port
Compiler helpers__allmul, __aullrem, _chkstk, Watcom's register-call helpersLabel; they implement plain arithmetic

Once these are labelled, the remaining unlabelled code is the game and its engine.

Code: Apache 2.0. Content: CC0 1.0. No game material: bring your own copy.