Game internals
Engine fingerprints
- Unreal: GWorld, UObject arrays, GNames/FName, ProcessEvent, replication graph
- Unity: il2cpp vs mono, domain/assemblies, native→managed bridges
- Source/Source2: entity list, interfaces, schema systems
- Custom: start from input→simulation→render dataflow
Systems to map
- Entity/actor/component registries + handle schemes
- Transforms (local/world), bones, bounds
- Simulation tick vs render frame; client prediction & reconciliation
- Netcode: snapshots, delta compress, lag comp, interest management
- Physics world pointers
- Camera/view matrix origins (for world-to-screen)
- Inventory/ability/state machines
Method
- Static: strings, RTTI, PDB leftovers, IL/Bytecode dumps
- Dynamic: ReClass/Offests, hooks on tick/Packet write
- Validate offsets across patches; generate offset DBs
Unreal Engine 4/5 deep map
Core globals (find via Dumper-7 or hand-rolled sigs)
| Symbol | Purpose | Notes |
|---|---|---|
GNames / FNamePool |
name table | 4.23+ uses FNamePool (blocks of 8KB); older = TNameEntryArray. Sig: FName::ToString references |
GObjects |
UObject array | FUObjectArray; 4.22+ pre-GC layout switch (chunked 8192/64). Sig: StaticConstructObject internals |
GWorld → ULevel* → AActor* |
actor iteration | OwningGameInstance → LocalPlayers |
GEngine → GameViewport → GamePlayers[0] |
player chain | → APlayerController → PlayerCameraManager (view) + AcknowledgedPawn |
ProcessEvent (UObject vtable slot or sig) |
hookable event dispatch | vtable index 0x41-ish on 4.x (verify per build) |
GEngine->NetDrivers |
replication channels | snapshot + delta dumps |
Per-patch survival
- UE ships with incremental version (
++UE+Release-42.00); tie offset DB to exact build. - Mobile UE (e.g. libUnreal.so, stripped, LLD): only ~50 dynsym exports survive — GNames/GObjects via pattern scans; re-dump per patch (see
offset-dumper). - FName index → string: walk FNamePool block by index >> 16, entry header has bIsWide + len.
UE5 deltas vs UE4
UWorld→PersistentLevelunchanged in practice;FNamePoollayout stable.- Chaos physics replaces PhysX:
FPhysicsActorhandles differ; mesh → transform indirection viaChaos::FSingleParticlePhysics. - World Partition changes level streaming: iterate
ULevel::Actorsper cell; streaming sources gated byWorldPartitionsubsystem.
Unity deep map
- il2cpp:
global-metadata.datheader (sanity: magic 0xFAB11BAF, version field drives Il2CppDumper behavior);CodeRegistration+MetadataRegistrationviail2cpp_initxrefs. - Key natives:
il2cpp_domain_get_assemblies,il2cpp_class_from_type,il2cpp_runtime_invoke— hook these for logic-level instrumentation without touching game code. - Mono (legacy): root domain →
mono_assembly_loadchains; usemono_get_root_domainand walkMonoImagetables. - Il2CppInterop / MelonLoader style: inject a mono runtime host to call back into managed — detection cost: assembly scan.
Source / Source2 deep map
- Source1:
IBaseClientDLL→CreateMove(input → cmd),IVEngineClient(view), netvars viaGetClientClasschain +RecvTablerecursion (flat offsets = netvar manager). - CS2/Source2: schema system (
resource/…/schema.bin,.vcss-adjacent) exposes typed field paths; community exports asschema.json.CEntityIdentitylist head viaSource2Client→ entity handles areCEntityHandle(index + serial). Panorama UI and entity sim decoupled — read entity list each sim tick, not render frame.
World-to-screen (the render bridge)
// column-major view-projection; v = bones[j] * 4x4 vp
x = v.x / v.w, y = v.y / v.w // NDC
if v.w < 0 -> behind camera, cull
screen.x = (x * 0.5 + 0.5) * width
screen.y = (1 - (y * 0.5 + 0.5)) * height // Y flip
- Camera origin:
PlayerCameraManager->GetCameraLocationorViewTarget->POV; confirm FOV scaling (UE: horizontal FOV; multiply Y by aspect correction). - Bone matrix:
USkeletalMeshComponent->GetBoneMatrix(i)— or cachedComponentToWorld+BoneSpaceTransforms.
Netcode classes worth memorizing
- UE:
UNetConnection,UChannel,UActorChannel(property replication per-actor); client prediction viaSavedMovesonUCharacterMovementComponent— replay window abuses live here (game-hacking-exploits). - Source1:
CUserCmd(tick, viewangles, buttons), sequence-nr rollback = lag-comp window; anti-aim/silent-aim derive from same structures. - Interest management tells you which entities the server sends — spoof nothing outside it, detect desyncs by comparing local sim vs last snapshot.
Pair with
game-hacking, game-hacking-exploits, aimbot-humanization.