nmarshall commited on
Commit
e678ca6
·
1 Parent(s): e639531

Reconcile native byte regions and trace authentication drop behavior

Browse files
docs/FINDINGS.md CHANGED
@@ -185,3 +185,8 @@ Exact native fork/source revision, runtime resource lookup, legacy launch enviro
185
  **F-030 — Observed: SDL/client Mach-O debug-map ranges.** Raw STABS yield 1,012 nonoverlapping SDL function ranges associated with 78 source/object entries, plus six client SDLMain launcher ranges. No local/parameter/type-description classes were observed. Source paths suggest SDL 1.2.15 build provenance, not a verified upstream implementation match. SDL text still contains 524 bytes outside these ranges. [META-001](research/native/METADATA.md).
186
 
187
  **F-031 — Observed: Windows resource contents and icon discrepancy.** The client PE has nine leaves: seven icon images, one string block and one icon group, all language 1033; the dedicated PE has no resource directory. A reconstructed ICO preserves every image byte. Four 32-bit image payloads exceed their standard DIB pixel/mask extent; their surplus remains preserved and unclassified. [META-002/003](research/native/METADATA.md).
 
 
 
 
 
 
185
  **F-030 — Observed: SDL/client Mach-O debug-map ranges.** Raw STABS yield 1,012 nonoverlapping SDL function ranges associated with 78 source/object entries, plus six client SDLMain launcher ranges. No local/parameter/type-description classes were observed. Source paths suggest SDL 1.2.15 build provenance, not a verified upstream implementation match. SDL text still contains 524 bytes outside these ranges. [META-001](research/native/METADATA.md).
186
 
187
  **F-031 — Observed: Windows resource contents and icon discrepancy.** The client PE has nine leaves: seven icon images, one string block and one icon group, all language 1033; the dedicated PE has no resource directory. A reconstructed ICO preserves every image byte. Four 32-bit image payloads exceed their standard DIB pixel/mask extent; their surplus remains preserved and unclassified. [META-002/003](research/native/METADATA.md).
188
+
189
+
190
+ **F-032 — Observed: bounded native byte regions reconciled.** The SDL text bytes outside debug-map function ranges are 70 NOP runs totaling 524 bytes. Windows client resource bytes partition into 353,268 payload bytes and 520 tree-structure bytes, with no unreferenced gaps. This resolves the previously unclassified bytes in these two regions, not whole-binary semantics. [COV-001/002](research/native/COVERAGE.md).
191
+
192
+ **F-033 — Observed/inferred: authentication drop boundary and deferred QVM branch.** Linux ELF64 trap 603 receives index/broadcast text/disconnect reason; valid completion and invalid-index guards both return zero. The QVM caller validates slot and states 1/2; state 1 calls a helper with record buffers and limits 128/256, then sets a flag, while state 2 invokes the native service. Deferred-consumer behavior, state names, pointer errors and other platforms remain open. [AUTH-001/002](research/AUTH_DROP.md).
docs/RESEARCH_LEDGER.md CHANGED
@@ -78,3 +78,8 @@ Completed RE-211–213: extra entry command evidence, six QVM network/auth call-
78
  ## 2026-10-11 — Native metadata follow-up
79
 
80
  Completed static milestones RE-214–216 with `analyze_native_metadata.py`: all 4,753 Mach-O STABS records retained, 1,018 paired function ranges hashed, nine Windows resource leaves preserved by variant, string slots decoded, icon group reconstructed and unexpected image extents recorded. Findings F-030/031 and META-001–003 distinguish structural recovery from source matching or rendering semantics. Seven tests cover malformed structures and real function/resource reconstruction. New derived binary evidence stays under Xet-filtered assets; originals remain in ignored cache. RE-217/218 track icon surplus rendering and uncovered byte regions.
 
 
 
 
 
 
78
  ## 2026-10-11 — Native metadata follow-up
79
 
80
  Completed static milestones RE-214–216 with `analyze_native_metadata.py`: all 4,753 Mach-O STABS records retained, 1,018 paired function ranges hashed, nine Windows resource leaves preserved by variant, string slots decoded, icon group reconstructed and unexpected image extents recorded. Findings F-030/031 and META-001–003 distinguish structural recovery from source matching or rendering semantics. Seven tests cover malformed structures and real function/resource reconstruction. New derived binary evidence stays under Xet-filtered assets; originals remain in ignored cache. RE-217/218 track icon surplus rendering and uncovered byte regions.
81
+
82
+
83
+ ## 2026-10-11 — Byte reconciliation and authentication drop boundary
84
+
85
+ Completed RE-218–220 with `analyze_native_coverage.py` and `analyze_auth_drop.py`: bounded byte partitions explain all SDL text gaps and resource-tree bytes; focused native/QVM evidence recovers broadcast/disconnect parameters, invalid-index zero returns and deferred versus immediate caller branches. F-032/033, COV-001/002 and AUTH-001/002 retain source hashes and limitations. Seven new tests verify interval accounting, malformed bounds, guard convergence, result-preserving epilogues, bounded literals and supplied fixtures. Static literal scanning excludes nonallocated ELF sections to avoid interpreting small numeric constants as offsets into compiler-comment sections. No original game code was executed.
docs/REVERSE_ENGINEERING_TODO.md CHANGED
@@ -257,4 +257,7 @@ Purpose: turn the supplied installation into an evidence-backed specification of
257
  - [x] RE-215 Enumerate every supplied Windows PE resource leaf by type/name/language, preserve all variants, decode the string block and reconstruct the linked icon group. **Evidence:** nine client leaves, zero dedicated leaves, seven-image ICO with identical payloads, META-002.
258
  - [x] RE-216 Calculate supplied icon DIB header/palette/pixel/mask extents; hash and preserve unexpected surplus bytes. **Evidence:** META-003 and per-leaf structural reports. This completes extent analysis, not visual/pixel semantics.
259
  - [ ] RE-217 Explain/render the four 32-bit Windows icon payloads with surplus bytes; compare alpha/mask behavior across reference decoders before normalizing them.
260
- - [ ] RE-218 Reconcile the 524 SDL text bytes outside paired debug-map functions and all Windows resource-region metadata/padding gaps; preserve evidence for every byte classification.
 
 
 
 
257
  - [x] RE-215 Enumerate every supplied Windows PE resource leaf by type/name/language, preserve all variants, decode the string block and reconstruct the linked icon group. **Evidence:** nine client leaves, zero dedicated leaves, seven-image ICO with identical payloads, META-002.
258
  - [x] RE-216 Calculate supplied icon DIB header/palette/pixel/mask extents; hash and preserve unexpected surplus bytes. **Evidence:** META-003 and per-leaf structural reports. This completes extent analysis, not visual/pixel semantics.
259
  - [ ] RE-217 Explain/render the four 32-bit Windows icon payloads with surplus bytes; compare alpha/mask behavior across reference decoders before normalizing them.
260
+ - [x] RE-218 Reconcile the 524 SDL text bytes outside paired debug-map functions and all Windows resource-region metadata/padding gaps; preserve evidence for every byte classification. **Evidence:** `analyze_native_coverage.py`, source-hashed segment partitions and COV-001/002; 70 SDL NOP runs account for all 524 bytes, Windows region accounts for 353,268 payload + 520 structure bytes with no gaps. Byte patterns do not establish runtime reachability.
261
+ - [x] RE-219 Trace Linux ELF64 trap 603 argument meanings, both invalid-index continuations and common return epilogues. **Evidence:** `analyze_auth_drop.py`, `auth-drop.json`, AUTH-001; broadcast/disconnect formats and zero returns verified. Complete helper behavior/all-platform parity remain RE-206.
262
+ - [x] RE-220 Recover the QVM trap-603 caller's slot/state guards, record stride and state-1 storage versus state-2 immediate service call. **Evidence:** AUTH-002 and full caller instructions; state names, copy-helper behavior and deferred consumer remain open.
263
+ - [ ] RE-221 Trace the QVM record flag at offset 3588, helper 69338 and state transitions; specify deferred authentication drops, buffer limits, terminator behavior and reentrancy with runtime fixtures.
docs/research/AUTH_DROP.md ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Authentication drop service: Linux boundary and QVM state branches
2
+
3
+ Static pass, 2026-10-11. Reproduce with `python3 scripts/analyze_auth_drop.py`; validate with `python3 scripts/test_native_followup.py`. [Generated evidence](auth-drop.json) preserves original hashes, native dispatch cases, invalid-index continuations, common return epilogues, complete selected helper bodies and the QVM caller. No original game code or network operation was executed.
4
+
5
+ ## AUTH-001: argument meanings and invalid-index result
6
+
7
+ For Linux ELF64 game trap **603**, slots 1–3 are a signed client index, a VM pointer to a broadcast message, and a VM pointer to a disconnect reason. Both pointers are converted through `VM_ArgPtr` before the native index guard. An index below zero or at least `sv_maxclients` branches to `xor %eax,%eax` and the common result-preserving return epilogue. **Both valid dispatch completion and invalid-index dispatch completion return zero.** The recognizer checks both guards converge and rejects an epilogue that modifies the result or transfers control unexpectedly.
8
+
9
+ The helper retains its second parameter in `%r13` and third in `%r14`. If the second string's first byte is nonzero, it supplies that string to `SV_SendServerCommand` with client pointer zero and format `print "%s\n"`. The third parameter is supplied with the selected client pointer and format `disconnect "%s"`. This supports the descriptive parameter meanings, rather than merely observing two pointers. Strings and their native instruction locations are preserved in the report.
10
+
11
+ Dedicated invalid-index continuation: `0x40b41a`, common return `0x40b190`. Client-engine equivalents: `0x47338a`, `0x473100`. The helper entries are `0x407a14` and `0x472364`. These are preferred virtual addresses, not file offsets.
12
+
13
+ The helper also calls game entry command 5, clears userinfo and transitions the client state to numeric value 1; its diagnostic format is `Going to CS_ZOMBIE for %s\n`. File cleanup, allocation release, bot handling, demo-stop command construction and heartbeat behavior occur in conditional paths retained in the full body. This pass establishes the boundary and selected string effects, not all cleanup ordering and state semantics.
14
+
15
+ ## AUTH-002: QVM caller validates and can defer
16
+
17
+ The sole observed trap-603 call is instruction **165943**, inside the function beginning at **165818**. Its 32-byte frame reads incoming arguments from local offsets 40, 44 and 48. It validates the signed index against zero and the VM global at address 34992524. Invalid slots print `auth: drop error - bad client slot: %i\n` and skip the trap. It derives a record pointer from the base stored at VM address 34992496 plus `index * 6336` and reads its state at offset 468.
18
+
19
+ Only numeric states **1 and 2** pass the active-state check. Other states print `auth: drop error - client %i is not active\n` and skip the trap. For state 1, it calls helper instruction 69338 with the two message pointers and record destinations at offsets 3204 and 3332, passing limits 128 and 256. It sets the record field at offset 3588 to one and exits without invoking trap 603. These are observed storage/flag operations consistent with deferred handling; helper semantics and the flag consumer remain untraced.
20
+
21
+ For state 2, it passes `AccountKick: %i - %s\n`, the index and broadcast-message pointer to helper 7259, clears offset 3588 to zero and then invokes trap 603 with index/message/reason. The native helper independently checks the engine-side index. VM record stride 6336 and native client stride `0x2df40` describe distinct data layouts; a Rust port must not conflate them.
22
+
23
+ ## Remaining contract work
24
+
25
+ - Trace the state-1 flag consumer and helper 69338 to establish deferred processing, truncation and terminator rules. Recover authoritative names for the two VM states and every affected field.
26
+ - Specify null/invalid VM pointers and conversion behavior, especially because conversion precedes the native index check. Zero return is not proof that all invalid pointer inputs are harmless.
27
+ - Trace all helper early exits and cleanup side effects, the game command-5 callback and state transition ordering, then compare other native platforms.
28
+ - Add deterministic reference fixtures for invalid/inactive slots, deferred state, immediate state, empty broadcast text, disconnect reasons and repeated drops. No runtime conformance is claimed by static recognizer tests.
29
+
30
+ RE-219/220 record completed static milestones. RE-206 remains open for full error/helper behavior and all-platform parity.
docs/research/README.md CHANGED
@@ -10,6 +10,8 @@ The [extension follow-up](VM_EXTENSIONS.md) traces all four extra game/UI entry
10
 
11
  The [native metadata follow-up](native/METADATA.md) recovers SDL/client debug-map ranges and all supplied Windows resource leaves, reconstructs the icon group and records unclassified icon surplus.
12
 
 
 
13
  ## Reproduce
14
 
15
  From the repository root, with the verified source installation and extracted assets present:
@@ -19,10 +21,11 @@ python3 scripts/analyze_binaries.py
19
  python3 scripts/test_binary_analysis.py
20
  python3 scripts/test_vm_extensions.py
21
  python3 scripts/test_native_metadata.py
 
22
  python3 scripts/storage_policy.py check --require-setup
23
  ```
24
 
25
- The pipeline runs `fetch_analysis_references.py`, `analyze_qvm.py`, `analyze_native.py`, `analyze_vm_abi.py`, `analyze_native_dispatch.py`, `analyze_vm_extensions.py`, and `analyze_native_metadata.py` in that order. Python 3.9+ and **LLVM objdump** with x86 ELF/COFF/Mach-O support are required. This pass used Apple LLVM 17.0.0 on macOS arm64; it disassembled x86 images without running them. Upstream references are downloaded only if absent, checked against the committed SHA-256 manifest, and cached under `.cache/research/upstream/`. A clone also needs `git lfs pull` to obtain the derived artifacts/extracted members.
26
 
27
  Generated JSON/JSONL and compressed evidence are regenerated in place; keep prose notes in Markdown. Rerunning the four analysis stages reproduced every generated report and gzip artifact byte-for-byte on the same toolchain. gzip timestamps and stored filenames are fixed. Different objdump versions can produce different disassembly text, so tool version and uncompressed evidence hashes are recorded. Reports are UTF-8 normal Git text, with individual files below the storage policy's 2 MiB limit.
28
 
 
10
 
11
  The [native metadata follow-up](native/METADATA.md) recovers SDL/client debug-map ranges and all supplied Windows resource leaves, reconstructs the icon group and records unclassified icon surplus.
12
 
13
+ [Byte reconciliation](native/COVERAGE.md) now explains the SDL text gaps and entire Windows resource region; [authentication drop analysis](AUTH_DROP.md) traces parameter meanings, invalid-index returns and QVM state branches.
14
+
15
  ## Reproduce
16
 
17
  From the repository root, with the verified source installation and extracted assets present:
 
21
  python3 scripts/test_binary_analysis.py
22
  python3 scripts/test_vm_extensions.py
23
  python3 scripts/test_native_metadata.py
24
+ python3 scripts/test_native_followup.py
25
  python3 scripts/storage_policy.py check --require-setup
26
  ```
27
 
28
+ The pipeline runs `fetch_analysis_references.py`, `analyze_qvm.py`, `analyze_native.py`, `analyze_vm_abi.py`, `analyze_native_dispatch.py`, `analyze_vm_extensions.py`, `analyze_native_metadata.py`, `analyze_native_coverage.py`, and `analyze_auth_drop.py` in that order. Python 3.9+ and **LLVM objdump** with x86 ELF/COFF/Mach-O support are required. This pass used Apple LLVM 17.0.0 on macOS arm64; it disassembled x86 images without running them. Upstream references are downloaded only if absent, checked against the committed SHA-256 manifest, and cached under `.cache/research/upstream/`. A clone also needs `git lfs pull` to obtain the derived artifacts/extracted members.
29
 
30
  Generated JSON/JSONL and compressed evidence are regenerated in place; keep prose notes in Markdown. Rerunning the four analysis stages reproduced every generated report and gzip artifact byte-for-byte on the same toolchain. gzip timestamps and stored filenames are fixed. Different objdump versions can produce different disassembly text, so tool version and uncompressed evidence hashes are recorded. Reports are UTF-8 normal Git text, with individual files below the storage policy's 2 MiB limit.
31
 
docs/research/VM_EXTENSIONS.md CHANGED
@@ -48,3 +48,5 @@ This gives a concrete replacement boundary for address parsing and packet sendin
48
  - Implement Rust address/message types only after semantic serialization contracts exist. Preserve compatibility policy for unavailable historical authentication services as a separate design decision.
49
 
50
  The broad RE-205 and RE-206 tasks remain open because runtime fixtures and all-platform behavior are still missing. Focused evidence-collection milestones are complete in the main checklist. Native caller scanning reports local candidates and intentionally discards a candidate after a branch, call, return or write to the command register; alternative incoming branches and unusual instruction aliases are outside this recognizer's scope.
 
 
 
48
  - Implement Rust address/message types only after semantic serialization contracts exist. Preserve compatibility policy for unavailable historical authentication services as a separate design decision.
49
 
50
  The broad RE-205 and RE-206 tasks remain open because runtime fixtures and all-platform behavior are still missing. Focused evidence-collection milestones are complete in the main checklist. Native caller scanning reports local candidates and intentionally discards a candidate after a branch, call, return or write to the command register; alternative incoming branches and unusual instruction aliases are outside this recognizer's scope.
