Skip to content

[BUG] Specific Denuvo titles (old + new) fail with error ...012 despite ticket being read correctly #139

Description

@Tesla697

Prerequisites

  • I have searched existing issues and confirmed this has not been reported.
  • I am using the latest build version from the releases page.

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

  1. 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>
  2. launch one of the affected titles (Sonic Forces 637100, Planet Coaster 1, etc)
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions