You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Invariant that works through obfuscation. They don't obfuscate the epilogue of the block above the slow path conditional.
1650
1652
// The xor rcx,rsp + call __security_check_cookie + vmovaps xmm6 sequence is compiler-generated and stable.
1651
1653
// In new builds there was a sub rbp, rbp randomly inserted after the vmovaps, so we added a wildcard functionality to the signature scan to allow some instructions in between.
// because the obfuscation has been randomized around the areas we've been patching so far (immediate_patch_re9, see commented out code)
2119
+
// I had become a bit fed up with manually fixing broken anti-tamper bypasses every update.
2120
+
// So I wrote an emulator that executed the RenderTaskEnd path (which contains anti-tamper code, especially the penalty code)
2121
+
// During my analysis of the trace, I found the conditional that decided between the penalty or the clean path.
2122
+
// So instead of patching that, I wanted to figure out WHAT caused that conditional to evaluate to "tampered" in the first place.
2123
+
// I found that, inside of a bunch of horrible obfuscated code, it was evaluating some value inside the renderer.
2124
+
// In this case it almost looked like the frame count.
2125
+
// I analyzed the memory region near this frame count and noticed 6 other values very close in value to the frame count, and they were all being updated
2126
+
// every 500ms or so to the actual frame count.
2127
+
// I noticed that when any of these frame counts were set to 0, the penalty path triggered and the game lagged to hell or crashed.
2128
+
// I then noticed that making these values equal to the frame count always made the clean path trigger, even if the integrity checks were triggered.
spdlog::info("[IntegrityCheckBypass] Found heartbeat cluster at renderer+0x{:X} after {} confirmations at frame count {}, syncing it to frame count every frame now",
0 commit comments