Prerequisites
Steam client version
1782257239
Windows version
Windows 11 25H2 (OS Build 26200.8655)
Describe the bug
A bunch of specific Denuvo games just refuse to launch and throw a Denuvo error
that ends in 012. the weird part is the game is definitely reading the ticket -
the AppTicket and ETicket are sitting in HKCU\Software\Valve\Steam\Apps<AppId>
and they're getting picked up fine, but Denuvo still rejects it and won't start.
it's not an old vs new thing either. some old games fail (Sonic Forces 637100,
Planet Coaster 1), some newer ones fail too, and then some old games work
totally fine. so it really seems to be per game.
from what i can tell digging through the hooks, the 012 is basically an identity
mismatch - the ticket has the owner's SteamID in it but GetSteamID is handing
back the real SteamID of whoever's logged in, so Denuvo sees they don't match
and throws 012. the SteamID spoof only kicks in when the auth window is open
(IsAuthorizedPipe), and that only opens once ProtectionScan actually detects the
game as Denuvo. for these specific titles it looks like ProtectionScan just
isn't catching the protection, so the window never opens and the ticket gets
rejected.
one thing i noticed that might be part of it - in ProtectionScan.cpp the
EnumerateModules function skips anything under 80MB before it even parses the PE.
a few of the older games that fail have exes smaller than that, so the exe gets
dropped before it ever gets scanned. that would explain the old ones. but some
of the new games that fail have way bigger exes so that's clearly not the whole
story, there's probably titles where neither the OEP pattern nor the legacy
DENUVO string scan matches and it just misses them.
happy to send logs or the full list of affected games if that helps.
Steps to reproduce
- set up a game normally(sonic forces or planet coaster 1 as an example)with the lua + tickets, AppTicket/ETicket get written
to HKCU\Software\Valve\Steam\Apps<AppId>
- launch one of the affected titles (Sonic Forces 637100, Planet Coaster 1, etc)
- game starts the Denuvo check, reads the ticket, then throws the error ending
in 012 and won't boot
Expected behavior
ProtectionScan detects the game as Denuvo, the auth window opens, GetSteamID
returns the owner's SteamID from the ticket, and the game launches - same as it
does for the titles that already work.
Actual behavior
the ticket is read but ProtectionScan doesn't seem to detect the protection, so
the auth window never opens. GetSteamID hands back the real logged in SteamID
instead of the owner's, Denuvo sees the mismatch and throws 012, game doesn't
launch.
Log files
No response
Lua configuration (if relevant)
-- 637100 Sonic Forces - standard unlock lua (depot keys + tokens redacted)
-- note: manifest pinning is all commented out, so this game is NOT pinned to
-- an old build. tickets aren't in here either - we write the AppTicket/ETicket
-- straight to the registry, so the lua is purely ownership unlock.
addappid(637100) -- Sonic Forces
addappid(637101, 1, "<REDACTED>") -- SonicForces Content
-- shared redists
addappid(228985, 1, "<REDACTED>") -- VC 2013 Redist
addappid(228990, 1, "<REDACTED>") -- DirectX Jun 2010 Redist
-- DLCs
addappid(715850)
addappid(715850, 1, "<REDACTED>") -- Episode Shadow DLC
addappid(715860)
addtoken(715860, "<REDACTED>")
addappid(715860, 1, "<REDACTED>") -- Super Sonic DLC
addappid(715870)
addappid(715870, 1, "<REDACTED>") -- SEGA Pack DLC
addappid(715890)
addtoken(715890, "<REDACTED>")
addappid(715890, 1, "<REDACTED>") -- Sanic T-Shirts DLC
addappid(715900)
addappid(715900, 1, "<REDACTED>") -- Shadow Costume DLC
addappid(715910)
addappid(715910, 1, "<REDACTED>") -- Persona 5 Costume DLC
Additional context
these are steam's own logs (i don't have the OST debug log handy yet, can grab
that next), but they show the launch-then-die pattern for Sonic Forces (637100)
pretty clearly - game starts, spawns the denuvo/game processes, then everything
gets killed within a couple seconds:
streaming_log.txt:
[2026-06-24 04:28:05] Adding process 18436 for gameID 637100
[2026-06-24 04:28:24] Game Recording - game stopped [gameid=637100]
[2026-06-24 04:28:24] Removing process 18436 for gameID 637100
second attempt - spawns the full process cluster, window shows, then instant death:
[2026-06-24 04:30:26] Adding process 16188 for gameID 637100
[2026-06-24 04:30:26] Adding process 15676 for gameID 637100
[2026-06-24 04:30:26] Adding process 19104 for gameID 637100
[2026-06-24 04:30:26] Adding process 20976 for gameID 637100
[2026-06-24 04:30:27] Adding process 5912 for gameID 637100
[2026-06-24 04:30:27] Adding process 1668 for gameID 637100
[2026-06-24 04:30:30] Adding process 16172 for gameID 637100
[2026-06-24 04:30:30] Adding window 2099404 (1) for process 16172 and gameID 637100
[2026-06-24 04:30:32] Game Recording - game stopped [gameid=637100]
[2026-06-24 04:30:32] Removing process 16172 for gameID 637100
webhelper_js.txt:
[2026-06-24 04:28:04] OnGameActionUserRequest: 637100 LaunchApp CreatingProcess
[2026-06-24 04:29:45] OnGameActionUserRequest: 637100 LaunchApp CreatingProcess
window comes up at 04:30:30 and the whole thing is dead by 04:30:32, so denuvo is
rejecting it basically the moment it boots. i'll get the OST DenuvoAuth debug log
next so you can see the actual scan result.
Prerequisites
Steam client version
1782257239
Windows version
Windows 11 25H2 (OS Build 26200.8655)
Describe the bug
A bunch of specific Denuvo games just refuse to launch and throw a Denuvo error
that ends in 012. the weird part is the game is definitely reading the ticket -
the AppTicket and ETicket are sitting in HKCU\Software\Valve\Steam\Apps<AppId>
and they're getting picked up fine, but Denuvo still rejects it and won't start.
it's not an old vs new thing either. some old games fail (Sonic Forces 637100,
Planet Coaster 1), some newer ones fail too, and then some old games work
totally fine. so it really seems to be per game.
from what i can tell digging through the hooks, the 012 is basically an identity
mismatch - the ticket has the owner's SteamID in it but GetSteamID is handing
back the real SteamID of whoever's logged in, so Denuvo sees they don't match
and throws 012. the SteamID spoof only kicks in when the auth window is open
(IsAuthorizedPipe), and that only opens once ProtectionScan actually detects the
game as Denuvo. for these specific titles it looks like ProtectionScan just
isn't catching the protection, so the window never opens and the ticket gets
rejected.
one thing i noticed that might be part of it - in ProtectionScan.cpp the
EnumerateModules function skips anything under 80MB before it even parses the PE.
a few of the older games that fail have exes smaller than that, so the exe gets
dropped before it ever gets scanned. that would explain the old ones. but some
of the new games that fail have way bigger exes so that's clearly not the whole
story, there's probably titles where neither the OEP pattern nor the legacy
DENUVO string scan matches and it just misses them.
happy to send logs or the full list of affected games if that helps.
Steps to reproduce
to HKCU\Software\Valve\Steam\Apps<AppId>
in 012 and won't boot
Expected behavior
ProtectionScan detects the game as Denuvo, the auth window opens, GetSteamID
returns the owner's SteamID from the ticket, and the game launches - same as it
does for the titles that already work.
Actual behavior
the ticket is read but ProtectionScan doesn't seem to detect the protection, so
the auth window never opens. GetSteamID hands back the real logged in SteamID
instead of the owner's, Denuvo sees the mismatch and throws 012, game doesn't
launch.
Log files
No response
Lua configuration (if relevant)
Additional context
these are steam's own logs (i don't have the OST debug log handy yet, can grab
that next), but they show the launch-then-die pattern for Sonic Forces (637100)
pretty clearly - game starts, spawns the denuvo/game processes, then everything
gets killed within a couple seconds:
streaming_log.txt:
[2026-06-24 04:28:05] Adding process 18436 for gameID 637100
[2026-06-24 04:28:24] Game Recording - game stopped [gameid=637100]
[2026-06-24 04:28:24] Removing process 18436 for gameID 637100
second attempt - spawns the full process cluster, window shows, then instant death:
[2026-06-24 04:30:26] Adding process 16188 for gameID 637100
[2026-06-24 04:30:26] Adding process 15676 for gameID 637100
[2026-06-24 04:30:26] Adding process 19104 for gameID 637100
[2026-06-24 04:30:26] Adding process 20976 for gameID 637100
[2026-06-24 04:30:27] Adding process 5912 for gameID 637100
[2026-06-24 04:30:27] Adding process 1668 for gameID 637100
[2026-06-24 04:30:30] Adding process 16172 for gameID 637100
[2026-06-24 04:30:30] Adding window 2099404 (1) for process 16172 and gameID 637100
[2026-06-24 04:30:32] Game Recording - game stopped [gameid=637100]
[2026-06-24 04:30:32] Removing process 16172 for gameID 637100
webhelper_js.txt:
[2026-06-24 04:28:04] OnGameActionUserRequest: 637100 LaunchApp CreatingProcess
[2026-06-24 04:29:45] OnGameActionUserRequest: 637100 LaunchApp CreatingProcess
window comes up at 04:30:30 and the whole thing is dead by 04:30:32, so denuvo is
rejecting it basically the moment it boots. i'll get the OST DenuvoAuth debug log
next so you can see the actual scan result.