51
+
52
+ Follow-up: [AUTH-001/002](AUTH_DROP.md) recovers the two drop parameter meanings, proves zero results on both Linux ELF64 invalid-index continuations, and traces the QVM caller's state-dependent storage/service branches. Earlier unknowns above are superseded only for these specific static boundaries.
docs/research/auth-drop.json ADDED
@@ -0,0 +1,1775 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limitations": "Linux ELF64 static boundary evidence. Literal operands are candidates, not whole-program dataflow. No runtime reference fixtures or all-platform contract.",
3
+ "native": {
4
+ "linux--Quake3-UrT-Ded.x86_64": {
5
+ "case": {
6
+ "direct_call_or_jump_labels": [
7
+ "SV_Auth_DropClient",
8
+ "SV_GameSystemCalls",
9
+ "VM_ArgPtr"
10
+ ],
11
+ "first_instructions": [
12
+ "40d4fa: 48 8b 7f 18 \tmovq\t0x18(%rdi), %rdi",
13
+ "40d4fe: e8 4d 4b 04 00 \tcallq\t0x452050 <VM_ArgPtr>",
14
+ "40d503: 48 8b 7d 10 \tmovq\t0x10(%rbp), %rdi",
15
+ "40d507: 48 89 c3 \tmovq\t%rax, %rbx",
16
+ "40d50a: e8 41 4b 04 00 \tcallq\t0x452050 <VM_ArgPtr>",
17
+ "40d50f: 8b 55 08 \tmovl\t0x8(%rbp), %edx",
18
+ "40d512: 85 d2 \ttestl\t%edx, %edx",
19
+ "40d514: 0f 88 00 df ff ff \tjs\t0x40b41a <SV_GameSystemCalls+0x2de>",
20
+ "40d51a: 48 8b 35 37 59 40 00 \tmovq\t0x405937(%rip), %rsi # 0x812e58 <sv_maxclients>",
21
+ "40d521: 3b 56 30 \tcmpl\t0x30(%rsi), %edx",
22
+ "40d524: 0f 8d f0 de ff ff \tjge\t0x40b41a <SV_GameSystemCalls+0x2de>",
23
+ "40d52a: 48 63 ea \tmovslq\t%edx, %rbp",
24
+ "40d52d: 48 89 c6 \tmovq\t%rax, %rsi",
25
+ "40d530: 48 89 da \tmovq\t%rbx, %rdx",
26
+ "40d533: 48 69 fd 40 df 02 00 \timulq\t$0x2df40, %rbp, %rdi # imm = 0x2DF40",
27
+ "40d53a: 48 03 3d 6f 59 40 00 \taddq\t0x40596f(%rip), %rdi # 0x812eb0 <svs+0x10>",
28
+ "40d541: e8 ce a4 ff ff \tcallq\t0x407a14 <SV_Auth_DropClient>",
29
+ "40d546: 31 c0 \txorl\t%eax, %eax",
30
+ "40d548: e9 43 dc ff ff \tjmp\t0x40b190 <SV_GameSystemCalls+0x54>"
31
+ ],
32
+ "numbers_sharing_target": [
33
+ 603
34
+ ],
35
+ "target_address": 4248826
36
+ },
37
+ "disassembly_sha256": "052ab3f6a3839fb43519fc71dea4dddc8d2d32ddaec7af312b80c2b17ce7c416",
38
+ "function": {
39
+ "address": 4225556,
40
+ "lines": [
41
+ " 407a14: 41 56 \tpushq\t%r14",
42
+ " 407a16: 49 89 d6 \tmovq\t%rdx, %r14",
43
+ " 407a19: 41 55 \tpushq\t%r13",
44
+ " 407a1b: 49 89 f5 \tmovq\t%rsi, %r13",
45
+ " 407a1e: 41 54 \tpushq\t%r12",
46
+ " 407a20: 55 \tpushq\t%rbp",
47
+ " 407a21: 53 \tpushq\t%rbx",
48
+ " 407a22: 83 3f 01 \tcmpl\t$0x1, (%rdi)",
49
+ " 407a25: 48 89 fb \tmovq\t%rdi, %rbx",
50
+ " 407a28: 0f 84 6d 03 00 00 \tje\t0x407d9b <SV_Auth_DropClient+0x387>",
51
+ " 407a2e: 8b 87 e4 4e 02 00 \tmovl\t0x24ee4(%rdi), %eax",
52
+ " 407a34: 85 c0 \ttestl\t%eax, %eax",
53
+ " 407a36: 0f 85 68 03 00 00 \tjne\t0x407da4 <SV_Auth_DropClient+0x390>",
54
+ " 407a3c: 8b bb a8 0c 02 00 \tmovl\t0x20ca8(%rbx), %edi",
55
+ " 407a42: 85 ff \ttestl\t%edi, %edi",
56
+ " 407a44: 0f 85 e1 04 00 00 \tjne\t0x407f2b <SV_Auth_DropClient+0x517>",
57
+ " 407a4a: 48 8b bb c0 0c 02 00 \tmovq\t0x20cc0(%rbx), %rdi",
58
+ " 407a51: c7 83 a8 0c 02 00 00 00 00 00\tmovl\t$0x0, 0x20ca8(%rbx)",
59
+ " 407a5b: c6 83 68 0c 02 00 00 \tmovb\t$0x0, 0x20c68(%rbx)",
60
+ " 407a62: 48 85 ff \ttestq\t%rdi, %rdi",
61
+ " 407a65: 74 10 \tje\t0x407a77 <SV_Auth_DropClient+0x63>",
62
+ " 407a67: e8 56 6c 02 00 \tcallq\t0x42e6c2 <Z_Free>",
63
+ " 407a6c: 48 c7 83 c0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cc0(%rbx)",
64
+ " 407a77: 48 8b bb c8 0c 02 00 \tmovq\t0x20cc8(%rbx), %rdi",
65
+ " 407a7e: 48 85 ff \ttestq\t%rdi, %rdi",
66
+ " 407a81: 74 10 \tje\t0x407a93 <SV_Auth_DropClient+0x7f>",
67
+ " 407a83: e8 3a 6c 02 00 \tcallq\t0x42e6c2 <Z_Free>",
68
+ " 407a88: 48 c7 83 c8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cc8(%rbx)",
69
+ " 407a93: 48 8b bb d0 0c 02 00 \tmovq\t0x20cd0(%rbx), %rdi",
70
+ " 407a9a: 48 85 ff \ttestq\t%rdi, %rdi",
71
+ " 407a9d: 74 10 \tje\t0x407aaf <SV_Auth_DropClient+0x9b>",
72
+ " 407a9f: e8 1e 6c 02 00 \tcallq\t0x42e6c2 <Z_Free>",
73
+ " 407aa4: 48 c7 83 d0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cd0(%rbx)",
74
+ " 407aaf: 48 8b bb d8 0c 02 00 \tmovq\t0x20cd8(%rbx), %rdi",
75
+ " 407ab6: 48 85 ff \ttestq\t%rdi, %rdi",
76
+ " 407ab9: 74 10 \tje\t0x407acb <SV_Auth_DropClient+0xb7>",
77
+ " 407abb: e8 02 6c 02 00 \tcallq\t0x42e6c2 <Z_Free>",
78
+ " 407ac0: 48 c7 83 d8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cd8(%rbx)",
79
+ " 407acb: 48 8b bb e0 0c 02 00 \tmovq\t0x20ce0(%rbx), %rdi",
80
+ " 407ad2: 48 85 ff \ttestq\t%rdi, %rdi",
81
+ " 407ad5: 74 10 \tje\t0x407ae7 <SV_Auth_DropClient+0xd3>",
82
+ " 407ad7: e8 e6 6b 02 00 \tcallq\t0x42e6c2 <Z_Free>",
83
+ " 407adc: 48 c7 83 e0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20ce0(%rbx)",
84
+ " 407ae7: 48 8b bb e8 0c 02 00 \tmovq\t0x20ce8(%rbx), %rdi",
85
+ " 407aee: 48 85 ff \ttestq\t%rdi, %rdi",
86
+ " 407af1: 74 10 \tje\t0x407b03 <SV_Auth_DropClient+0xef>",
87
+ " 407af3: e8 ca 6b 02 00 \tcallq\t0x42e6c2 <Z_Free>",
88
+ " 407af8: 48 c7 83 e8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20ce8(%rbx)",
89
+ " 407b03: 48 8b bb f0 0c 02 00 \tmovq\t0x20cf0(%rbx), %rdi",
90
+ " 407b0a: 48 85 ff \ttestq\t%rdi, %rdi",
91
+ " 407b0d: 74 10 \tje\t0x407b1f <SV_Auth_DropClient+0x10b>",
92
+ " 407b0f: e8 ae 6b 02 00 \tcallq\t0x42e6c2 <Z_Free>",
93
+ " 407b14: 48 c7 83 f0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cf0(%rbx)",
94
+ " 407b1f: 48 8b bb f8 0c 02 00 \tmovq\t0x20cf8(%rbx), %rdi",
95
+ " 407b26: 48 85 ff \ttestq\t%rdi, %rdi",
96
+ " 407b29: 74 10 \tje\t0x407b3b <SV_Auth_DropClient+0x127>",
97
+ " 407b2b: e8 92 6b 02 00 \tcallq\t0x42e6c2 <Z_Free>",
98
+ " 407b30: 48 c7 83 f8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cf8(%rbx)",
99
+ " 407b3b: 41 80 7d 00 00 \tcmpb\t$0x0, (%r13)",
100
+ " 407b40: 0f 85 56 04 00 00 \tjne\t0x407f9c <SV_Auth_DropClient+0x588>",
101
+ " 407b46: 8b bb a8 0c 02 00 \tmovl\t0x20ca8(%rbx), %edi",
102
+ " 407b4c: 85 ff \ttestl\t%edi, %edi",
103
+ " 407b4e: 0f 85 34 04 00 00 \tjne\t0x407f88 <SV_Auth_DropClient+0x574>",
104
+ " 407b54: 8b 93 20 cf 02 00 \tmovl\t0x2cf20(%rbx), %edx",
105
+ " 407b5a: 85 d2 \ttestl\t%edx, %edx",
106
+ " 407b5c: 0f 85 ef 03 00 00 \tjne\t0x407f51 <SV_Auth_DropClient+0x53d>",
107
+ " 407b62: 48 89 da \tmovq\t%rbx, %rdx",
108
+ " 407b65: 48 2b 15 44 b3 40 00 \tsubq\t0x40b344(%rip), %rdx # 0x812eb0 <svs+0x10>",
109
+ " 407b6c: 48 bd d5 05 41 79 fb 43 2f 35\tmovabsq\t$0x352f43fb794105d5, %rbp # imm = 0x352F43FB794105D5",
110
+ " 407b76: 48 8b 3d 43 58 2d 00 \tmovq\t0x2d5843(%rip), %rdi # 0x6dd3c0 <gvm>",
111
+ " 407b7d: be 05 00 00 00 \tmovl\t$0x5, %esi",
112
+ " 407b82: 31 c0 \txorl\t%eax, %eax",
113
+ " 407b84: 48 c1 fa 06 \tsarq\t$0x6, %rdx",
114
+ " 407b88: 48 0f af d5 \timulq\t%rbp, %rdx",
115
+ " 407b8c: e8 dd ac 04 00 \tcallq\t0x45286e <VM_Call>",
116
+ " 407b91: be b2 e9 4a 00 \tmovl\t$0x4ae9b2, %esi # imm = 0x4AE9B2",
117
+ " 407b96: 31 c0 \txorl\t%eax, %eax",
118
+ " 407b98: 4c 89 f2 \tmovq\t%r14, %rdx",
119
+ " 407b9b: 48 89 df \tmovq\t%rbx, %rdi",
120
+ " 407b9e: e8 0b a7 00 00 \tcallq\t0x4122ae <SV_SendServerCommand>",
121
+ " 407ba3: 8b b3 e4 4e 02 00 \tmovl\t0x24ee4(%rbx), %esi",
122
+ " 407ba9: 85 f6 \ttestl\t%esi, %esi",
123
+ " 407bab: 0f 84 84 03 00 00 \tje\t0x407f35 <SV_Auth_DropClient+0x521>",
124
+ " 407bb1: 48 89 df \tmovq\t%rbx, %rdi",
125
+ " 407bb4: 48 2b 3d f5 b2 40 00 \tsubq\t0x40b2f5(%rip), %rdi # 0x812eb0 <svs+0x10>",
126
+ " 407bbb: be c4 de 4b 00 \tmovl\t$0x4bdec4, %esi # imm = 0x4BDEC4",
127
+ " 407bc0: 48 c1 ff 06 \tsarq\t$0x6, %rdi",
128
+ " 407bc4: 48 0f af fd \timulq\t%rbp, %rdi",
129
+ " 407bc8: e8 1f 66 00 00 \tcallq\t0x40e1ec <SV_SetUserinfo>",
130
+ " 407bcd: 48 8d b3 48 0c 02 00 \tleaq\t0x20c48(%rbx), %rsi",
131
+ " 407bd4: bf c2 e9 4a 00 \tmovl\t$0x4ae9c2, %edi # imm = 0x4AE9C2",
132
+ " 407bd9: 31 c0 \txorl\t%eax, %eax",
133
+ " 407bdb: e8 cc 60 02 00 \tcallq\t0x42dcac <Com_DPrintf>",
134
+ " 407be0: c7 03 01 00 00 00 \tmovl\t$0x1, (%rbx)",
135
+ " 407be6: 48 8b 1d 6b b2 40 00 \tmovq\t0x40b26b(%rip), %rbx # 0x812e58 <sv_maxclients>",
136
+ " 407bed: 8b 7b 30 \tmovl\t0x30(%rbx), %edi",
137
+ " 407bf0: 85 ff \ttestl\t%edi, %edi",
138
+ " 407bf2: 0f 8e 07 03 00 00 \tjle\t0x407eff <SV_Auth_DropClient+0x4eb>",
139
+ " 407bf8: 48 8b 05 b1 b2 40 00 \tmovq\t0x40b2b1(%rip), %rax # 0x812eb0 <svs+0x10>",
140
+ " 407bff: 83 38 01 \tcmpl\t$0x1, (%rax)",
141
+ " 407c02: 0f 87 f7 02 00 00 \tja\t0x407eff <SV_Auth_DropClient+0x4eb>",
142
+ " 407c08: 8d 6f ff \tleal\t-0x1(%rdi), %ebp",
143
+ " 407c0b: 31 f6 \txorl\t%esi, %esi",
144
+ " 407c0d: 48 89 c2 \tmovq\t%rax, %rdx",
145
+ " 407c10: 89 e9 \tmovl\t%ebp, %ecx",
146
+ " 407c12: 83 e1 07 \tandl\t$0x7, %ecx",
147
+ " 407c15: 0f 84 ee 00 00 00 \tje\t0x407d09 <SV_Auth_DropClient+0x2f5>",
148
+ " 407c1b: 44 8b 80 40 df 02 00 \tmovl\t0x2df40(%rax), %r8d",
149
+ " 407c22: 83 c6 01 \taddl\t$0x1, %esi",
150
+ " 407c25: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
151
+ " 407c2c: 41 83 f8 01 \tcmpl\t$0x1, %r8d",
152
+ " 407c30: 0f 87 65 01 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
153
+ " 407c36: 83 f9 01 \tcmpl\t$0x1, %ecx",
154
+ " 407c39: 0f 84 ca 00 00 00 \tje\t0x407d09 <SV_Auth_DropClient+0x2f5>",
155
+ " 407c3f: 83 f9 02 \tcmpl\t$0x2, %ecx",
156
+ " 407c42: 0f 84 a6 00 00 00 \tje\t0x407cee <SV_Auth_DropClient+0x2da>",
157
+ " 407c48: 83 f9 03 \tcmpl\t$0x3, %ecx",
158
+ " 407c4b: 0f 1f 44 00 00 \tnopl\t(%rax,%rax)",
159
+ " 407c50: 0f 84 7d 00 00 00 \tje\t0x407cd3 <SV_Auth_DropClient+0x2bf>",
160
+ " 407c56: 83 f9 04 \tcmpl\t$0x4, %ecx",
161
+ " 407c59: 74 5d \tje\t0x407cb8 <SV_Auth_DropClient+0x2a4>",
162
+ " 407c5b: 83 f9 05 \tcmpl\t$0x5, %ecx",
163
+ " 407c5e: 66 90 \tnop",
164
+ " 407c60: 74 3b \tje\t0x407c9d <SV_Auth_DropClient+0x289>",
165
+ " 407c62: 83 f9 06 \tcmpl\t$0x6, %ecx",
166
+ " 407c65: 74 1b \tje\t0x407c82 <SV_Auth_DropClient+0x26e>",
167
+ " 407c67: 44 8b 8a 40 df 02 00 \tmovl\t0x2df40(%rdx), %r9d",
168
+ " 407c6e: 83 c6 01 \taddl\t$0x1, %esi",
169
+ " 407c71: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
170
+ " 407c78: 41 83 f9 01 \tcmpl\t$0x1, %r9d",
171
+ " 407c7c: 0f 87 19 01 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
172
+ " 407c82: 44 8b 92 40 df 02 00 \tmovl\t0x2df40(%rdx), %r10d",
173
+ " 407c89: 83 c6 01 \taddl\t$0x1, %esi",
174
+ " 407c8c: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
175
+ " 407c93: 41 83 fa 01 \tcmpl\t$0x1, %r10d",
176
+ " 407c97: 0f 87 fe 00 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
177
+ " 407c9d: 44 8b 9a 40 df 02 00 \tmovl\t0x2df40(%rdx), %r11d",
178
+ " 407ca4: 83 c6 01 \taddl\t$0x1, %esi",
179
+ " 407ca7: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
180
+ " 407cae: 41 83 fb 01 \tcmpl\t$0x1, %r11d",
181
+ " 407cb2: 0f 87 e3 00 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
182
+ " 407cb8: 44 8b a2 40 df 02 00 \tmovl\t0x2df40(%rdx), %r12d",
183
+ " 407cbf: 83 c6 01 \taddl\t$0x1, %esi",
184
+ " 407cc2: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
185
+ " 407cc9: 41 83 fc 01 \tcmpl\t$0x1, %r12d",
186
+ " 407ccd: 0f 87 c8 00 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
187
+ " 407cd3: 44 8b aa 40 df 02 00 \tmovl\t0x2df40(%rdx), %r13d",
188
+ " 407cda: 83 c6 01 \taddl\t$0x1, %esi",
189
+ " 407cdd: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
190
+ " 407ce4: 41 83 fd 01 \tcmpl\t$0x1, %r13d",
191
+ " 407ce8: 0f 87 ad 00 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
192
+ " 407cee: 44 8b b2 40 df 02 00 \tmovl\t0x2df40(%rdx), %r14d",
193
+ " 407cf5: 83 c6 01 \taddl\t$0x1, %esi",
194
+ " 407cf8: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
195
+ " 407cff: 41 83 fe 01 \tcmpl\t$0x1, %r14d",
196
+ " 407d03: 0f 87 92 00 00 00 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
197
+ " 407d09: 83 c6 01 \taddl\t$0x1, %esi",
198
+ " 407d0c: 39 fe \tcmpl\t%edi, %esi",
199
+ " 407d0e: 0f 84 f3 01 00 00 \tje\t0x407f07 <SV_Auth_DropClient+0x4f3>",
200
+ " 407d14: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
201
+ " 407d1b: 48 8d 82 40 df 02 00 \tleaq\t0x2df40(%rdx), %rax",
202
+ " 407d22: 77 77 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
203
+ " 407d24: 83 b8 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rax)",
204
+ " 407d2b: 48 8d 90 40 df 02 00 \tleaq\t0x2df40(%rax), %rdx",
205
+ " 407d32: 77 67 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
206
+ " 407d34: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
207
+ " 407d3b: 48 8d 88 80 be 05 00 \tleaq\t0x5be80(%rax), %rcx",
208
+ " 407d42: 77 57 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
209
+ " 407d44: 83 b9 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rcx)",
210
+ " 407d4b: 48 8d 90 c0 9d 08 00 \tleaq\t0x89dc0(%rax), %rdx",
211
+ " 407d52: 77 47 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
212
+ " 407d54: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
213
+ " 407d5b: 48 8d 88 00 7d 0b 00 \tleaq\t0xb7d00(%rax), %rcx",
214
+ " 407d62: 77 37 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
215
+ " 407d64: 83 b9 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rcx)",
216
+ " 407d6b: 48 8d 90 40 5c 0e 00 \tleaq\t0xe5c40(%rax), %rdx",
217
+ " 407d72: 77 27 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
218
+ " 407d74: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
219
+ " 407d7b: 48 8d 88 80 3b 11 00 \tleaq\t0x113b80(%rax), %rcx",
220
+ " 407d82: 77 17 \tja\t0x407d9b <SV_Auth_DropClient+0x387>",
221
+ " 407d84: 83 c6 07 \taddl\t$0x7, %esi",
222
+ " 407d87: 83 b9 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rcx)",
223
+ " 407d8e: 48 8d 90 c0 1a 14 00 \tleaq\t0x141ac0(%rax), %rdx",
224
+ " 407d95: 0f 86 6e ff ff ff \tjbe\t0x407d09 <SV_Auth_DropClient+0x2f5>",
225
+ " 407d9b: 5b \tpopq\t%rbx",
226
+ " 407d9c: 5d \tpopq\t%rbp",
227
+ " 407d9d: 41 5c \tpopq\t%r12",
228
+ " 407d9f: 41 5d \tpopq\t%r13",
229
+ " 407da1: 41 5e \tpopq\t%r14",
230
+ " 407da3: c3 \tretq",
231
+ " 407da4: 48 8b 15 21 b1 40 00 \tmovq\t0x40b121(%rip), %rdx # 0x812ecc <svs+0x2c>",
232
+ " 407dab: 8b 0d 23 b1 40 00 \tmovl\t0x40b123(%rip), %ecx # 0x812ed4 <svs+0x34>",
233
+ " 407db1: 41 bc cc 2e 81 00 \tmovl\t$0x812ecc, %r12d # imm = 0x812ECC",
234
+ " 407db7: 48 8b bf e4 4e 02 00 \tmovq\t0x24ee4(%rdi), %rdi",
235
+ " 407dbe: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
236
+ " 407dc4: e8 47 ad 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
237
+ " 407dc9: 85 c0 \ttestl\t%eax, %eax",
238
+ " 407dcb: 0f 85 43 01 00 00 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
239
+ " 407dd1: 41 bc f4 2e 81 00 \tmovl\t$0x812ef4, %r12d # imm = 0x812EF4",
240
+ " 407dd7: 49 8b 14 24 \tmovq\t(%r12), %rdx",
241
+ " 407ddb: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
242
+ " 407de0: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
243
+ " 407de7: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
244
+ " 407ded: e8 1e ad 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
245
+ " 407df2: 85 c0 \ttestl\t%eax, %eax",
246
+ " 407df4: 0f 85 1a 01 00 00 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
247
+ " 407dfa: 49 81 fc a4 ce 81 00 \tcmpq\t$0x81cea4, %r12 # imm = 0x81CEA4",
248
+ " 407e01: 0f 84 35 fc ff ff \tje\t0x407a3c <SV_Auth_DropClient+0x28>",
249
+ " 407e07: 49 8d 6c 24 28 \tleaq\t0x28(%r12), %rbp",
250
+ " 407e0c: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
251
+ " 407e13: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
252
+ " 407e19: 48 8b 55 00 \tmovq\t(%rbp), %rdx",
253
+ " 407e1d: 8b 4d 08 \tmovl\t0x8(%rbp), %ecx",
254
+ " 407e20: 49 89 ec \tmovq\t%rbp, %r12",
255
+ " 407e23: e8 e8 ac 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
256
+ " 407e28: 85 c0 \ttestl\t%eax, %eax",
257
+ " 407e2a: 0f 85 e4 00 00 00 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
258
+ " 407e30: 4c 8d 65 28 \tleaq\t0x28(%rbp), %r12",
259
+ " 407e34: 48 8b 55 28 \tmovq\t0x28(%rbp), %rdx",
260
+ " 407e38: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
261
+ " 407e3f: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
262
+ " 407e45: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
263
+ " 407e4a: e8 c1 ac 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
264
+ " 407e4f: 85 c0 \ttestl\t%eax, %eax",
265
+ " 407e51: 0f 85 bd 00 00 00 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
266
+ " 407e57: 4c 8d 65 50 \tleaq\t0x50(%rbp), %r12",
267
+ " 407e5b: 48 8b 55 50 \tmovq\t0x50(%rbp), %rdx",
268
+ " 407e5f: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
269
+ " 407e66: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
270
+ " 407e6c: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
271
+ " 407e71: e8 9a ac 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
272
+ " 407e76: 85 c0 \ttestl\t%eax, %eax",
273
+ " 407e78: 0f 85 96 00 00 00 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
274
+ " 407e7e: 4c 8d 65 78 \tleaq\t0x78(%rbp), %r12",
275
+ " 407e82: 48 8b 55 78 \tmovq\t0x78(%rbp), %rdx",
276
+ " 407e86: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
277
+ " 407e8d: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
278
+ " 407e93: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
279
+ " 407e98: e8 73 ac 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
280
+ " 407e9d: 85 c0 \ttestl\t%eax, %eax",
281
+ " 407e9f: 75 73 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
282
+ " 407ea1: 4c 8d a5 a0 00 00 00 \tleaq\t0xa0(%rbp), %r12",
283
+ " 407ea8: 48 8b 95 a0 00 00 00 \tmovq\t0xa0(%rbp), %rdx",
284
+ " 407eaf: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
285
+ " 407eb6: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
286
+ " 407ebc: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
287
+ " 407ec1: e8 4a ac 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
288
+ " 407ec6: 85 c0 \ttestl\t%eax, %eax",
289
+ " 407ec8: 75 4a \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
290
+ " 407eca: 4c 8d a5 c8 00 00 00 \tleaq\t0xc8(%rbp), %r12",
291
+ " 407ed1: 48 8b 95 c8 00 00 00 \tmovq\t0xc8(%rbp), %rdx",
292
+ " 407ed8: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
293
+ " 407edf: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
294
+ " 407ee5: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
295
+ " 407eea: e8 21 ac 03 00 \tcallq\t0x442b10 <NET_CompareAdr>",
296
+ " 407eef: 85 c0 \ttestl\t%eax, %eax",
297
+ " 407ef1: 75 21 \tjne\t0x407f14 <SV_Auth_DropClient+0x500>",
298
+ " 407ef3: 4c 8d a5 f0 00 00 00 \tleaq\t0xf0(%rbp), %r12",
299
+ " 407efa: e9 d8 fe ff ff \tjmp\t0x407dd7 <SV_Auth_DropClient+0x3c3>",
300
+ " 407eff: 85 ff \ttestl\t%edi, %edi",
301
+ " 407f01: 0f 85 94 fe ff ff \tjne\t0x407d9b <SV_Auth_DropClient+0x387>",
302
+ " 407f07: 5b \tpopq\t%rbx",
303
+ " 407f08: 5d \tpopq\t%rbp",
304
+ " 407f09: 41 5c \tpopq\t%r12",
305
+ " 407f0b: 41 5d \tpopq\t%r13",
306
+ " 407f0d: 41 5e \tpopq\t%r14",
307
+ " 407f0f: e9 ac 00 00 00 \tjmp\t0x407fc0 <SV_Heartbeat_f>",
308
+ " 407f14: 41 c7 44 24 24 00 00 00 00 \tmovl\t$0x0, 0x24(%r12)",
309
+ " 407f1d: 8b bb a8 0c 02 00 \tmovl\t0x20ca8(%rbx), %edi",
310
+ " 407f23: 85 ff \ttestl\t%edi, %edi",
311
+ " 407f25: 0f 84 1f fb ff ff \tje\t0x407a4a <SV_Auth_DropClient+0x36>",
312
+ " 407f2b: e8 d6 b4 02 00 \tcallq\t0x433406 <FS_FCloseFile>",
313
+ " 407f30: e9 15 fb ff ff \tjmp\t0x407a4a <SV_Auth_DropClient+0x36>",
314
+ " 407f35: 48 89 df \tmovq\t%rbx, %rdi",
315
+ " 407f38: 48 2b 3d 71 af 40 00 \tsubq\t0x40af71(%rip), %rdi # 0x812eb0 <svs+0x10>",
316
+ " 407f3f: 48 c1 ff 06 \tsarq\t$0x6, %rdi",
317
+ " 407f43: 48 0f af fd \timulq\t%rbp, %rdi",
318
+ " 407f47: e8 b6 af ff ff \tcallq\t0x402f02 <SV_BotFreeClient>",
319
+ " 407f4c: e9 60 fc ff ff \tjmp\t0x407bb1 <SV_Auth_DropClient+0x19d>",
320
+ " 407f51: 48 89 de \tmovq\t%rbx, %rsi",
321
+ " 407f54: 48 2b 35 55 af 40 00 \tsubq\t0x40af55(%rip), %rsi # 0x812eb0 <svs+0x10>",
322
+ " 407f5b: 48 b9 d5 05 41 79 fb 43 2f 35\tmovabsq\t$0x352f43fb794105d5, %rcx # imm = 0x352F43FB794105D5",
323
+ " 407f65: bf a0 e9 4a 00 \tmovl\t$0x4ae9a0, %edi # imm = 0x4AE9A0",
324
+ " 407f6a: 31 c0 \txorl\t%eax, %eax",
325
+ " 407f6c: 48 c1 fe 06 \tsarq\t$0x6, %rsi",
326
+ " 407f70: 48 0f af f1 \timulq\t%rcx, %rsi",
327
+ " 407f74: e8 b7 19 04 00 \tcallq\t0x449930 <va>",
328
+ " 407f79: 31 ff \txorl\t%edi, %edi",
329
+ " 407f7b: 48 89 c6 \tmovq\t%rax, %rsi",
330
+ " 407f7e: e8 a5 25 02 00 \tcallq\t0x42a528 <Cbuf_ExecuteText>",
331
+ " 407f83: e9 da fb ff ff \tjmp\t0x407b62 <SV_Auth_DropClient+0x14e>",
332
+ " 407f88: e8 79 b4 02 00 \tcallq\t0x433406 <FS_FCloseFile>",
333
+ " 407f8d: c7 83 a8 0c 02 00 00 00 00 00\tmovl\t$0x0, 0x20ca8(%rbx)",
334
+ " 407f97: e9 b8 fb ff ff \tjmp\t0x407b54 <SV_Auth_DropClient+0x140>",
335
+ " 407f9c: 4c 89 ea \tmovq\t%r13, %rdx",
336
+ " 407f9f: be 5f eb 4a 00 \tmovl\t$0x4aeb5f, %esi # imm = 0x4AEB5F",
337
+ " 407fa4: 31 ff \txorl\t%edi, %edi",
338
+ " 407fa6: 31 c0 \txorl\t%eax, %eax",
339
+ " 407fa8: e8 01 a3 00 00 \tcallq\t0x4122ae <SV_SendServerCommand>",
340
+ " 407fad: e9 94 fb ff ff \tjmp\t0x407b46 <SV_Auth_DropClient+0x132>",
341
+ " 407fb2: 90 \tnop",
342
+ " 407fb3: 90 \tnop",
343
+ " 407fb4: 90 \tnop",
344
+ " 407fb5: 90 \tnop",
345
+ " 407fb6: 90 \tnop",
346
+ " 407fb7: 90 \tnop",
347
+ " 407fb8: 90 \tnop",
348
+ " 407fb9: 90 \tnop",
349
+ " 407fba: 90 \tnop",
350
+ " 407fbb: 90 \tnop",
351
+ " 407fbc: 90 \tnop",
352
+ " 407fbd: 90 \tnop",
353
+ " 407fbe: 90 \tnop",
354
+ " 407fbf: 90 \tnop"
355
+ ]
356
+ },
357
+ "invalid_index": {
358
+ "address": 4240410,
359
+ "common_return_address": 4239760,
360
+ "common_return_instructions": [
361
+ "40b190: 48 8b 9c 24 08 02 00 00 \tmovq\t0x208(%rsp), %rbx",
362
+ "40b198: 48 8b ac 24 10 02 00 00 \tmovq\t0x210(%rsp), %rbp",
363
+ "40b1a0: 4c 8b a4 24 18 02 00 00 \tmovq\t0x218(%rsp), %r12",
364
+ "40b1a8: 4c 8b ac 24 20 02 00 00 \tmovq\t0x220(%rsp), %r13",
365
+ "40b1b0: 4c 8b b4 24 28 02 00 00 \tmovq\t0x228(%rsp), %r14",
366
+ "40b1b8: 4c 8b bc 24 30 02 00 00 \tmovq\t0x230(%rsp), %r15",
367
+ "40b1c0: 48 81 c4 38 02 00 00 \taddq\t$0x238, %rsp # imm = 0x238",
368
+ "40b1c7: c3 \tretq"
369
+ ],
370
+ "instructions": [
371
+ "40b41a: 31 c0 \txorl\t%eax, %eax",
372
+ "40b41c: e9 6f fd ff ff \tjmp\t0x40b190 <SV_GameSystemCalls+0x54>"
373
+ ],
374
+ "result": 0
375
+ },
376
+ "literal_operand_candidates": [
377
+ {
378
+ "address": 4909490,
379
+ "file_offset": 715186,
380
+ "instruction": "407b91: be b2 e9 4a 00 \tmovl\t$0x4ae9b2, %esi # imm = 0x4AE9B2",
381
+ "text": "disconnect \"%s\""
382
+ },
383
+ {
384
+ "address": 4909506,
385
+ "file_offset": 715202,
386
+ "instruction": "407bd4: bf c2 e9 4a 00 \tmovl\t$0x4ae9c2, %edi # imm = 0x4AE9C2",
387
+ "text": "Going to CS_ZOMBIE for %s\n"
388
+ },
389
+ {
390
+ "address": 4909472,
391
+ "file_offset": 715168,
392
+ "instruction": "407f65: bf a0 e9 4a 00 \tmovl\t$0x4ae9a0, %edi # imm = 0x4AE9A0",
393
+ "text": "stopserverdemo %d"
394
+ },
395
+ {
396
+ "address": 4909919,
397
+ "file_offset": 715615,
398
+ "instruction": "407f9f: be 5f eb 4a 00 \tmovl\t$0x4aeb5f, %esi # imm = 0x4AEB5F",
399
+ "text": "print \"%s\n\""
400
+ }
401
+ ],
402
+ "source": {
403
+ "bytes": 961958,
404
+ "path": "Quake3-UrT-Ded.x86_64",
405
+ "sha256": "5dc5f5fbf0f106af6df82cd6ce65987bc6ddff18400f1cd0cb8ac1126ee357cb"
406
+ }
407
+ },
408
+ "linux--Quake3-UrT.x86_64": {
409
+ "case": {
410
+ "direct_call_or_jump_labels": [
411
+ "SV_Auth_DropClient",
412
+ "SV_GameSystemCalls",
413
+ "VM_ArgPtr"
414
+ ],
415
+ "first_instructions": [
416
+ "47546a: 48 8b 7f 18 \tmovq\t0x18(%rdi), %rdi",
417
+ "47546e: e8 5d 6c 01 00 \tcallq\t0x48c0d0 <VM_ArgPtr>",
418
+ "475473: 48 8b 7d 10 \tmovq\t0x10(%rbp), %rdi",
419
+ "475477: 48 89 c3 \tmovq\t%rax, %rbx",
420
+ "47547a: e8 51 6c 01 00 \tcallq\t0x48c0d0 <VM_ArgPtr>",
421
+ "47547f: 8b 55 08 \tmovl\t0x8(%rbp), %edx",
422
+ "475482: 85 d2 \ttestl\t%edx, %edx",
423
+ "475484: 0f 88 00 df ff ff \tjs\t0x47338a <SV_GameSystemCalls+0x2de>",
424
+ "47548a: 48 8b 35 a7 67 e3 00 \tmovq\t0xe367a7(%rip), %rsi # 0x12abc38 <sv_maxclients>",
425
+ "475491: 3b 56 30 \tcmpl\t0x30(%rsi), %edx",
426
+ "475494: 0f 8d f0 de ff ff \tjge\t0x47338a <SV_GameSystemCalls+0x2de>",
427
+ "47549a: 48 63 ea \tmovslq\t%edx, %rbp",
428
+ "47549d: 48 89 c6 \tmovq\t%rax, %rsi",
429
+ "4754a0: 48 89 da \tmovq\t%rbx, %rdx",
430
+ "4754a3: 48 69 fd 40 df 02 00 \timulq\t$0x2df40, %rbp, %rdi # imm = 0x2DF40",
431
+ "4754aa: 48 03 3d df 67 e3 00 \taddq\t0xe367df(%rip), %rdi # 0x12abc90 <svs+0x10>",
432
+ "4754b1: e8 ae ce ff ff \tcallq\t0x472364 <SV_Auth_DropClient>",
433
+ "4754b6: 31 c0 \txorl\t%eax, %eax",
434
+ "4754b8: e9 43 dc ff ff \tjmp\t0x473100 <SV_GameSystemCalls+0x54>"
435
+ ],
436
+ "numbers_sharing_target": [
437
+ 603
438
+ ],
439
+ "target_address": 4674666
440
+ },
441
+ "disassembly_sha256": "895d6c0bf954834261883cf62215bf67aa1ce7fe33642f34e1beeaee6f53032d",
442
+ "function": {
443
+ "address": 4662116,
444
+ "lines": [
445
+ " 472364: 41 56 \tpushq\t%r14",
446
+ " 472366: 49 89 d6 \tmovq\t%rdx, %r14",
447
+ " 472369: 41 55 \tpushq\t%r13",
448
+ " 47236b: 49 89 f5 \tmovq\t%rsi, %r13",
449
+ " 47236e: 41 54 \tpushq\t%r12",
450
+ " 472370: 55 \tpushq\t%rbp",
451
+ " 472371: 53 \tpushq\t%rbx",
452
+ " 472372: 83 3f 01 \tcmpl\t$0x1, (%rdi)",
453
+ " 472375: 48 89 fb \tmovq\t%rdi, %rbx",
454
+ " 472378: 0f 84 6d 03 00 00 \tje\t0x4726eb <SV_Auth_DropClient+0x387>",
455
+ " 47237e: 8b 87 e4 4e 02 00 \tmovl\t0x24ee4(%rdi), %eax",
456
+ " 472384: 85 c0 \ttestl\t%eax, %eax",
457
+ " 472386: 0f 85 68 03 00 00 \tjne\t0x4726f4 <SV_Auth_DropClient+0x390>",
458
+ " 47238c: 8b bb a8 0c 02 00 \tmovl\t0x20ca8(%rbx), %edi",
459
+ " 472392: 85 ff \ttestl\t%edi, %edi",
460
+ " 472394: 0f 85 e1 04 00 00 \tjne\t0x47287b <SV_Auth_DropClient+0x517>",
461
+ " 47239a: 48 8b bb c0 0c 02 00 \tmovq\t0x20cc0(%rbx), %rdi",
462
+ " 4723a1: c7 83 a8 0c 02 00 00 00 00 00\tmovl\t$0x0, 0x20ca8(%rbx)",
463
+ " 4723ab: c6 83 68 0c 02 00 00 \tmovb\t$0x0, 0x20c68(%rbx)",
464
+ " 4723b2: 48 85 ff \ttestq\t%rdi, %rdi",
465
+ " 4723b5: 74 10 \tje\t0x4723c7 <SV_Auth_DropClient+0x63>",
466
+ " 4723b7: e8 ee ce fc ff \tcallq\t0x43f2aa <Z_Free>",
467
+ " 4723bc: 48 c7 83 c0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cc0(%rbx)",
468
+ " 4723c7: 48 8b bb c8 0c 02 00 \tmovq\t0x20cc8(%rbx), %rdi",
469
+ " 4723ce: 48 85 ff \ttestq\t%rdi, %rdi",
470
+ " 4723d1: 74 10 \tje\t0x4723e3 <SV_Auth_DropClient+0x7f>",
471
+ " 4723d3: e8 d2 ce fc ff \tcallq\t0x43f2aa <Z_Free>",
472
+ " 4723d8: 48 c7 83 c8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cc8(%rbx)",
473
+ " 4723e3: 48 8b bb d0 0c 02 00 \tmovq\t0x20cd0(%rbx), %rdi",
474
+ " 4723ea: 48 85 ff \ttestq\t%rdi, %rdi",
475
+ " 4723ed: 74 10 \tje\t0x4723ff <SV_Auth_DropClient+0x9b>",
476
+ " 4723ef: e8 b6 ce fc ff \tcallq\t0x43f2aa <Z_Free>",
477
+ " 4723f4: 48 c7 83 d0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cd0(%rbx)",
478
+ " 4723ff: 48 8b bb d8 0c 02 00 \tmovq\t0x20cd8(%rbx), %rdi",
479
+ " 472406: 48 85 ff \ttestq\t%rdi, %rdi",
480
+ " 472409: 74 10 \tje\t0x47241b <SV_Auth_DropClient+0xb7>",
481
+ " 47240b: e8 9a ce fc ff \tcallq\t0x43f2aa <Z_Free>",
482
+ " 472410: 48 c7 83 d8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cd8(%rbx)",
483
+ " 47241b: 48 8b bb e0 0c 02 00 \tmovq\t0x20ce0(%rbx), %rdi",
484
+ " 472422: 48 85 ff \ttestq\t%rdi, %rdi",
485
+ " 472425: 74 10 \tje\t0x472437 <SV_Auth_DropClient+0xd3>",
486
+ " 472427: e8 7e ce fc ff \tcallq\t0x43f2aa <Z_Free>",
487
+ " 47242c: 48 c7 83 e0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20ce0(%rbx)",
488
+ " 472437: 48 8b bb e8 0c 02 00 \tmovq\t0x20ce8(%rbx), %rdi",
489
+ " 47243e: 48 85 ff \ttestq\t%rdi, %rdi",
490
+ " 472441: 74 10 \tje\t0x472453 <SV_Auth_DropClient+0xef>",
491
+ " 472443: e8 62 ce fc ff \tcallq\t0x43f2aa <Z_Free>",
492
+ " 472448: 48 c7 83 e8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20ce8(%rbx)",
493
+ " 472453: 48 8b bb f0 0c 02 00 \tmovq\t0x20cf0(%rbx), %rdi",
494
+ " 47245a: 48 85 ff \ttestq\t%rdi, %rdi",
495
+ " 47245d: 74 10 \tje\t0x47246f <SV_Auth_DropClient+0x10b>",
496
+ " 47245f: e8 46 ce fc ff \tcallq\t0x43f2aa <Z_Free>",
497
+ " 472464: 48 c7 83 f0 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cf0(%rbx)",
498
+ " 47246f: 48 8b bb f8 0c 02 00 \tmovq\t0x20cf8(%rbx), %rdi",
499
+ " 472476: 48 85 ff \ttestq\t%rdi, %rdi",
500
+ " 472479: 74 10 \tje\t0x47248b <SV_Auth_DropClient+0x127>",
501
+ " 47247b: e8 2a ce fc ff \tcallq\t0x43f2aa <Z_Free>",
502
+ " 472480: 48 c7 83 f8 0c 02 00 00 00 00 00 \tmovq\t$0x0, 0x20cf8(%rbx)",
503
+ " 47248b: 41 80 7d 00 00 \tcmpb\t$0x0, (%r13)",
504
+ " 472490: 0f 85 56 04 00 00 \tjne\t0x4728ec <SV_Auth_DropClient+0x588>",
505
+ " 472496: 8b bb a8 0c 02 00 \tmovl\t0x20ca8(%rbx), %edi",
506
+ " 47249c: 85 ff \ttestl\t%edi, %edi",
507
+ " 47249e: 0f 85 34 04 00 00 \tjne\t0x4728d8 <SV_Auth_DropClient+0x574>",
508
+ " 4724a4: 8b 93 20 cf 02 00 \tmovl\t0x2cf20(%rbx), %edx",
509
+ " 4724aa: 85 d2 \ttestl\t%edx, %edx",
510
+ " 4724ac: 0f 85 ef 03 00 00 \tjne\t0x4728a1 <SV_Auth_DropClient+0x53d>",
511
+ " 4724b2: 48 89 da \tmovq\t%rbx, %rdx",
512
+ " 4724b5: 48 2b 15 d4 97 e3 00 \tsubq\t0xe397d4(%rip), %rdx # 0x12abc90 <svs+0x10>",
513
+ " 4724bc: 48 bd d5 05 41 79 fb 43 2f 35\tmovabsq\t$0x352f43fb794105d5, %rbp # imm = 0x352F43FB794105D5",
514
+ " 4724c6: 48 8b 3d b3 0b 84 00 \tmovq\t0x840bb3(%rip), %rdi # 0xcb3080 <gvm>",
515
+ " 4724cd: be 05 00 00 00 \tmovl\t$0x5, %esi",
516
+ " 4724d2: 31 c0 \txorl\t%eax, %eax",
517
+ " 4724d4: 48 c1 fa 06 \tsarq\t$0x6, %rdx",
518
+ " 4724d8: 48 0f af d5 \timulq\t%rbp, %rdx",
519
+ " 4724dc: e8 0d a4 01 00 \tcallq\t0x48c8ee <VM_Call>",
520
+ " 4724e1: be 04 24 57 00 \tmovl\t$0x572404, %esi # imm = 0x572404",
521
+ " 4724e6: 31 c0 \txorl\t%eax, %eax",
522
+ " 4724e8: 4c 89 f2 \tmovq\t%r14, %rdx",
523
+ " 4724eb: 48 89 df \tmovq\t%rbx, %rdi",
524
+ " 4724ee: e8 3b 7d 00 00 \tcallq\t0x47a22e <SV_SendServerCommand>",
525
+ " 4724f3: 8b b3 e4 4e 02 00 \tmovl\t0x24ee4(%rbx), %esi",
526
+ " 4724f9: 85 f6 \ttestl\t%esi, %esi",
527
+ " 4724fb: 0f 84 84 03 00 00 \tje\t0x472885 <SV_Auth_DropClient+0x521>",
528
+ " 472501: 48 89 df \tmovq\t%rbx, %rdi",
529
+ " 472504: 48 2b 3d 85 97 e3 00 \tsubq\t0xe39785(%rip), %rdi # 0x12abc90 <svs+0x10>",
530
+ " 47250b: be e5 22 58 00 \tmovl\t$0x5822e5, %esi # imm = 0x5822E5",
531
+ " 472510: 48 c1 ff 06 \tsarq\t$0x6, %rdi",
532
+ " 472514: 48 0f af fd \timulq\t%rbp, %rdi",
533
+ " 472518: e8 3f 3c 00 00 \tcallq\t0x47615c <SV_SetUserinfo>",
534
+ " 47251d: 48 8d b3 48 0c 02 00 \tleaq\t0x20c48(%rbx), %rsi",
535
+ " 472524: bf 14 24 57 00 \tmovl\t$0x572414, %edi # imm = 0x572414",
536
+ " 472529: 31 c0 \txorl\t%eax, %eax",
537
+ " 47252b: e8 76 c3 fc ff \tcallq\t0x43e8a6 <Com_DPrintf>",
538
+ " 472530: c7 03 01 00 00 00 \tmovl\t$0x1, (%rbx)",
539
+ " 472536: 48 8b 1d fb 96 e3 00 \tmovq\t0xe396fb(%rip), %rbx # 0x12abc38 <sv_maxclients>",
540
+ " 47253d: 8b 7b 30 \tmovl\t0x30(%rbx), %edi",
541
+ " 472540: 85 ff \ttestl\t%edi, %edi",
542
+ " 472542: 0f 8e 07 03 00 00 \tjle\t0x47284f <SV_Auth_DropClient+0x4eb>",
543
+ " 472548: 48 8b 05 41 97 e3 00 \tmovq\t0xe39741(%rip), %rax # 0x12abc90 <svs+0x10>",
544
+ " 47254f: 83 38 01 \tcmpl\t$0x1, (%rax)",
545
+ " 472552: 0f 87 f7 02 00 00 \tja\t0x47284f <SV_Auth_DropClient+0x4eb>",
546
+ " 472558: 8d 6f ff \tleal\t-0x1(%rdi), %ebp",
547
+ " 47255b: 31 f6 \txorl\t%esi, %esi",
548
+ " 47255d: 48 89 c2 \tmovq\t%rax, %rdx",
549
+ " 472560: 89 e9 \tmovl\t%ebp, %ecx",
550
+ " 472562: 83 e1 07 \tandl\t$0x7, %ecx",
551
+ " 472565: 0f 84 ee 00 00 00 \tje\t0x472659 <SV_Auth_DropClient+0x2f5>",
552
+ " 47256b: 44 8b 80 40 df 02 00 \tmovl\t0x2df40(%rax), %r8d",
553
+ " 472572: 83 c6 01 \taddl\t$0x1, %esi",
554
+ " 472575: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
555
+ " 47257c: 41 83 f8 01 \tcmpl\t$0x1, %r8d",
556
+ " 472580: 0f 87 65 01 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
557
+ " 472586: 83 f9 01 \tcmpl\t$0x1, %ecx",
558
+ " 472589: 0f 84 ca 00 00 00 \tje\t0x472659 <SV_Auth_DropClient+0x2f5>",
559
+ " 47258f: 83 f9 02 \tcmpl\t$0x2, %ecx",
560
+ " 472592: 0f 84 a6 00 00 00 \tje\t0x47263e <SV_Auth_DropClient+0x2da>",
561
+ " 472598: 83 f9 03 \tcmpl\t$0x3, %ecx",
562
+ " 47259b: 0f 1f 44 00 00 \tnopl\t(%rax,%rax)",
563
+ " 4725a0: 0f 84 7d 00 00 00 \tje\t0x472623 <SV_Auth_DropClient+0x2bf>",
564
+ " 4725a6: 83 f9 04 \tcmpl\t$0x4, %ecx",
565
+ " 4725a9: 74 5d \tje\t0x472608 <SV_Auth_DropClient+0x2a4>",
566
+ " 4725ab: 83 f9 05 \tcmpl\t$0x5, %ecx",
567
+ " 4725ae: 66 90 \tnop",
568
+ " 4725b0: 74 3b \tje\t0x4725ed <SV_Auth_DropClient+0x289>",
569
+ " 4725b2: 83 f9 06 \tcmpl\t$0x6, %ecx",
570
+ " 4725b5: 74 1b \tje\t0x4725d2 <SV_Auth_DropClient+0x26e>",
571
+ " 4725b7: 44 8b 8a 40 df 02 00 \tmovl\t0x2df40(%rdx), %r9d",
572
+ " 4725be: 83 c6 01 \taddl\t$0x1, %esi",
573
+ " 4725c1: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
574
+ " 4725c8: 41 83 f9 01 \tcmpl\t$0x1, %r9d",
575
+ " 4725cc: 0f 87 19 01 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
576
+ " 4725d2: 44 8b 92 40 df 02 00 \tmovl\t0x2df40(%rdx), %r10d",
577
+ " 4725d9: 83 c6 01 \taddl\t$0x1, %esi",
578
+ " 4725dc: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
579
+ " 4725e3: 41 83 fa 01 \tcmpl\t$0x1, %r10d",
580
+ " 4725e7: 0f 87 fe 00 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
581
+ " 4725ed: 44 8b 9a 40 df 02 00 \tmovl\t0x2df40(%rdx), %r11d",
582
+ " 4725f4: 83 c6 01 \taddl\t$0x1, %esi",
583
+ " 4725f7: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
584
+ " 4725fe: 41 83 fb 01 \tcmpl\t$0x1, %r11d",
585
+ " 472602: 0f 87 e3 00 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
586
+ " 472608: 44 8b a2 40 df 02 00 \tmovl\t0x2df40(%rdx), %r12d",
587
+ " 47260f: 83 c6 01 \taddl\t$0x1, %esi",
588
+ " 472612: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
589
+ " 472619: 41 83 fc 01 \tcmpl\t$0x1, %r12d",
590
+ " 47261d: 0f 87 c8 00 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
591
+ " 472623: 44 8b aa 40 df 02 00 \tmovl\t0x2df40(%rdx), %r13d",
592
+ " 47262a: 83 c6 01 \taddl\t$0x1, %esi",
593
+ " 47262d: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
594
+ " 472634: 41 83 fd 01 \tcmpl\t$0x1, %r13d",
595
+ " 472638: 0f 87 ad 00 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
596
+ " 47263e: 44 8b b2 40 df 02 00 \tmovl\t0x2df40(%rdx), %r14d",
597
+ " 472645: 83 c6 01 \taddl\t$0x1, %esi",
598
+ " 472648: 48 81 c2 40 df 02 00 \taddq\t$0x2df40, %rdx # imm = 0x2DF40",
599
+ " 47264f: 41 83 fe 01 \tcmpl\t$0x1, %r14d",
600
+ " 472653: 0f 87 92 00 00 00 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
601
+ " 472659: 83 c6 01 \taddl\t$0x1, %esi",
602
+ " 47265c: 39 fe \tcmpl\t%edi, %esi",
603
+ " 47265e: 0f 84 f3 01 00 00 \tje\t0x472857 <SV_Auth_DropClient+0x4f3>",
604
+ " 472664: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
605
+ " 47266b: 48 8d 82 40 df 02 00 \tleaq\t0x2df40(%rdx), %rax",
606
+ " 472672: 77 77 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
607
+ " 472674: 83 b8 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rax)",
608
+ " 47267b: 48 8d 90 40 df 02 00 \tleaq\t0x2df40(%rax), %rdx",
609
+ " 472682: 77 67 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
610
+ " 472684: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
611
+ " 47268b: 48 8d 88 80 be 05 00 \tleaq\t0x5be80(%rax), %rcx",
612
+ " 472692: 77 57 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
613
+ " 472694: 83 b9 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rcx)",
614
+ " 47269b: 48 8d 90 c0 9d 08 00 \tleaq\t0x89dc0(%rax), %rdx",
615
+ " 4726a2: 77 47 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
616
+ " 4726a4: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
617
+ " 4726ab: 48 8d 88 00 7d 0b 00 \tleaq\t0xb7d00(%rax), %rcx",
618
+ " 4726b2: 77 37 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
619
+ " 4726b4: 83 b9 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rcx)",
620
+ " 4726bb: 48 8d 90 40 5c 0e 00 \tleaq\t0xe5c40(%rax), %rdx",
621
+ " 4726c2: 77 27 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
622
+ " 4726c4: 83 ba 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rdx)",
623
+ " 4726cb: 48 8d 88 80 3b 11 00 \tleaq\t0x113b80(%rax), %rcx",
624
+ " 4726d2: 77 17 \tja\t0x4726eb <SV_Auth_DropClient+0x387>",
625
+ " 4726d4: 83 c6 07 \taddl\t$0x7, %esi",
626
+ " 4726d7: 83 b9 40 df 02 00 01 \tcmpl\t$0x1, 0x2df40(%rcx)",
627
+ " 4726de: 48 8d 90 c0 1a 14 00 \tleaq\t0x141ac0(%rax), %rdx",
628
+ " 4726e5: 0f 86 6e ff ff ff \tjbe\t0x472659 <SV_Auth_DropClient+0x2f5>",
629
+ " 4726eb: 5b \tpopq\t%rbx",
630
+ " 4726ec: 5d \tpopq\t%rbp",
631
+ " 4726ed: 41 5c \tpopq\t%r12",
632
+ " 4726ef: 41 5d \tpopq\t%r13",
633
+ " 4726f1: 41 5e \tpopq\t%r14",
634
+ " 4726f3: c3 \tretq",
635
+ " 4726f4: 48 8b 15 b1 95 e3 00 \tmovq\t0xe395b1(%rip), %rdx # 0x12abcac <svs+0x2c>",
636
+ " 4726fb: 8b 0d b3 95 e3 00 \tmovl\t0xe395b3(%rip), %ecx # 0x12abcb4 <svs+0x34>",
637
+ " 472701: 41 bc ac bc 2a 01 \tmovl\t$0x12abcac, %r12d # imm = 0x12ABCAC",
638
+ " 472707: 48 8b bf e4 4e 02 00 \tmovq\t0x24ee4(%rdi), %rdi",
639
+ " 47270e: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
640
+ " 472714: e8 b7 1d fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
641
+ " 472719: 85 c0 \ttestl\t%eax, %eax",
642
+ " 47271b: 0f 85 43 01 00 00 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
643
+ " 472721: 41 bc d4 bc 2a 01 \tmovl\t$0x12abcd4, %r12d # imm = 0x12ABCD4",
644
+ " 472727: 49 8b 14 24 \tmovq\t(%r12), %rdx",
645
+ " 47272b: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
646
+ " 472730: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
647
+ " 472737: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
648
+ " 47273d: e8 8e 1d fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
649
+ " 472742: 85 c0 \ttestl\t%eax, %eax",
650
+ " 472744: 0f 85 1a 01 00 00 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
651
+ " 47274a: 49 81 fc 84 5c 2b 01 \tcmpq\t$0x12b5c84, %r12 # imm = 0x12B5C84",
652
+ " 472751: 0f 84 35 fc ff ff \tje\t0x47238c <SV_Auth_DropClient+0x28>",
653
+ " 472757: 49 8d 6c 24 28 \tleaq\t0x28(%r12), %rbp",
654
+ " 47275c: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
655
+ " 472763: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
656
+ " 472769: 48 8b 55 00 \tmovq\t(%rbp), %rdx",
657
+ " 47276d: 8b 4d 08 \tmovl\t0x8(%rbp), %ecx",
658
+ " 472770: 49 89 ec \tmovq\t%rbp, %r12",
659
+ " 472773: e8 58 1d fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
660
+ " 472778: 85 c0 \ttestl\t%eax, %eax",
661
+ " 47277a: 0f 85 e4 00 00 00 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
662
+ " 472780: 4c 8d 65 28 \tleaq\t0x28(%rbp), %r12",
663
+ " 472784: 48 8b 55 28 \tmovq\t0x28(%rbp), %rdx",
664
+ " 472788: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
665
+ " 47278f: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
666
+ " 472795: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
667
+ " 47279a: e8 31 1d fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
668
+ " 47279f: 85 c0 \ttestl\t%eax, %eax",
669
+ " 4727a1: 0f 85 bd 00 00 00 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
670
+ " 4727a7: 4c 8d 65 50 \tleaq\t0x50(%rbp), %r12",
671
+ " 4727ab: 48 8b 55 50 \tmovq\t0x50(%rbp), %rdx",
672
+ " 4727af: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
673
+ " 4727b6: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
674
+ " 4727bc: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
675
+ " 4727c1: e8 0a 1d fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
676
+ " 4727c6: 85 c0 \ttestl\t%eax, %eax",
677
+ " 4727c8: 0f 85 96 00 00 00 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
678
+ " 4727ce: 4c 8d 65 78 \tleaq\t0x78(%rbp), %r12",
679
+ " 4727d2: 48 8b 55 78 \tmovq\t0x78(%rbp), %rdx",
680
+ " 4727d6: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
681
+ " 4727dd: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
682
+ " 4727e3: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
683
+ " 4727e8: e8 e3 1c fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
684
+ " 4727ed: 85 c0 \ttestl\t%eax, %eax",
685
+ " 4727ef: 75 73 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
686
+ " 4727f1: 4c 8d a5 a0 00 00 00 \tleaq\t0xa0(%rbp), %r12",
687
+ " 4727f8: 48 8b 95 a0 00 00 00 \tmovq\t0xa0(%rbp), %rdx",
688
+ " 4727ff: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
689
+ " 472806: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
690
+ " 47280c: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
691
+ " 472811: e8 ba 1c fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
692
+ " 472816: 85 c0 \ttestl\t%eax, %eax",
693
+ " 472818: 75 4a \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
694
+ " 47281a: 4c 8d a5 c8 00 00 00 \tleaq\t0xc8(%rbp), %r12",
695
+ " 472821: 48 8b 95 c8 00 00 00 \tmovq\t0xc8(%rbp), %rdx",
696
+ " 472828: 48 8b bb e4 4e 02 00 \tmovq\t0x24ee4(%rbx), %rdi",
697
+ " 47282f: 8b b3 ec 4e 02 00 \tmovl\t0x24eec(%rbx), %esi",
698
+ " 472835: 41 8b 4c 24 08 \tmovl\t0x8(%r12), %ecx",
699
+ " 47283a: e8 91 1c fe ff \tcallq\t0x4544d0 <NET_CompareAdr>",
700
+ " 47283f: 85 c0 \ttestl\t%eax, %eax",
701
+ " 472841: 75 21 \tjne\t0x472864 <SV_Auth_DropClient+0x500>",
702
+ " 472843: 4c 8d a5 f0 00 00 00 \tleaq\t0xf0(%rbp), %r12",
703
+ " 47284a: e9 d8 fe ff ff \tjmp\t0x472727 <SV_Auth_DropClient+0x3c3>",
704
+ " 47284f: 85 ff \ttestl\t%edi, %edi",
705
+ " 472851: 0f 85 94 fe ff ff \tjne\t0x4726eb <SV_Auth_DropClient+0x387>",
706
+ " 472857: 5b \tpopq\t%rbx",
707
+ " 472858: 5d \tpopq\t%rbp",
708
+ " 472859: 41 5c \tpopq\t%r12",
709
+ " 47285b: 41 5d \tpopq\t%r13",
710
+ " 47285d: 41 5e \tpopq\t%r14",
711
+ " 47285f: e9 0c 91 ff ff \tjmp\t0x46b970 <SV_Heartbeat_f>",
712
+ " 472864: 41 c7 44 24 24 00 00 00 00 \tmovl\t$0x0, 0x24(%r12)",
713
+ " 47286d: 8b bb a8 0c 02 00 \tmovl\t0x20ca8(%rbx), %edi",
714
+ " 472873: 85 ff \ttestl\t%edi, %edi",
715
+ " 472875: 0f 84 1f fb ff ff \tje\t0x47239a <SV_Auth_DropClient+0x36>",
716
+ " 47287b: e8 a6 16 fd ff \tcallq\t0x443f26 <FS_FCloseFile>",
717
+ " 472880: e9 15 fb ff ff \tjmp\t0x47239a <SV_Auth_DropClient+0x36>",
718
+ " 472885: 48 89 df \tmovq\t%rbx, %rdi",
719
+ " 472888: 48 2b 3d 01 94 e3 00 \tsubq\t0xe39401(%rip), %rdi # 0x12abc90 <svs+0x10>",
720
+ " 47288f: 48 c1 ff 06 \tsarq\t$0x6, %rdi",
721
+ " 472893: 48 0f af fd \timulq\t%rbp, %rdi",
722
+ " 472897: e8 d6 85 ff ff \tcallq\t0x46ae72 <SV_BotFreeClient>",
723
+ " 47289c: e9 60 fc ff ff \tjmp\t0x472501 <SV_Auth_DropClient+0x19d>",
724
+ " 4728a1: 48 89 de \tmovq\t%rbx, %rsi",
725
+ " 4728a4: 48 2b 35 e5 93 e3 00 \tsubq\t0xe393e5(%rip), %rsi # 0x12abc90 <svs+0x10>",
726
+ " 4728ab: 48 b9 d5 05 41 79 fb 43 2f 35\tmovabsq\t$0x352f43fb794105d5, %rcx # imm = 0x352F43FB794105D5",
727
+ " 4728b5: bf f2 23 57 00 \tmovl\t$0x5723f2, %edi # imm = 0x5723F2",
728
+ " 4728ba: 31 c0 \txorl\t%eax, %eax",
729
+ " 4728bc: 48 c1 fe 06 \tsarq\t$0x6, %rsi",
730
+ " 4728c0: 48 0f af f1 \timulq\t%rcx, %rsi",
731
+ " 4728c4: e8 47 e4 00 00 \tcallq\t0x480d10 <va>",
732
+ " 4728c9: 31 ff \txorl\t%edi, %edi",
733
+ " 4728cb: 48 89 c6 \tmovq\t%rax, %rsi",
734
+ " 4728ce: e8 f5 84 fc ff \tcallq\t0x43adc8 <Cbuf_ExecuteText>",
735
+ " 4728d3: e9 da fb ff ff \tjmp\t0x4724b2 <SV_Auth_DropClient+0x14e>",
736
+ " 4728d8: e8 49 16 fd ff \tcallq\t0x443f26 <FS_FCloseFile>",
737
+ " 4728dd: c7 83 a8 0c 02 00 00 00 00 00\tmovl\t$0x0, 0x20ca8(%rbx)",
738
+ " 4728e7: e9 b8 fb ff ff \tjmp\t0x4724a4 <SV_Auth_DropClient+0x140>",
739
+ " 4728ec: 4c 89 ea \tmovq\t%r13, %rdx",
740
+ " 4728ef: be 6e 25 57 00 \tmovl\t$0x57256e, %esi # imm = 0x57256E",
741
+ " 4728f4: 31 ff \txorl\t%edi, %edi",
742
+ " 4728f6: 31 c0 \txorl\t%eax, %eax",
743
+ " 4728f8: e8 31 79 00 00 \tcallq\t0x47a22e <SV_SendServerCommand>",
744
+ " 4728fd: e9 94 fb ff ff \tjmp\t0x472496 <SV_Auth_DropClient+0x132>",
745
+ " 472902: 90 \tnop",
746
+ " 472903: 90 \tnop",
747
+ " 472904: 90 \tnop",
748
+ " 472905: 90 \tnop",
749
+ " 472906: 90 \tnop",
750
+ " 472907: 90 \tnop",
751
+ " 472908: 90 \tnop",
752
+ " 472909: 90 \tnop",
753
+ " 47290a: 90 \tnop",
754
+ " 47290b: 90 \tnop",
755
+ " 47290c: 90 \tnop",
756
+ " 47290d: 90 \tnop",
757
+ " 47290e: 90 \tnop",
758
+ " 47290f: 90 \tnop"
759
+ ]
760
+ },
761
+ "invalid_index": {
762
+ "address": 4666250,
763
+ "common_return_address": 4665600,
764
+ "common_return_instructions": [
765
+ "473100: 48 8b 9c 24 08 02 00 00 \tmovq\t0x208(%rsp), %rbx",
766
+ "473108: 48 8b ac 24 10 02 00 00 \tmovq\t0x210(%rsp), %rbp",
767
+ "473110: 4c 8b a4 24 18 02 00 00 \tmovq\t0x218(%rsp), %r12",
768
+ "473118: 4c 8b ac 24 20 02 00 00 \tmovq\t0x220(%rsp), %r13",
769
+ "473120: 4c 8b b4 24 28 02 00 00 \tmovq\t0x228(%rsp), %r14",
770
+ "473128: 4c 8b bc 24 30 02 00 00 \tmovq\t0x230(%rsp), %r15",
771
+ "473130: 48 81 c4 38 02 00 00 \taddq\t$0x238, %rsp # imm = 0x238",
772
+ "473137: c3 \tretq"
773
+ ],
774
+ "instructions": [
775
+ "47338a: 31 c0 \txorl\t%eax, %eax",
776
+ "47338c: e9 6f fd ff ff \tjmp\t0x473100 <SV_GameSystemCalls+0x54>"
777
+ ],
778
+ "result": 0
779
+ },
780
+ "literal_operand_candidates": [
781
+ {
782
+ "address": 5710852,
783
+ "file_offset": 1516548,
784
+ "instruction": "4724e1: be 04 24 57 00 \tmovl\t$0x572404, %esi # imm = 0x572404",
785
+ "text": "disconnect \"%s\""
786
+ },
787
+ {
788
+ "address": 5710868,
789
+ "file_offset": 1516564,
790
+ "instruction": "472524: bf 14 24 57 00 \tmovl\t$0x572414, %edi # imm = 0x572414",
791
+ "text": "Going to CS_ZOMBIE for %s\n"
792
+ },
793
+ {
794
+ "address": 5710834,
795
+ "file_offset": 1516530,
796
+ "instruction": "4728b5: bf f2 23 57 00 \tmovl\t$0x5723f2, %edi # imm = 0x5723F2",
797
+ "text": "stopserverdemo %d"
798
+ },
799
+ {
800
+ "address": 5711214,
801
+ "file_offset": 1516910,
802
+ "instruction": "4728ef: be 6e 25 57 00 \tmovl\t$0x57256e, %esi # imm = 0x57256E",
803
+ "text": "print \"%s\n\""
804
+ }
805
+ ],
806
+ "source": {
807
+ "bytes": 1940280,
808
+ "path": "Quake3-UrT.x86_64",
809
+ "sha256": "31a21e05251f4126b234dd5c4ce2612cd5332d502f35bab1dbde4cb288babd3a"
810
+ }
811
+ }
812
+ },
813
+ "qvm": {
814
+ "call_instruction": 165943,
815
+ "containing_entry": 165818,
816
+ "instructions": [
817
+ {
818
+ "code_offset": 490188,
819
+ "file_offset": 490220,
820
+ "index": 165818,
821
+ "opcode": "ENTER",
822
+ "operand": 32
823
+ },
824
+ {
825
+ "code_offset": 490193,
826
+ "file_offset": 490225,
827
+ "index": 165819,
828
+ "opcode": "LOCAL",
829
+ "operand": 24
830
+ },
831
+ {
832
+ "code_offset": 490198,
833
+ "file_offset": 490230,
834
+ "index": 165820,
835
+ "opcode": "LOCAL",
836
+ "operand": 40
837
+ },
838
+ {
839
+ "code_offset": 490203,
840
+ "file_offset": 490235,
841
+ "index": 165821,
842
+ "opcode": "LOAD4",
843
+ "operand": null
844
+ },
845
+ {
846
+ "code_offset": 490204,
847
+ "file_offset": 490236,
848
+ "index": 165822,
849
+ "opcode": "STORE4",
850
+ "operand": null
851
+ },
852
+ {
853
+ "code_offset": 490205,
854
+ "file_offset": 490237,
855
+ "index": 165823,
856
+ "opcode": "LOCAL",
857
+ "operand": 24
858
+ },
859
+ {
860
+ "code_offset": 490210,
861
+ "file_offset": 490242,
862
+ "index": 165824,
863
+ "opcode": "LOAD4",
864
+ "operand": null
865
+ },
866
+ {
867
+ "code_offset": 490211,
868
+ "file_offset": 490243,
869
+ "index": 165825,
870
+ "opcode": "CONST",
871
+ "operand": 0
872
+ },
873
+ {
874
+ "code_offset": 490216,
875
+ "file_offset": 490248,
876
+ "index": 165826,
877
+ "opcode": "LTI",
878
+ "operand": 165832
879
+ },
880
+ {
881
+ "code_offset": 490221,
882
+ "file_offset": 490253,
883
+ "index": 165827,
884
+ "opcode": "LOCAL",
885
+ "operand": 24
886
+ },
887
+ {
888
+ "code_offset": 490226,
889
+ "file_offset": 490258,
890
+ "index": 165828,
891
+ "opcode": "LOAD4",
892
+ "operand": null
893
+ },
894
+ {
895
+ "code_offset": 490227,
896
+ "file_offset": 490259,
897
+ "index": 165829,
898
+ "opcode": "CONST",
899
+ "operand": 34992524
900
+ },
901
+ {
902
+ "code_offset": 490232,
903
+ "file_offset": 490264,
904
+ "index": 165830,
905
+ "opcode": "LOAD4",
906
+ "operand": null
907
+ },
908
+ {
909
+ "code_offset": 490233,
910
+ "file_offset": 490265,
911
+ "index": 165831,
912
+ "opcode": "LTI",
913
+ "operand": 165842
914
+ },
915
+ {
916
+ "code_offset": 490238,
917
+ "file_offset": 490270,
918
+ "index": 165832,
919
+ "opcode": "CONST",
920
+ "operand": 68473
921
+ },
922
+ {
923
+ "code_offset": 490243,
924
+ "file_offset": 490275,
925
+ "index": 165833,
926
+ "opcode": "ARG",
927
+ "operand": 8
928
+ },
929
+ {
930
+ "code_offset": 490245,
931
+ "file_offset": 490277,
932
+ "index": 165834,
933
+ "opcode": "LOCAL",
934
+ "operand": 40
935
+ },
936
+ {
937
+ "code_offset": 490250,
938
+ "file_offset": 490282,
939
+ "index": 165835,
940
+ "opcode": "LOAD4",
941
+ "operand": null
942
+ },
943
+ {
944
+ "code_offset": 490251,
945
+ "file_offset": 490283,
946
+ "index": 165836,
947
+ "opcode": "ARG",
948
+ "operand": 12
949
+ },
950
+ {
951
+ "code_offset": 490253,
952
+ "file_offset": 490285,
953
+ "index": 165837,
954
+ "opcode": "CONST",
955
+ "operand": 5123
956
+ },
957
+ {
958
+ "code_offset": 490258,
959
+ "file_offset": 490290,
960
+ "index": 165838,
961
+ "opcode": "CALL",
962
+ "operand": null
963
+ },
964
+ {
965
+ "code_offset": 490259,
966
+ "file_offset": 490291,
967
+ "index": 165839,
968
+ "opcode": "POP",
969
+ "operand": null
970
+ },
971
+ {
972
+ "code_offset": 490260,
973
+ "file_offset": 490292,
974
+ "index": 165840,
975
+ "opcode": "CONST",
976
+ "operand": 165945
977
+ },
978
+ {
979
+ "code_offset": 490265,
980
+ "file_offset": 490297,
981
+ "index": 165841,
982
+ "opcode": "JUMP",
983
+ "operand": null
984
+ },
985
+ {
986
+ "code_offset": 490266,
987
+ "file_offset": 490298,
988
+ "index": 165842,
989
+ "opcode": "LOCAL",
990
+ "operand": 20
991
+ },
992
+ {
993
+ "code_offset": 490271,
994
+ "file_offset": 490303,
995
+ "index": 165843,
996
+ "opcode": "LOCAL",
997
+ "operand": 40
998
+ },
999
+ {
1000
+ "code_offset": 490276,
1001
+ "file_offset": 490308,
1002
+ "index": 165844,
1003
+ "opcode": "LOAD4",
1004
+ "operand": null
1005
+ },
1006
+ {
1007
+ "code_offset": 490277,
1008
+ "file_offset": 490309,
1009
+ "index": 165845,
1010
+ "opcode": "CONST",
1011
+ "operand": 6336
1012
+ },
1013
+ {
1014
+ "code_offset": 490282,
1015
+ "file_offset": 490314,
1016
+ "index": 165846,
1017
+ "opcode": "MULI",
1018
+ "operand": null
1019
+ },
1020
+ {
1021
+ "code_offset": 490283,
1022
+ "file_offset": 490315,
1023
+ "index": 165847,
1024
+ "opcode": "CONST",
1025
+ "operand": 34992496
1026
+ },
1027
+ {
1028
+ "code_offset": 490288,
1029
+ "file_offset": 490320,
1030
+ "index": 165848,
1031
+ "opcode": "LOAD4",
1032
+ "operand": null
1033
+ },
1034
+ {
1035
+ "code_offset": 490289,
1036
+ "file_offset": 490321,
1037
+ "index": 165849,
1038
+ "opcode": "ADD",
1039
+ "operand": null
1040
+ },
1041
+ {
1042
+ "code_offset": 490290,
1043
+ "file_offset": 490322,
1044
+ "index": 165850,
1045
+ "opcode": "STORE4",
1046
+ "operand": null
1047
+ },
1048
+ {
1049
+ "code_offset": 490291,
1050
+ "file_offset": 490323,
1051
+ "index": 165851,
1052
+ "opcode": "LOCAL",
1053
+ "operand": 20
1054
+ },
1055
+ {
1056
+ "code_offset": 490296,
1057
+ "file_offset": 490328,
1058
+ "index": 165852,
1059
+ "opcode": "LOAD4",
1060
+ "operand": null
1061
+ },
1062
+ {
1063
+ "code_offset": 490297,
1064
+ "file_offset": 490329,
1065
+ "index": 165853,
1066
+ "opcode": "CONST",
1067
+ "operand": 468
1068
+ },
1069
+ {
1070
+ "code_offset": 490302,
1071
+ "file_offset": 490334,
1072
+ "index": 165854,
1073
+ "opcode": "ADD",
1074
+ "operand": null
1075
+ },
1076
+ {
1077
+ "code_offset": 490303,
1078
+ "file_offset": 490335,
1079
+ "index": 165855,
1080
+ "opcode": "LOAD4",
1081
+ "operand": null
1082
+ },
1083
+ {
1084
+ "code_offset": 490304,
1085
+ "file_offset": 490336,
1086
+ "index": 165856,
1087
+ "opcode": "CONST",
1088
+ "operand": 1
1089
+ },
1090
+ {
1091
+ "code_offset": 490309,
1092
+ "file_offset": 490341,
1093
+ "index": 165857,
1094
+ "opcode": "EQ",
1095
+ "operand": 165875
1096
+ },
1097
+ {
1098
+ "code_offset": 490314,
1099
+ "file_offset": 490346,
1100
+ "index": 165858,
1101
+ "opcode": "LOCAL",
1102
+ "operand": 20
1103
+ },
1104
+ {
1105
+ "code_offset": 490319,
1106
+ "file_offset": 490351,
1107
+ "index": 165859,
1108
+ "opcode": "LOAD4",
1109
+ "operand": null
1110
+ },
1111
+ {
1112
+ "code_offset": 490320,
1113
+ "file_offset": 490352,
1114
+ "index": 165860,
1115
+ "opcode": "CONST",
1116
+ "operand": 468
1117
+ },
1118
+ {
1119
+ "code_offset": 490325,
1120
+ "file_offset": 490357,
1121
+ "index": 165861,
1122
+ "opcode": "ADD",
1123
+ "operand": null
1124
+ },
1125
+ {
1126
+ "code_offset": 490326,
1127
+ "file_offset": 490358,
1128
+ "index": 165862,
1129
+ "opcode": "LOAD4",
1130
+ "operand": null
1131
+ },
1132
+ {
1133
+ "code_offset": 490327,
1134
+ "file_offset": 490359,
1135
+ "index": 165863,
1136
+ "opcode": "CONST",
1137
+ "operand": 2
1138
+ },
1139
+ {
1140
+ "code_offset": 490332,
1141
+ "file_offset": 490364,
1142
+ "index": 165864,
1143
+ "opcode": "EQ",
1144
+ "operand": 165875
1145
+ },
1146
+ {
1147
+ "code_offset": 490337,
1148
+ "file_offset": 490369,
1149
+ "index": 165865,
1150
+ "opcode": "CONST",
1151
+ "operand": 68429
1152
+ },
1153
+ {
1154
+ "code_offset": 490342,
1155
+ "file_offset": 490374,
1156
+ "index": 165866,
1157
+ "opcode": "ARG",
1158
+ "operand": 8
1159
+ },
1160
+ {
1161
+ "code_offset": 490344,
1162
+ "file_offset": 490376,
1163
+ "index": 165867,
1164
+ "opcode": "LOCAL",
1165
+ "operand": 40
1166
+ },
1167
+ {
1168
+ "code_offset": 490349,
1169
+ "file_offset": 490381,
1170
+ "index": 165868,
1171
+ "opcode": "LOAD4",
1172
+ "operand": null
1173
+ },
1174
+ {
1175
+ "code_offset": 490350,
1176
+ "file_offset": 490382,
1177
+ "index": 165869,
1178
+ "opcode": "ARG",
1179
+ "operand": 12
1180
+ },
1181
+ {
1182
+ "code_offset": 490352,
1183
+ "file_offset": 490384,
1184
+ "index": 165870,
1185
+ "opcode": "CONST",
1186
+ "operand": 5123
1187
+ },
1188
+ {
1189
+ "code_offset": 490357,
1190
+ "file_offset": 490389,
1191
+ "index": 165871,
1192
+ "opcode": "CALL",
1193
+ "operand": null
1194
+ },
1195
+ {
1196
+ "code_offset": 490358,
1197
+ "file_offset": 490390,
1198
+ "index": 165872,
1199
+ "opcode": "POP",
1200
+ "operand": null
1201
+ },
1202
+ {
1203
+ "code_offset": 490359,
1204
+ "file_offset": 490391,
1205
+ "index": 165873,
1206
+ "opcode": "CONST",
1207
+ "operand": 165945
1208
+ },
1209
+ {
1210
+ "code_offset": 490364,
1211
+ "file_offset": 490396,
1212
+ "index": 165874,
1213
+ "opcode": "JUMP",
1214
+ "operand": null
1215
+ },
1216
+ {
1217
+ "code_offset": 490365,
1218
+ "file_offset": 490397,
1219
+ "index": 165875,
1220
+ "opcode": "LOCAL",
1221
+ "operand": 20
1222
+ },
1223
+ {
1224
+ "code_offset": 490370,
1225
+ "file_offset": 490402,
1226
+ "index": 165876,
1227
+ "opcode": "LOAD4",
1228
+ "operand": null
1229
+ },
1230
+ {
1231
+ "code_offset": 490371,
1232
+ "file_offset": 490403,
1233
+ "index": 165877,
1234
+ "opcode": "CONST",
1235
+ "operand": 468
1236
+ },
1237
+ {
1238
+ "code_offset": 490376,
1239
+ "file_offset": 490408,
1240
+ "index": 165878,
1241
+ "opcode": "ADD",
1242
+ "operand": null
1243
+ },
1244
+ {
1245
+ "code_offset": 490377,
1246
+ "file_offset": 490409,
1247
+ "index": 165879,
1248
+ "opcode": "LOAD4",
1249
+ "operand": null
1250
+ },
1251
+ {
1252
+ "code_offset": 490378,
1253
+ "file_offset": 490410,
1254
+ "index": 165880,
1255
+ "opcode": "CONST",
1256
+ "operand": 1
1257
+ },
1258
+ {
1259
+ "code_offset": 490383,
1260
+ "file_offset": 490415,
1261
+ "index": 165881,
1262
+ "opcode": "NE",
1263
+ "operand": 165916
1264
+ },
1265
+ {
1266
+ "code_offset": 490388,
1267
+ "file_offset": 490420,
1268
+ "index": 165882,
1269
+ "opcode": "LOCAL",
1270
+ "operand": 20
1271
+ },
1272
+ {
1273
+ "code_offset": 490393,
1274
+ "file_offset": 490425,
1275
+ "index": 165883,
1276
+ "opcode": "LOAD4",
1277
+ "operand": null
1278
+ },
1279
+ {
1280
+ "code_offset": 490394,
1281
+ "file_offset": 490426,
1282
+ "index": 165884,
1283
+ "opcode": "CONST",
1284
+ "operand": 3204
1285
+ },
1286
+ {
1287
+ "code_offset": 490399,
1288
+ "file_offset": 490431,
1289
+ "index": 165885,
1290
+ "opcode": "ADD",
1291
+ "operand": null
1292
+ },
1293
+ {
1294
+ "code_offset": 490400,
1295
+ "file_offset": 490432,
1296
+ "index": 165886,
1297
+ "opcode": "ARG",
1298
+ "operand": 8
1299
+ },
1300
+ {
1301
+ "code_offset": 490402,
1302
+ "file_offset": 490434,
1303
+ "index": 165887,
1304
+ "opcode": "LOCAL",
1305
+ "operand": 44
1306
+ },
1307
+ {
1308
+ "code_offset": 490407,
1309
+ "file_offset": 490439,
1310
+ "index": 165888,
1311
+ "opcode": "LOAD4",
1312
+ "operand": null
1313
+ },
1314
+ {
1315
+ "code_offset": 490408,
1316
+ "file_offset": 490440,
1317
+ "index": 165889,
1318
+ "opcode": "ARG",
1319
+ "operand": 12
1320
+ },
1321
+ {
1322
+ "code_offset": 490410,
1323
+ "file_offset": 490442,
1324
+ "index": 165890,
1325
+ "opcode": "CONST",
1326
+ "operand": 128
1327
+ },
1328
+ {
1329
+ "code_offset": 490415,
1330
+ "file_offset": 490447,
1331
+ "index": 165891,
1332
+ "opcode": "ARG",
1333
+ "operand": 16
1334
+ },
1335
+ {
1336
+ "code_offset": 490417,
1337
+ "file_offset": 490449,
1338
+ "index": 165892,
1339
+ "opcode": "CONST",
1340
+ "operand": 69338
1341
+ },
1342
+ {
1343
+ "code_offset": 490422,
1344
+ "file_offset": 490454,
1345
+ "index": 165893,
1346
+ "opcode": "CALL",
1347
+ "operand": null
1348
+ },
1349
+ {
1350
+ "code_offset": 490423,
1351
+ "file_offset": 490455,
1352
+ "index": 165894,
1353
+ "opcode": "POP",
1354
+ "operand": null
1355
+ },
1356
+ {
1357
+ "code_offset": 490424,
1358
+ "file_offset": 490456,
1359
+ "index": 165895,
1360
+ "opcode": "LOCAL",
1361
+ "operand": 20
1362
+ },
1363
+ {
1364
+ "code_offset": 490429,
1365
+ "file_offset": 490461,
1366
+ "index": 165896,
1367
+ "opcode": "LOAD4",
1368
+ "operand": null
1369
+ },
1370
+ {
1371
+ "code_offset": 490430,
1372
+ "file_offset": 490462,
1373
+ "index": 165897,
1374
+ "opcode": "CONST",
1375
+ "operand": 3332
1376
+ },
1377
+ {
1378
+ "code_offset": 490435,
1379
+ "file_offset": 490467,
1380
+ "index": 165898,
1381
+ "opcode": "ADD",
1382
+ "operand": null
1383
+ },
1384
+ {
1385
+ "code_offset": 490436,
1386
+ "file_offset": 490468,
1387
+ "index": 165899,
1388
+ "opcode": "ARG",
1389
+ "operand": 8
1390
+ },
1391
+ {
1392
+ "code_offset": 490438,
1393
+ "file_offset": 490470,
1394
+ "index": 165900,
1395
+ "opcode": "LOCAL",
1396
+ "operand": 48
1397
+ },
1398
+ {
1399
+ "code_offset": 490443,
1400
+ "file_offset": 490475,
1401
+ "index": 165901,
1402
+ "opcode": "LOAD4",
1403
+ "operand": null
1404
+ },
1405
+ {
1406
+ "code_offset": 490444,
1407
+ "file_offset": 490476,
1408
+ "index": 165902,
1409
+ "opcode": "ARG",
1410
+ "operand": 12
1411
+ },
1412
+ {
1413
+ "code_offset": 490446,
1414
+ "file_offset": 490478,
1415
+ "index": 165903,
1416
+ "opcode": "CONST",
1417
+ "operand": 256
1418
+ },
1419
+ {
1420
+ "code_offset": 490451,
1421
+ "file_offset": 490483,
1422
+ "index": 165904,
1423
+ "opcode": "ARG",
1424
+ "operand": 16
1425
+ },
1426
+ {
1427
+ "code_offset": 490453,
1428
+ "file_offset": 490485,
1429
+ "index": 165905,
1430
+ "opcode": "CONST",
1431
+ "operand": 69338
1432
+ },
1433
+ {
1434
+ "code_offset": 490458,
1435
+ "file_offset": 490490,
1436
+ "index": 165906,
1437
+ "opcode": "CALL",
1438
+ "operand": null
1439
+ },
1440
+ {
1441
+ "code_offset": 490459,
1442
+ "file_offset": 490491,
1443
+ "index": 165907,
1444
+ "opcode": "POP",
1445
+ "operand": null
1446
+ },
1447
+ {
1448
+ "code_offset": 490460,
1449
+ "file_offset": 490492,
1450
+ "index": 165908,
1451
+ "opcode": "LOCAL",
1452
+ "operand": 20
1453
+ },
1454
+ {
1455
+ "code_offset": 490465,
1456
+ "file_offset": 490497,
1457
+ "index": 165909,
1458
+ "opcode": "LOAD4",
1459
+ "operand": null
1460
+ },
1461
+ {
1462
+ "code_offset": 490466,
1463
+ "file_offset": 490498,
1464
+ "index": 165910,
1465
+ "opcode": "CONST",
1466
+ "operand": 3588
1467
+ },
1468
+ {
1469
+ "code_offset": 490471,
1470
+ "file_offset": 490503,
1471
+ "index": 165911,
1472
+ "opcode": "ADD",
1473
+ "operand": null
1474
+ },
1475
+ {
1476
+ "code_offset": 490472,
1477
+ "file_offset": 490504,
1478
+ "index": 165912,
1479
+ "opcode": "CONST",
1480
+ "operand": 1
1481
+ },
1482
+ {
1483
+ "code_offset": 490477,
1484
+ "file_offset": 490509,
1485
+ "index": 165913,
1486
+ "opcode": "STORE4",
1487
+ "operand": null
1488
+ },
1489
+ {
1490
+ "code_offset": 490478,
1491
+ "file_offset": 490510,
1492
+ "index": 165914,
1493
+ "opcode": "CONST",
1494
+ "operand": 165945
1495
+ },
1496
+ {
1497
+ "code_offset": 490483,
1498
+ "file_offset": 490515,
1499
+ "index": 165915,
1500
+ "opcode": "JUMP",
1501
+ "operand": null
1502
+ },
1503
+ {
1504
+ "code_offset": 490484,
1505
+ "file_offset": 490516,
1506
+ "index": 165916,
1507
+ "opcode": "CONST",
1508
+ "operand": 68407
1509
+ },
1510
+ {
1511
+ "code_offset": 490489,
1512
+ "file_offset": 490521,
1513
+ "index": 165917,
1514
+ "opcode": "ARG",
1515
+ "operand": 8
1516
+ },
1517
+ {
1518
+ "code_offset": 490491,
1519
+ "file_offset": 490523,
1520
+ "index": 165918,
1521
+ "opcode": "LOCAL",
1522
+ "operand": 40
1523
+ },
1524
+ {
1525
+ "code_offset": 490496,
1526
+ "file_offset": 490528,
1527
+ "index": 165919,
1528
+ "opcode": "LOAD4",
1529
+ "operand": null
1530
+ },
1531
+ {
1532
+ "code_offset": 490497,
1533
+ "file_offset": 490529,
1534
+ "index": 165920,
1535
+ "opcode": "ARG",
1536
+ "operand": 12
1537
+ },
1538
+ {
1539
+ "code_offset": 490499,
1540
+ "file_offset": 490531,
1541
+ "index": 165921,
1542
+ "opcode": "LOCAL",
1543
+ "operand": 44
1544
+ },
1545
+ {
1546
+ "code_offset": 490504,
1547
+ "file_offset": 490536,
1548
+ "index": 165922,
1549
+ "opcode": "LOAD4",
1550
+ "operand": null
1551
+ },
1552
+ {
1553
+ "code_offset": 490505,
1554
+ "file_offset": 490537,
1555
+ "index": 165923,
1556
+ "opcode": "ARG",
1557
+ "operand": 16
1558
+ },
1559
+ {
1560
+ "code_offset": 490507,
1561
+ "file_offset": 490539,
1562
+ "index": 165924,
1563
+ "opcode": "CONST",
1564
+ "operand": 7259
1565
+ },
1566
+ {
1567
+ "code_offset": 490512,
1568
+ "file_offset": 490544,
1569
+ "index": 165925,
1570
+ "opcode": "CALL",
1571
+ "operand": null
1572
+ },
1573
+ {
1574
+ "code_offset": 490513,
1575
+ "file_offset": 490545,
1576
+ "index": 165926,
1577
+ "opcode": "POP",
1578
+ "operand": null
1579
+ },
1580
+ {
1581
+ "code_offset": 490514,
1582
+ "file_offset": 490546,
1583
+ "index": 165927,
1584
+ "opcode": "LOCAL",
1585
+ "operand": 20
1586
+ },
1587
+ {
1588
+ "code_offset": 490519,
1589
+ "file_offset": 490551,
1590
+ "index": 165928,
1591
+ "opcode": "LOAD4",
1592
+ "operand": null
1593
+ },
1594
+ {
1595
+ "code_offset": 490520,
1596
+ "file_offset": 490552,
1597
+ "index": 165929,
1598
+ "opcode": "CONST",
1599
+ "operand": 3588
1600
+ },
1601
+ {
1602
+ "code_offset": 490525,
1603
+ "file_offset": 490557,
1604
+ "index": 165930,
1605
+ "opcode": "ADD",
1606
+ "operand": null
1607
+ },
1608
+ {
1609
+ "code_offset": 490526,
1610
+ "file_offset": 490558,
1611
+ "index": 165931,
1612
+ "opcode": "CONST",
1613
+ "operand": 0
1614
+ },
1615
+ {
1616
+ "code_offset": 490531,
1617
+ "file_offset": 490563,
1618
+ "index": 165932,
1619
+ "opcode": "STORE4",
1620
+ "operand": null
1621
+ },
1622
+ {
1623
+ "code_offset": 490532,
1624
+ "file_offset": 490564,
1625
+ "index": 165933,
1626
+ "opcode": "LOCAL",
1627
+ "operand": 40
1628
+ },
1629
+ {
1630
+ "code_offset": 490537,
1631
+ "file_offset": 490569,
1632
+ "index": 165934,
1633
+ "opcode": "LOAD4",
1634
+ "operand": null
1635
+ },
1636
+ {
1637
+ "code_offset": 490538,
1638
+ "file_offset": 490570,
1639
+ "index": 165935,
1640
+ "opcode": "ARG",
1641
+ "operand": 8
1642
+ },
1643
+ {
1644
+ "code_offset": 490540,
1645
+ "file_offset": 490572,
1646
+ "index": 165936,
1647
+ "opcode": "LOCAL",
1648
+ "operand": 44
1649
+ },
1650
+ {
1651
+ "code_offset": 490545,
1652
+ "file_offset": 490577,
1653
+ "index": 165937,
1654
+ "opcode": "LOAD4",
1655
+ "operand": null
1656
+ },
1657
+ {
1658
+ "code_offset": 490546,
1659
+ "file_offset": 490578,
1660
+ "index": 165938,
1661
+ "opcode": "ARG",
1662
+ "operand": 12
1663
+ },
1664
+ {
1665
+ "code_offset": 490548,
1666
+ "file_offset": 490580,
1667
+ "index": 165939,
1668
+ "opcode": "LOCAL",
1669
+ "operand": 48
1670
+ },
1671
+ {
1672
+ "code_offset": 490553,
1673
+ "file_offset": 490585,
1674
+ "index": 165940,
1675
+ "opcode": "LOAD4",
1676
+ "operand": null
1677
+ },
1678
+ {
1679
+ "code_offset": 490554,
1680
+ "file_offset": 490586,
1681
+ "index": 165941,
1682
+ "opcode": "ARG",
1683
+ "operand": 16
1684
+ },
1685
+ {
1686
+ "code_offset": 490556,
1687
+ "file_offset": 490588,
1688
+ "index": 165942,
1689
+ "opcode": "CONST",
1690
+ "operand": -604
1691
+ },
1692
+ {
1693
+ "code_offset": 490561,
1694
+ "file_offset": 490593,
1695
+ "index": 165943,
1696
+ "opcode": "CALL",
1697
+ "operand": null
1698
+ },
1699
+ {
1700
+ "code_offset": 490562,
1701
+ "file_offset": 490594,
1702
+ "index": 165944,
1703
+ "opcode": "POP",
1704
+ "operand": null
1705
+ },
1706
+ {
1707
+ "code_offset": 490563,
1708
+ "file_offset": 490595,
1709
+ "index": 165945,
1710
+ "opcode": "PUSH",
1711
+ "operand": null
1712
+ },
1713
+ {
1714
+ "code_offset": 490564,
1715
+ "file_offset": 490596,
1716
+ "index": 165946,
1717
+ "opcode": "LEAVE",
1718
+ "operand": 32
1719
+ }
1720
+ ],
1721
+ "literal_operand_candidates": [
1722
+ {
1723
+ "instruction": 165832,
1724
+ "text": "auth: drop error - bad client slot: %i\n",
1725
+ "vm_address": 68473
1726
+ },
1727
+ {
1728
+ "instruction": 165865,
1729
+ "text": "auth: drop error - client %i is not active\n",
1730
+ "vm_address": 68429
1731
+ },
1732
+ {
1733
+ "instruction": 165916,
1734
+ "text": "AccountKick: %i - %s\n",
1735
+ "vm_address": 68407
1736
+ }
1737
+ ],
1738
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d",
1739
+ "source": {
1740
+ "archive": "zUrT43_qvm.pk3",
1741
+ "archive_sha256": "b59bf0c5bedf11d50e0edd220da7eade96de40601e98ae14c54c819047df0796",
1742
+ "member": {
1743
+ "bytes": 983300,
1744
+ "comment_hex": "",
1745
+ "compressed_bytes": 246560,
1746
+ "compression": 8,
1747
+ "crc32": "98ea1768",
1748
+ "create_system": 0,
1749
+ "create_version": 63,
1750
+ "date_time": [
1751
+ 2018,
1752
+ 6,
1753
+ 18,
1754
+ 22,
1755
+ 11,
1756
+ 50
1757
+ ],
1758
+ "directory": false,
1759
+ "entry_index": 2,
1760
+ "external_attr": 32,
1761
+ "extra_hex": "0a0020000000000001001800d1e24e974007d40116dcbf962f1fd20116dcbf962f1fd201",
1762
+ "extract_version": 20,
1763
+ "flags": 0,
1764
+ "header_offset": 221309,
1765
+ "internal_attr": 0,
1766
+ "occurrence": 0,
1767
+ "output": "assets/extracted/zUrT43_qvm.pk3/members/000002/vm/qagame.qvm",
1768
+ "path": "vm/qagame.qvm",
1769
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d",
1770
+ "type": "member",
1771
+ "volume": 0
1772
+ }
1773
+ }
1774
+ }
1775
+ }
docs/research/native/COVERAGE.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SDL text and Windows resource byte reconciliation
2
+
3
+ Static pass, 2026-10-11. Reproduce with `python3 scripts/analyze_native_coverage.py`; validate with `python3 scripts/test_native_followup.py`. [Summary](coverage-summary.json), [SDL byte partition](macos--libSDL-1.2.0.dylib.coverage.json) and [Windows byte partition](windows--Quake3-UrT.exe.coverage.json) include source hashes and a hash for each segment. These reports cover two bounded regions, not entire binary files or behavior.
4
+
5
+ ## COV-001: SDL text outside debug-map functions
6
+
7
+ The 327,635-byte SDL `__text` section partitions into 327,111 bytes of paired STABS function ranges and **70 gaps totaling 524 bytes**. Every gap consists entirely of the x86 single-byte NOP opcode `0x90`; each gap's original bytes and SHA-256 are recorded. There are no unclassified bytes in this section's structural partition.
8
+
9
+ These runs are consistent with alignment padding. The classifier records the byte pattern without claiming intent or proving that no control-flow path executes them. This resolves the earlier unknown content of the 524 bytes; it does not finish per-function behavior analysis, source equivalence or the rest of the Mach-O image.
10
+
11
+ ## COV-002: Windows resource-region accounting
12
+
13
+ The client PE resource directory occupies **353,788 bytes**. Exact accounting is **353,268 payload bytes plus 520 directory/entry/data-descriptor bytes**. There are no unreferenced gaps in this region. The structural parser now optionally records byte ranges for directory headers/entries, UTF-16 names, data descriptors and leaf payloads; overlapping references count once in the partition.
14
+
15
+ The observed tree needs no named-string ranges. Each type/name/language variant remains a distinct resource leaf, even if future inputs share storage. This corrects the earlier possibility that the 520-byte difference included padding or unclassified data: all 520 bytes are now explained by resource-tree structures. It does not interpret the surplus bytes *inside* four icon payloads; those remain RE-217.
16
+
17
+ ## Method and limits
18
+
19
+ The interval partition rejects evidence outside the target region, splits at every range boundary, retains all covering labels, hashes each source segment and accounts for every byte exactly once. Gaps retain their bytes and are classified only by explicit byte patterns. Tests include overlapping ranges, uncovered zero bytes, invalid boundaries and exact reconstruction of both supplied regions. Changes to the underlying snapshot require new source hashes and regenerated evidence.
20
+
21
+ RE-218 is complete for its two named regions. Whole-file coverage reconciliation, SDL source matching, Windows icon alpha/mask interpretation and native loader metadata remain separate open tasks.
docs/research/native/METADATA.md CHANGED
@@ -45,3 +45,5 @@ The payload lengths fit a larger mask/data extent, but its interpretation is not
45
  Seven tests cover relative offsets versus RVAs, named resources, cycles, unbacked payloads, malformed string tables, language/size mismatch, function closure interpretation, every recovered real function hash, nonoverlapping ranges and all reconstructed icon payloads. Reports and derived assets regenerate byte-for-byte.
46
 
47
  RE-214–216 complete this static metadata pass. RE-208 remains open for pinned SDL source comparison, implementation differences, absent-type reconstruction and helper behavior. RE-210 remains open for load/bind/relocation details and uncovered regions. Follow up icon surplus/mask rendering, the 524 SDL text bytes outside debug-map functions, and exact resource-region byte coverage before treating these formats as fully understood.
 
 
 
45
  Seven tests cover relative offsets versus RVAs, named resources, cycles, unbacked payloads, malformed string tables, language/size mismatch, function closure interpretation, every recovered real function hash, nonoverlapping ranges and all reconstructed icon payloads. Reports and derived assets regenerate byte-for-byte.
46
 
47
  RE-214–216 complete this static metadata pass. RE-208 remains open for pinned SDL source comparison, implementation differences, absent-type reconstruction and helper behavior. RE-210 remains open for load/bind/relocation details and uncovered regions. Follow up icon surplus/mask rendering, the 524 SDL text bytes outside debug-map functions, and exact resource-region byte coverage before treating these formats as fully understood.
48
+
49
+ Follow-up: [COV-001/002](COVERAGE.md) resolves the 524 SDL text bytes as NOP sequences and accounts for all 520 non-payload resource bytes as directory structures. Earlier gap questions above are now resolved for these bounded regions; icon surplus remains open.
docs/research/native/coverage-summary.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "classification_bytes": {
4
+ "referenced_structure": 327111,
5
+ "x86_single_byte_NOP_sequence": 524
6
+ },
7
+ "gap_count": 70,
8
+ "image": "macos--libSDL-1.2.0.dylib",
9
+ "region_bytes": 327635
10
+ },
11
+ {
12
+ "classification_bytes": {
13
+ "referenced_structure": 353788
14
+ },
15
+ "gap_count": 0,
16
+ "image": "windows--Quake3-UrT.exe",
17
+ "region_bytes": 353788
18
+ }
19
+ ]
docs/research/native/macos--libSDL-1.2.0.dylib.coverage.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/research/native/windows--Quake3-UrT.exe.coverage.json ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "classification_bytes": {
3
+ "referenced_structure": 353788
4
+ },
5
+ "leaf_count": 9,
6
+ "limitations": "Coverage is limited to the named SDL text section or PE resource-directory region. Byte-pattern gap classification does not prove runtime unreachability, alignment intent or payload semantics.",
7
+ "region_bytes": 353788,
8
+ "region_file_offset": 1971712,
9
+ "segments": [
10
+ {
11
+ "bytes": 40,
12
+ "classification": "referenced_structure",
13
+ "evidence_kinds": [
14
+ "resource_directory_and_entries"
15
+ ],
16
+ "file_offset": 1971712,
17
+ "sha256": "7210c11a3bb63adaa5b229d6e64ec64b3678ce6508e84795c9596d9c3692f60a"
18
+ },
19
+ {
20
+ "bytes": 72,
21
+ "classification": "referenced_structure",
22
+ "evidence_kinds": [
23
+ "resource_directory_and_entries"
24
+ ],
25
+ "file_offset": 1971752,
26
+ "sha256": "fb97e86de73d6d2a9316e25b755b3ee90ba4d79e346a31fd262287b832ea3744"
27
+ },
28
+ {
29
+ "bytes": 24,
30
+ "classification": "referenced_structure",
31
+ "evidence_kinds": [
32
+ "resource_directory_and_entries"
33
+ ],
34
+ "file_offset": 1971824,
35
+ "sha256": "952116c0b857d15a459c92accc41831b873536fa7d577b663e4330c87b84151b"
36
+ },
37
+ {
38
+ "bytes": 24,
39
+ "classification": "referenced_structure",
40
+ "evidence_kinds": [
41
+ "resource_directory_and_entries"
42
+ ],
43
+ "file_offset": 1971848,
44
+ "sha256": "3bdbe9008ecfab3ca3dec6b1ba1d5ea7a68ffde1a036cc140889c85823f27cb0"
45
+ },
46
+ {
47
+ "bytes": 24,
48
+ "classification": "referenced_structure",
49
+ "evidence_kinds": [
50
+ "resource_directory_and_entries"
51
+ ],
52
+ "file_offset": 1971872,
53
+ "sha256": "abbc8b90ae6003ba1e829b5e123b1595b8febfc00b4f751bc0e9eb908cab1b25"
54
+ },
55
+ {
56
+ "bytes": 24,
57
+ "classification": "referenced_structure",
58
+ "evidence_kinds": [
59
+ "resource_directory_and_entries"
60
+ ],
61
+ "file_offset": 1971896,
62
+ "sha256": "9a6bceccb0c8c0424c464c93c729f97a2b6e58c788796160a41782fb0a7b6f29"
63
+ },
64
+ {
65
+ "bytes": 24,
66
+ "classification": "referenced_structure",
67
+ "evidence_kinds": [
68
+ "resource_directory_and_entries"
69
+ ],
70
+ "file_offset": 1971920,
71
+ "sha256": "310c67121a66b7febcf34beda613247893e935ed6f289314ba4ff9256b2a3e51"
72
+ },
73
+ {
74
+ "bytes": 24,
75
+ "classification": "referenced_structure",
76
+ "evidence_kinds": [
77
+ "resource_directory_and_entries"
78
+ ],
79
+ "file_offset": 1971944,
80
+ "sha256": "939783d96aec0a334c97cfd0a3d099f8227fe42a55f14945fd182a0a1ccba68e"
81
+ },
82
+ {
83
+ "bytes": 24,
84
+ "classification": "referenced_structure",
85
+ "evidence_kinds": [
86
+ "resource_directory_and_entries"
87
+ ],
88
+ "file_offset": 1971968,
89
+ "sha256": "a9b16befc58931acfeef0e5313e8dafa6f3574104ce6126ee389b884f379e4c5"
90
+ },
91
+ {
92
+ "bytes": 24,
93
+ "classification": "referenced_structure",
94
+ "evidence_kinds": [
95
+ "resource_directory_and_entries"
96
+ ],
97
+ "file_offset": 1971992,
98
+ "sha256": "0c5af0f5926891d7fd787b6c1dacdb56c49bef028147f85d664725e27cca667a"
99
+ },
100
+ {
101
+ "bytes": 24,
102
+ "classification": "referenced_structure",
103
+ "evidence_kinds": [
104
+ "resource_directory_and_entries"
105
+ ],
106
+ "file_offset": 1972016,
107
+ "sha256": "bae666d29add6ce4253f161d4db3022cbba11a7758b61220b95b69add8de88f0"
108
+ },
109
+ {
110
+ "bytes": 24,
111
+ "classification": "referenced_structure",
112
+ "evidence_kinds": [
113
+ "resource_directory_and_entries"
114
+ ],
115
+ "file_offset": 1972040,
116
+ "sha256": "895cccfb0bd6c84a171c2d402fb53153f823f7df895cbe5b3ade34cc7afd9881"
117
+ },
118
+ {
119
+ "bytes": 24,
120
+ "classification": "referenced_structure",
121
+ "evidence_kinds": [
122
+ "resource_directory_and_entries"
123
+ ],
124
+ "file_offset": 1972064,
125
+ "sha256": "ce23d45599882a41f5f43861ef1607af7fa1413469feeeed6ce69ed272eff4f2"
126
+ },
127
+ {
128
+ "bytes": 16,
129
+ "classification": "referenced_structure",
130
+ "evidence_kinds": [
131
+ "resource_data_descriptor"
132
+ ],
133
+ "file_offset": 1972088,
134
+ "sha256": "4fb3c2d965adbb3a952f5eb7c2c65457f2cb38460a0d037a7c39b16f2e97e872"
135
+ },
136
+ {
137
+ "bytes": 16,
138
+ "classification": "referenced_structure",
139
+ "evidence_kinds": [
140
+ "resource_data_descriptor"
141
+ ],
142
+ "file_offset": 1972104,
143
+ "sha256": "eb0ac973f24c2920723a6ec415673e69a0812cceb7add1caf2083eb05014feb7"
144
+ },
145
+ {
146
+ "bytes": 16,
147
+ "classification": "referenced_structure",
148
+ "evidence_kinds": [
149
+ "resource_data_descriptor"
150
+ ],
151
+ "file_offset": 1972120,
152
+ "sha256": "5e03f638c5cd728827ae3f20f3b03111c1872022563dd42a599972d57f258ad5"
153
+ },
154
+ {
155
+ "bytes": 16,
156
+ "classification": "referenced_structure",
157
+ "evidence_kinds": [
158
+ "resource_data_descriptor"
159
+ ],
160
+ "file_offset": 1972136,
161
+ "sha256": "b0c8826bda806dfd3f116fbf0511a8f931d09b4b7fc0e72c269fce129b3f7b20"
162
+ },
163
+ {
164
+ "bytes": 16,
165
+ "classification": "referenced_structure",
166
+ "evidence_kinds": [
167
+ "resource_data_descriptor"
168
+ ],
169
+ "file_offset": 1972152,
170
+ "sha256": "3bcf6b99eed90db20bed49558d7dd88bc73f72fac01e9933908e5f935f5bc379"
171
+ },
172
+ {
173
+ "bytes": 16,
174
+ "classification": "referenced_structure",
175
+ "evidence_kinds": [
176
+ "resource_data_descriptor"
177
+ ],
178
+ "file_offset": 1972168,
179
+ "sha256": "9323b25ddee9a7a3cafe26d757f26ff0fba01aa90cc996f683efe62e0e6b513c"
180
+ },
181
+ {
182
+ "bytes": 16,
183
+ "classification": "referenced_structure",
184
+ "evidence_kinds": [
185
+ "resource_data_descriptor"
186
+ ],
187
+ "file_offset": 1972184,
188
+ "sha256": "6b48b75159f618796ad9c8e8f6c24b445b7fd35a9836b4e19c44db25f53a5063"
189
+ },
190
+ {
191
+ "bytes": 16,
192
+ "classification": "referenced_structure",
193
+ "evidence_kinds": [
194
+ "resource_data_descriptor"
195
+ ],
196
+ "file_offset": 1972200,
197
+ "sha256": "8fe179601c1c018abbab9c4a61d3345ee21df58f1b206035bc8a70cebaaead22"
198
+ },
199
+ {
200
+ "bytes": 16,
201
+ "classification": "referenced_structure",
202
+ "evidence_kinds": [
203
+ "resource_data_descriptor"
204
+ ],
205
+ "file_offset": 1972216,
206
+ "sha256": "de1e6a87e3bbfb6564a2ec0680e9c03e72faf0e16972bc517c9a043a20b5e2a5"
207
+ },
208
+ {
209
+ "bytes": 1384,
210
+ "classification": "referenced_structure",
211
+ "evidence_kinds": [
212
+ "resource_payload"
213
+ ],
214
+ "file_offset": 1972232,
215
+ "sha256": "7e91bc2f2c1cae398aed49c77e076f72fb7df4d37acf6e10535b5c87579c472c"
216
+ },
217
+ {
218
+ "bytes": 1320,
219
+ "classification": "referenced_structure",
220
+ "evidence_kinds": [
221
+ "resource_payload"
222
+ ],
223
+ "file_offset": 1973616,
224
+ "sha256": "d5697c5c2d3c4f6f9c3ecfd99c0137eea1098ff9941435974b2f9a62b4fa21e9"
225
+ },
226
+ {
227
+ "bytes": 2216,
228
+ "classification": "referenced_structure",
229
+ "evidence_kinds": [
230
+ "resource_payload"
231
+ ],
232
+ "file_offset": 1974936,
233
+ "sha256": "5f182e38fd1044fb6cb701d0ffe4929546155f5a10c135a31e14f3b431227581"
234
+ },
235
+ {
236
+ "bytes": 5160,
237
+ "classification": "referenced_structure",
238
+ "evidence_kinds": [
239
+ "resource_payload"
240
+ ],
241
+ "file_offset": 1977152,
242
+ "sha256": "7a766ebde718a8d82cade2d990b1025c6ee6e8b0e83361e7282c0dcb6e46899c"
243
+ },
244
+ {
245
+ "bytes": 3752,
246
+ "classification": "referenced_structure",
247
+ "evidence_kinds": [
248
+ "resource_payload"
249
+ ],
250
+ "file_offset": 1982312,
251
+ "sha256": "561be52eacd9c73b5fb5141c636a8c3fc6090977476396fd7597c54472b195c9"
252
+ },
253
+ {
254
+ "bytes": 11560,
255
+ "classification": "referenced_structure",
256
+ "evidence_kinds": [
257
+ "resource_payload"
258
+ ],
259
+ "file_offset": 1986064,
260
+ "sha256": "79e8a802daf7aa78838fc3e5d7837cffd4e09a7922264da9690bb28d0e286bb5"
261
+ },
262
+ {
263
+ "bytes": 327720,
264
+ "classification": "referenced_structure",
265
+ "evidence_kinds": [
266
+ "resource_payload"
267
+ ],
268
+ "file_offset": 1997624,
269
+ "sha256": "8c3a46e5fdc315824a8100c11a5bbf479df8d56266a4efc078a7d2a111e7e92f"
270
+ },
271
+ {
272
+ "bytes": 52,
273
+ "classification": "referenced_structure",
274
+ "evidence_kinds": [
275
+ "resource_payload"
276
+ ],
277
+ "file_offset": 2325344,
278
+ "sha256": "963f626117e91ab3f1f97e30ce012bb855bd564bbb3e8b745ee2a7424753c44c"
279
+ },
280
+ {
281
+ "bytes": 104,
282
+ "classification": "referenced_structure",
283
+ "evidence_kinds": [
284
+ "resource_payload"
285
+ ],
286
+ "file_offset": 2325396,
287
+ "sha256": "35f2a898666580776a08e4e56ff6db778dc8abcfa74b6729a03407e0938884ef"
288
+ }
289
+ ],
290
+ "source": {
291
+ "bytes": 2634689,
292
+ "path": "Quake3-UrT.exe",
293
+ "sha256": "94111a3091c7e70e534720585df58820f0481c0894ba7b29f4f7de09accbaf90"
294
+ }
295
+ }
scripts/analyze_auth_drop.py ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Preserve the auth-drop call boundary and its native invalid-index continuation."""
3
+ import gzip
4
+ import json
5
+ from pathlib import Path
6
+ import re
7
+ from analyze_native import parse, take
8
+ from analyze_native_dispatch import recover
9
+ from analyze_qvm import decode, write_json
10
+ from analyze_vm_extensions import verified, native_functions
11
+
12
+
13
+ def ascii_literal(data, offset, end):
14
+ if not 0 <= offset < end <= len(data):
15
+ return None
16
+ stop = data.find(b'\0', offset, end)
17
+ if stop < 0:
18
+ return None
19
+ payload = data[offset:stop]
20
+ if len(payload) < 4 or not all(32 <= c <= 126 or c in (9, 10, 13) for c in payload):
21
+ return None
22
+ return payload.decode('ascii')
23
+
24
+
25
+ def invalid_continuation(case, lines):
26
+ # Restrict this recognizer to the actual signed-index guard pattern.
27
+ guards = [re.search(r'\t(js|jge)\s+0x([0-9a-f]+)', line) for line in case['first_instructions']]
28
+ guards = [g for g in guards if g]
29
+ if len(guards) != 2 or [g[1] for g in guards] != ['js', 'jge'] or guards[0][2] != guards[1][2]:
30
+ raise ValueError('unrecognized auth-drop index guards')
31
+ address = int(guards[0][2], 16)
32
+ indexes = {}
33
+ for i, line in enumerate(lines):
34
+ m = re.match(r'\s*([0-9a-f]+):', line)
35
+ if m:
36
+ indexes[int(m[1], 16)] = i
37
+ if address not in indexes:
38
+ raise ValueError('guard continuation is not disassembled')
39
+ index = indexes[address]
40
+ continuation = lines[index:index+2]
41
+ if len(continuation) != 2 or not re.search(r'\txorl\s+%eax, %eax', continuation[0]) or not re.search(r'\tjmp\s+0x', continuation[1]):
42
+ raise ValueError('invalid index does not match known zero-result continuation')
43
+ target = int(re.search(r'\tjmp\s+0x([0-9a-f]+)', continuation[1])[1], 16)
44
+ if target not in indexes:
45
+ raise ValueError('missing common return continuation')
46
+ start = indexes[target]
47
+ epilogue = []
48
+ for line in lines[start:start+20]:
49
+ epilogue.append(line.strip())
50
+ if re.search(r'\tretq?\s*$', line):
51
+ break
52
+ m = re.search(r'\t(\w+)\s*(.*)', line)
53
+ if not m or m[1] not in ('movq', 'addq', 'popq', 'nop', 'nopl', 'nopw') or '%eax' in m[2] or '%rax' in m[2]:
54
+ raise ValueError('common return could alter result or control flow')
55
+ else:
56
+ raise ValueError('common return not found within bound')
57
+ return {'address': address, 'instructions': [l.strip() for l in continuation],
58
+ 'common_return_address': target, 'common_return_instructions': epilogue,
59
+ 'result': 0}
60
+
61
+
62
+ def main():
63
+ output = {'native': {}, 'limitations': 'Linux ELF64 static boundary evidence. Literal operands are candidates, '
64
+ 'not whole-program dataflow. No runtime reference fixtures or all-platform contract.'}
65
+ for label in ('linux--Quake3-UrT-Ded.x86_64', 'linux--Quake3-UrT.x86_64'):
66
+ report = json.loads(Path(f'docs/research/native/{label}.json').read_text())
67
+ data = verified((Path('.cache/UrbanTerror43')/report['source']['path']).read_bytes(), report['source']['sha256'])
68
+ layout, _ = parse(data)
69
+ artifact = report['artifacts']['disassembly.txt']
70
+ text = verified(gzip.open(artifact['path'], 'rb').read(), artifact['uncompressed_sha256']).decode()
71
+ functions = native_functions(text)
72
+ dispatch = recover(data, text, 'SV_GameSystemCalls')
73
+ case = next(c for c in dispatch['cases'] if c['numbers_sharing_target'] == [603])
74
+ literals = []
75
+ function = functions['SV_Auth_DropClient']
76
+ for line in function['lines']:
77
+ for match in re.finditer(r'\$0x([0-9a-f]+)', line):
78
+ address = int(match[1], 16)
79
+ section = next((s for s in layout['sections'] if s['flags'] & 2 and not s['zero_fill'] and not s['executable'] and
80
+ s['address'] <= address < s['address']+s['bytes']), None)
81
+ if section:
82
+ offset = section['file_offset']+address-section['address']
83
+ value = ascii_literal(data, offset, section['file_offset']+section['bytes'])
84
+ if value:
85
+ literals.append({'address': address, 'file_offset': offset, 'text': value,
86
+ 'instruction': line.strip()})
87
+ output['native'][label] = {'source': report['source'], 'disassembly_sha256': artifact['uncompressed_sha256'],
88
+ 'case': case, 'invalid_index': invalid_continuation(case, text.splitlines()),
89
+ 'function': function, 'literal_operand_candidates': literals}
90
+ report = json.loads(Path('docs/research/qvm/qagame.json').read_text())
91
+ data = verified(Path(report['source']['member']['output']).read_bytes(), report['sha256'])
92
+ header, instructions = decode(data)
93
+ site = next(i for i in range(1, len(instructions)) if instructions[i]['opcode'] == 'CALL' and
94
+ instructions[i-1]['opcode'] == 'CONST' and instructions[i-1]['operand'] == -604)
95
+ start = next(i for i in range(site, -1, -1) if instructions[i]['opcode'] == 'ENTER')
96
+ end = next(i for i in range(site+1, len(instructions)) if instructions[i]['opcode'] == 'ENTER')
97
+ strings = []
98
+ for ins in instructions[start:end]:
99
+ if ins['opcode'] == 'CONST' and instructions[ins['index']+1]['opcode'] == 'ARG' and 0 <= ins['operand'] < header['data_length']+header['literal_length']:
100
+ offset = header['data_offset']+ins['operand']
101
+ value = ascii_literal(data, offset, header['data_offset']+header['data_length']+header['literal_length'])
102
+ if value:
103
+ strings.append({'instruction': ins['index'], 'vm_address': ins['operand'], 'text': value})
104
+ output['qvm'] = {'source': report['source'], 'sha256': report['sha256'], 'call_instruction': site,
105
+ 'containing_entry': start, 'instructions': instructions[start:end],
106
+ 'literal_operand_candidates': strings}
107
+ write_json(Path('docs/research/auth-drop.json'), output)
108
+ print('Recovered both auth-drop invalid-index zero-return paths and literal operands')
109
+
110
+
111
+ if __name__ == '__main__':
112
+ main()
scripts/analyze_binaries.py CHANGED
@@ -10,7 +10,7 @@ def main():
10
  raise SystemExit('Run from the repository root')
11
  for script in ('fetch_analysis_references.py', 'analyze_qvm.py', 'analyze_native.py',
12
  'analyze_vm_abi.py', 'analyze_native_dispatch.py', 'analyze_vm_extensions.py',
13
- 'analyze_native_metadata.py'):
14
  subprocess.run([sys.executable, str(Path('scripts')/script)], check=True)
15
 
16
 
 
10
  raise SystemExit('Run from the repository root')
11
  for script in ('fetch_analysis_references.py', 'analyze_qvm.py', 'analyze_native.py',
12
  'analyze_vm_abi.py', 'analyze_native_dispatch.py', 'analyze_vm_extensions.py',
13
+ 'analyze_native_metadata.py', 'analyze_native_coverage.py', 'analyze_auth_drop.py'):
14
  subprocess.run([sys.executable, str(Path('scripts')/script)], check=True)
15
 
16
 
scripts/analyze_native_coverage.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Reconcile bounded source byte ranges against structural analysis evidence."""
3
+ import hashlib
4
+ import json
5
+ from pathlib import Path
6
+ from analyze_native import parse, take
7
+ from analyze_native_metadata import resource_leaves, rva_range
8
+ from analyze_qvm import write_json
9
+ from analyze_vm_extensions import verified
10
+
11
+
12
+ def partition(data, offset, size, ranges, gap_classifier):
13
+ take(data, offset, size)
14
+ end = offset+size
15
+ points = {offset, end}
16
+ for r in ranges:
17
+ if r['bytes'] < 0 or not offset <= r['file_offset'] <= r['file_offset']+r['bytes'] <= end:
18
+ raise ValueError('evidence range outside coverage region')
19
+ points.update([r['file_offset'], r['file_offset']+r['bytes']])
20
+ points = sorted(points)
21
+ segments = []
22
+ for start, stop in zip(points, points[1:]):
23
+ if start == stop:
24
+ continue
25
+ labels = sorted({r['kind'] for r in ranges if r['file_offset'] <= start and stop <= r['file_offset']+r['bytes']})
26
+ payload = take(data, start, stop-start)
27
+ segments.append({'file_offset': start, 'bytes': stop-start, 'evidence_kinds': labels,
28
+ 'classification': 'referenced_structure' if labels else gap_classifier(payload),
29
+ 'sha256': hashlib.sha256(payload).hexdigest(),
30
+ **({'hex': payload.hex()} if not labels else {})})
31
+ counts = {}
32
+ for s in segments:
33
+ counts[s['classification']] = counts.get(s['classification'], 0)+s['bytes']
34
+ return {'region_file_offset': offset, 'region_bytes': size, 'segments': segments, 'classification_bytes': counts}
35
+
36
+
37
+ def main():
38
+ results = []
39
+ for label in ('macos--libSDL-1.2.0.dylib', 'windows--Quake3-UrT.exe'):
40
+ report = json.loads(Path(f'docs/research/native/{label}.json').read_text())
41
+ data = verified((Path('.cache/UrbanTerror43')/report['source']['path']).read_bytes(), report['source']['sha256'])
42
+ layout, _ = parse(data)
43
+ if layout['format'] == 'Mach-O':
44
+ from analyze_native_metadata import stab_records, decode_stabs
45
+ metadata = decode_stabs(data, layout, stab_records(data, layout))
46
+ section = next(s for s in layout['sections'] if s['name'] == '__text')
47
+ ranges = [{**f, 'kind': 'paired_STABS_function'} for f in metadata['functions']]
48
+ coverage = partition(data, section['file_offset'], section['bytes'], ranges,
49
+ lambda b: 'x86_single_byte_NOP_sequence' if b == b'\x90'*len(b) else 'unclassified')
50
+ else:
51
+ ranges = []
52
+ leaves = resource_leaves(data, layout, ranges)
53
+ directory = next(d for d in layout['data_directories'] if d['index'] == 2)
54
+ offset, _ = rva_range(data, layout, directory['rva_or_security_file_offset'], directory['bytes'])
55
+ coverage = partition(data, offset, directory['bytes'], ranges,
56
+ lambda b: 'zero_filled_gap' if not any(b) else 'unclassified')
57
+ coverage['leaf_count'] = len(leaves)
58
+ output = {'source': report['source'], **coverage, 'limitations':
59
+ 'Coverage is limited to the named SDL text section or PE resource-directory region. '
60
+ 'Byte-pattern gap classification does not prove runtime unreachability, alignment intent or payload semantics.'}
61
+ write_json(Path(f'docs/research/native/{label}.coverage.json'), output)
62
+ results.append({'image': label, 'region_bytes': coverage['region_bytes'],
63
+ 'classification_bytes': coverage['classification_bytes'],
64
+ 'gap_count': sum(not s['evidence_kinds'] for s in coverage['segments'])})
65
+ write_json(Path('docs/research/native/coverage-summary.json'), results)
66
+ print(json.dumps(results, indent=2))
67
+
68
+
69
+ if __name__ == '__main__':
70
+ main()
scripts/analyze_native_metadata.py CHANGED
@@ -94,14 +94,17 @@ def rva_range(data, layout, rva, size):
94
  return offset, take(data, offset, size)
95
 
96
 
97
- def resource_leaves(data, layout):
98
  if layout['format'] != 'PE':
99
  raise ValueError('resource reader expects PE')
100
  directory = next((d for d in layout['data_directories'] if d['index'] == 2), None)
101
  if not directory or not directory['bytes']:
102
  return []
103
  base = directory['rva_or_security_file_offset']
104
- _, tree = rva_range(data, layout, base, directory['bytes'])
 
 
 
105
  leaves = []
106
  nodes = 0
107
  def walk(offset, path, ancestors):
@@ -112,6 +115,7 @@ def resource_leaves(data, layout):
112
  header = unpack('<IIHHHH', tree, offset)
113
  named, ids = header[-2:]
114
  entries = take(tree, offset+16, (named+ids)*8)
 
115
  for i in range(named+ids):
116
  name, target = unpack('<II', entries, i*8)
117
  if bool(name & 0x80000000) != (i < named):
@@ -120,6 +124,7 @@ def resource_leaves(data, layout):
120
  at = name & 0x7fffffff
121
  length = unpack('<H', tree, at)[0]
122
  component = take(tree, at+2, length*2).decode('utf-16le')
 
123
  else:
124
  component = name
125
  current = path+[component]
@@ -127,9 +132,12 @@ def resource_leaves(data, layout):
127
  walk(target & 0x7fffffff, current, ancestors | {offset})
