1y ago · Nov 20, 2024 2:15 PM
Sharing tested signature patterns across multiple Unreal Engine 4 (4.20 - 4.27) and Unreal Engine 5 (5.0 - 5.4) shipping binaries:
1. GWorld Signatures:
2. GUObjectArray Signatures:
3. FNamePool Signatures (UE4.23 - UE5.4):
1. GWorld Signatures:
CPP
// Standard UE4 / UE5 GWorld Pattern (RIP-relative mov to GWorld)
// Pattern 1:
"48 8B 1D ? ? ? ? 48 85 DB 74 ? 41 B0 01"
// Pattern 2:
"48 8B 05 ? ? ? ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8"
// Helper to resolve RIP-relative 32-bit displacement:
uintptr_t ResolveRip(uintptr_t instructionAddr, int offsetToDisplacement, int instructionLength) {
int32_t ripOffset = *reinterpret_cast<int32_t*>(instructionAddr + offsetToDisplacement);
return instructionAddr + instructionLength + ripOffset;
}2. GUObjectArray Signatures:
CPP
// Pattern 1 (UE4 / UE5 standard):
"48 8D 0D ? ? ? ? E8 ? ? ? ? 48 8D 0D ? ? ? ? E8 ? ? ? ? 48 8D 05 ? ? ? ? 48 89 05"
// Pattern 2 (Inside UObject::ProcessEvent):
"48 8B 05 ? ? ? ? 48 8B 0C C8 48 8B 04 D1"3. FNamePool Signatures (UE4.23 - UE5.4):
CPP
// Pattern 1 (Inside FName::ToString):
"48 8D 05 ? ? ? ? EB ? 48 8D 0D ? ? ? ? E8 ? ? ? ? 48"
// Pattern 2:
"48 8D 0D ? ? ? ? E8 ? ? ? ? 4C 8B C0 48 85 C0 74 ? 48 8B C8"
SigScannerPro · Pattern scanning & Byte masking
The following users thanked SigScannerPro for this post: