Skip to content

v2.1.6 — self-checks (status.json + Status page), self-healing signatures

Choose a tag to compare

@scros22 scros22 released this 25 Sep 15:17
· 4 commits to main since this release

Dumper-quality release for CS2 build 14184. The dump is unchanged; the dumper now checks itself and repairs stale signatures.

Self-checks after every dump

The dumper runs a set of checks against the live process and writes include/status.json. A failed check makes it exit 1, so a broken dump cannot be published by accident. Four of the five defects fixed in v2.1.5 would have been caught by these:

  • global_twins — every a2x-style dwXxx global must resolve to the same address as its signature twin (dwGameRules ↔ pGameRules, dwSensitivity ↔ pSensitivity, dwSoundSystem ↔ pSoundSystem, … 11 pairs).
  • globals_in_data / globals_not_code — globals must land in a data section, never on code or a vtable.
  • function_prologues — function targets must sit right after padding (deliberate patch sites are exempt).
  • protobufs_vs_engine — the protobuf layouts read from the reflection tables must equal the hand-verified engine structs (CBaseUserCmdPB, CSubtickMoveStep, …).
  • signatures_resolve, patterns_unique, patterns_healed, weapons_snapshot — coverage, uniqueness, re-anchoring, weapon-table coverage. The game's ClientVersion / PatchVersion from steam.inf are recorded too.

On the site: a new Status tab shows every check with its details, unresolved signatures by name, auto-healed entries and known issues; a banner appears on every page when a check failed. GET /api/status serves the same, and the Discord bot has /status.

Self-healing signatures

When a database pattern stops matching after a CS2 update but the function itself did not change, the dumper now re-anchors it on its own: the entry's 24 prologue bytes from the previous dump (--previous <dir>, default include) are searched in the new module; exactly one hit after padding means the function only moved, so a fresh pattern that is unique in .text is generated there and published in place of the stale one (flagged with healed_from). Verified by breaking CreateMove and FrameStageNotify on purpose: both came back at their correct addresses with new unique patterns.

py tools/verify/heal.py --apply copies healed patterns into src/patterns/database.rs. Globals and functions whose prologue really changed stay on the unresolved list until they are fixed by hand.

Tools

tools/verify/ carries the offline rescan (dbscan.py, runs against the DLLs on disk without the game), the deterministic pattern generator (genpat.py) and heal.py. All documented in the wiki page Status and Self-Healing.

cs2-sdk.exe below. Run it as administrator with CS2 open; dump in a match for the full weapons list.