128
  else:
129
  rva, size, codepage, reserved = unpack('<4I', tree, target)
 
130
  if reserved:
131
  raise ValueError('nonzero resource data reserved field')
132
  file_offset, payload = rva_range(data, layout, rva, size)
 
 
133
  leaves.append({'path': current, 'data_entry_relative_offset': target,
134
  'rva': rva, 'file_offset': file_offset, 'bytes': size, 'codepage': codepage,
135
  'sha256': hashlib.sha256(payload).hexdigest()})
 
94
  return offset, take(data, offset, size)
95
 
96
 
97
+ def resource_leaves(data, layout, regions=None):
98
  if layout['format'] != 'PE':
99
  raise ValueError('resource reader expects PE')
100
  directory = next((d for d in layout['data_directories'] if d['index'] == 2), None)
101
  if not directory or not directory['bytes']:
102
  return []
103
  base = directory['rva_or_security_file_offset']
104
+ tree_file_offset, tree = rva_range(data, layout, base, directory['bytes'])
105
+ def record(offset, size, kind):
106
+ if regions is not None:
107
+ regions.append({'file_offset': tree_file_offset+offset, 'bytes': size, 'kind': kind})
108
  leaves = []
109
  nodes = 0
110
  def walk(offset, path, ancestors):
 
