Repository navigation
Conversation
Owner
|
@claude lock in |
The ticket handler used to answer only when one cached blob existed (ConfigStore apptickets\7) and otherwise returned without a reply; the DRM then aborts the launch. Stored tickets were also served unvalidated, and the SteamID spoof was decided independently of the bytes served. TicketAuthority now owns the decision: - validate stored tickets before serving (embedded App ID, size, signature) - derive the expected identity once; the spoof reads the same decision - discover forge bases instead of a fixed list: Lua ids, per-app credentials (both storage kinds), and the client ticket last - best-effort default that records mixed_identity; strict mode optional - optional backend fallback and import validation at load time - log one line per decision
xib031
force-pushed
the
feat/ticket-authority
branch
from
October 13, 2026 05:05
cd3925c to
b02ec4a
Compare
Author
|
All review points addressed:
Repro before/after is in the description. One caveat: the vault stays in the fork build only (it fixed a real cache-clear case here). Not proposing it upstream unless it shows up on a stock build. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds TicketAuthority: the ticket handler answers from validated local material, and one decision drives both the served bytes and the SteamID spoof.
Why
When a DRM-wrapped game launches, Steam asks the client for the app ownership ticket (IClientUser::GetAppOwnershipTicketExtendedData). In the old handler:
Concrete repro (before / after)
State: app configured via addappid; no registry AppTicket for it (HKCU\Software\Valve\Steam\Apps<id>\AppTicket absent); ConfigStore apptickets\7 gone (delete the key, or Steam -> Clear Download Cache).
Same shape inside the Denuvo window with an ETicket but no AppTicket (the old store-only path answered nothing). And a stale stored ticket for another App ID: old served it as-is, new rejects it and forges instead.
What changed
TicketAuthority (src/Utils/Tickets/TicketAuthority.{h,cpp}) owns the decision; the handler call site is one TicketAuthority::Resolve(appId):
Configuration
[tickets]
identity_mode = "best_effort" # or "strict"
Verification
Notes