115
  header = unpack('<IIHHHH', tree, offset)
116
  named, ids = header[-2:]
117
  entries = take(tree, offset+16, (named+ids)*8)
118
+ record(offset, 16+(named+ids)*8, 'resource_directory_and_entries')
119
  for i in range(named+ids):
120
  name, target = unpack('<II', entries, i*8)
121
  if bool(name & 0x80000000) != (i < named):
 
124
  at = name & 0x7fffffff
125
  length = unpack('<H', tree, at)[0]
126
  component = take(tree, at+2, length*2).decode('utf-16le')
127
+ record(at, 2+length*2, 'resource_name_utf16')
128
  else:
129
  component = name
130
  current = path+[component]
 
132
  walk(target & 0x7fffffff, current, ancestors | {offset})
133
  else:
134
  rva, size, codepage, reserved = unpack('<4I', tree, target)
135
+ record(target, 16, 'resource_data_descriptor')
136
  if reserved:
137
  raise ValueError('nonzero resource data reserved field')
138
  file_offset, payload = rva_range(data, layout, rva, size)
139
+ if regions is not None:
140
+ regions.append({'file_offset': file_offset, 'bytes': size, 'kind': 'resource_payload'})
141
  leaves.append({'path': current, 'data_entry_relative_offset': target,
142
  'rva': rva, 'file_offset': file_offset, 'bytes': size, 'codepage': codepage,
143
  'sha256': hashlib.sha256(payload).hexdigest()})
scripts/test_native_followup.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Coverage accounting and auth-drop boundary recognition tests."""
3
+ import hashlib
4
+ import json
5
+ from pathlib import Path
6
+ import unittest
7
+ from analyze_native_coverage import partition
8
+ from analyze_auth_drop import invalid_continuation, ascii_literal
9
+
10
+
11
+ class FollowupTests(unittest.TestCase):
12
+ def test_partition_overlap_is_counted_once(self):
13
+ r = partition(b'abcdef', 0, 6, [{'file_offset': 0, 'bytes': 4, 'kind': 'a'},
14
+ {'file_offset': 2, 'bytes': 4, 'kind': 'b'}], lambda b: 'unknown')
15
+ self.assertEqual(r['classification_bytes'], {'referenced_structure': 6})
16
+ self.assertEqual(r['segments'][1]['evidence_kinds'], ['a', 'b'])
17
+
18
+ def test_partition_gaps_and_invalid_ranges(self):
19
+ r = partition(b'a\0\0b', 0, 4, [{'file_offset': 0, 'bytes': 1, 'kind': 'a'},
20
+ {'file_offset': 3, 'bytes': 1, 'kind': 'b'}], lambda b: 'zero' if not any(b) else 'unknown')
21
+ self.assertEqual(r['classification_bytes'], {'referenced_structure': 2, 'zero': 2})
22
+ for offset, size in [(-1, 1), (3, 2), (2, -1)]:
23
+ with self.assertRaises(ValueError):
24
+ partition(b'abcd', 0, 4, [{'file_offset': offset, 'bytes': size, 'kind': 'bad'}], lambda b: 'unknown')
25
+
26
+ def continuation_fixture(self):
27
+ case = {'first_instructions': [' 10: aa\tjs\t0x20', ' 11: aa\tjge\t0x20']}
28
+ lines = [' 20: 31 c0\txorl\t%eax, %eax', ' 22: e9\tjmp\t0x30',
29
+ ' 30: aa\tmovq\t0x8(%rsp), %rbx', ' 34: c3\tretq']
30
+ return case, lines
31
+
32
+ def test_zero_result_guard_and_epilogue(self):
33
+ case, lines = self.continuation_fixture()
34
+ self.assertEqual(invalid_continuation(case, lines)['result'], 0)
35
+
36
+ def test_guard_divergence_and_result_clobber_rejected(self):
37
+ case, lines = self.continuation_fixture()
38
+ case['first_instructions'][1] = ' 11: aa\tjge\t0x21'
39
+ with self.assertRaises(ValueError):
40
+ invalid_continuation(case, lines)
41
+ case, lines = self.continuation_fixture()
42
+ lines[2] = ' 30: aa\tmovq\t0x8(%rsp), %rax'
43
+ with self.assertRaises(ValueError):
44
+ invalid_continuation(case, lines)
45
+
46
+ def test_literal_is_bounded_and_allows_newlines(self):
47
+ self.assertEqual(ascii_literal(b'hello\n\0tail', 0, 7), 'hello\n')
48
+ self.assertIsNone(ascii_literal(b'hello\0', 0, 5))
49
+ self.assertIsNone(ascii_literal(b'hello\xff\0', 0, 7))
50
+
51
+ def test_shipped_regions_exactly_partition_source(self):
52
+ for label in ('macos--libSDL-1.2.0.dylib', 'windows--Quake3-UrT.exe'):
53
+ r = json.loads(Path(f'docs/research/native/{label}.coverage.json').read_text())
54
+ data = (Path('.cache/UrbanTerror43')/r['source']['path']).read_bytes()
55
+ self.assertEqual(hashlib.sha256(data).hexdigest(), r['source']['sha256'])
56
+ cursor = r['region_file_offset']
57
+ for s in r['segments']:
58
+ self.assertEqual(s['file_offset'], cursor)
59
+ payload = data[cursor:cursor+s['bytes']]
60
+ self.assertEqual(hashlib.sha256(payload).hexdigest(), s['sha256'])
61
+ if not s['evidence_kinds']:
62
+ self.assertEqual(payload, b'\x90'*s['bytes'])
63
+ cursor += s['bytes']
64
+ self.assertEqual(cursor, r['region_file_offset']+r['region_bytes'])
65
+ self.assertEqual(sum(r['classification_bytes'].values()), r['region_bytes'])
66
+ self.assertNotIn('unclassified', r['classification_bytes'])
67
+
68
+ def test_shipped_auth_formats_and_zero_results(self):
69
+ r = json.loads(Path('docs/research/auth-drop.json').read_text())
70
+ for n in r['native'].values():
71
+ self.assertEqual(n['invalid_index']['result'], 0)
72
+ self.assertEqual({s['text'] for s in n['literal_operand_candidates']},
73
+ {'disconnect "%s"', 'print "%s\n"', 'Going to CS_ZOMBIE for %s\n', 'stopserverdemo %d'})
74
+ self.assertEqual(r['qvm']['containing_entry'], 165818)
75
+ self.assertEqual(r['qvm']['call_instruction'], 165943)
76
+ self.assertEqual(len(r['qvm']['literal_operand_candidates']), 3)
77
+
78
+
79
+ if __name__ == '__main__':
80
+ unittest.main()