wowdump 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/adapters.js +101 -0
  4. package/dist/agent.js +1335 -0
  5. package/dist/analysis-path.js +38 -0
  6. package/dist/analysis-process-log.js +146 -0
  7. package/dist/broker-client.js +411 -0
  8. package/dist/broker-codec.js +148 -0
  9. package/dist/broker-core.js +1045 -0
  10. package/dist/broker-gateway.js +447 -0
  11. package/dist/broker-ledger.js +196 -0
  12. package/dist/broker-main.js +291 -0
  13. package/dist/broker-protocol.js +119 -0
  14. package/dist/broker-runtime.js +1283 -0
  15. package/dist/broker-server.js +466 -0
  16. package/dist/build-bundle-loader.js +183 -0
  17. package/dist/build-bundle.js +11 -0
  18. package/dist/discovery.js +59 -0
  19. package/dist/dry-run.js +38 -0
  20. package/dist/error-log.js +71 -0
  21. package/dist/focus-errors.js +63 -0
  22. package/dist/focus-service.js +1855 -0
  23. package/dist/focused-session.js +1357 -0
  24. package/dist/frida-runtime.js +711 -0
  25. package/dist/mcp-main.js +51 -0
  26. package/dist/mcp.js +924 -0
  27. package/dist/observability.js +41 -0
  28. package/dist/process-log-lock.js +181 -0
  29. package/dist/processes.js +47 -0
  30. package/dist/runtime-config.js +399 -0
  31. package/dist/session.js +145 -0
  32. package/dist/storage.js +12 -0
  33. package/dist/types.js +26 -0
  34. package/dist/wow-analysis.js +1430 -0
  35. package/package.json +64 -13
  36. package/resources/builds/retail/12.0.7.68974/build-profile.json +290 -0
  37. package/resources/builds/retail/12.0.7.68974/data-sources.json +1633 -0
  38. package/resources/builds/retail/12.0.7.68974/lua-targets.jsonl +5130 -0
  39. package/resources/builds/retail/12.0.7.68974/manifest.json +63 -0
  40. package/resources/builds/retail/12.0.7.68974/signatures.json +260 -0
  41. package/index.js +0 -1
package/dist/agent.js ADDED
@@ -0,0 +1,1335 @@
1
+ 📦
2
+ 1715 /agent/index.js.map
3
+ 2029 /agent/index.js
4
+ 48270 /agent/lua-trace.js.map
5
+ 52237 /agent/lua-trace.js
6
+
7
+ {"version":3,"file":"index.js","sourceRoot":"D:/a/wowdump/wowdump/","sources":["agent/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EACL,uBAAuB,EAIxB,MAAM,gBAAgB,CAAC;AAOxB,IAAI,cAAc,GAA6B,IAAI,CAAC;AAEpD,IAAI,CAAC;IACH,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,CAAC;IACT,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,EAAE;CACrB,CAAC,CAAC;AAEH,iFAAiF;AACjF,+EAA+E;AAC/E,2EAA2E;AAC3E,SAAS,gBAAgB,CAAC,QAAiB;IACzC,yCAAyC;AAC3C,CAAC;AAED,SAAS,qBAAqB;IAC5B,IAAI,cAAc,KAAK,IAAI,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;KACxD;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,GAAG,CAAC,OAAO,GAAG;IACZ,eAAe;QACb,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,iBAAiB,CAAC,OAAwB;QACxC,IAAI,cAAc,KAAK,IAAI;YAAE,cAAc,CAAC,OAAO,EAAE,CAAC;QACtD,cAAc,GAAG,uBAAuB,CAAC,OAAO,EAAE;YAChD,OAAO,CAAC,KAAK;gBACX,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,CAAC;SACF,CAAC,CAAC;QACH,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;YAC/B,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM;SACxC,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,OAA6B;QAC5C,OAAO,qBAAqB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,eAAe,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;QACxC,OAAO,qBAAqB,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,iBAAiB;QACf,OAAO,qBAAqB,EAAE,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,eAAe,CAAC,MAAM,GAAG,WAAW;QAClC,OAAO,qBAAqB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,IAAI,cAAc,KAAK,IAAI;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QACxC,cAAc,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9D,CAAC;CACF,CAAC"}
8
+
9
+ // GumJS agent. This file intentionally contains no Node APIs.
10
+ import { createWowLuaTraceEngine } from "./lua-trace.js";
11
+ let luaTraceEngine = null;
12
+ send({
13
+ type: "agent_ready",
14
+ schema: 1,
15
+ semanticReadOnly: true,
16
+ observationTiers: []
17
+ });
18
+ // Build-specific resolvers will call this only after a verified signature match.
19
+ // The resolver policy is semantic read-only: Memory.read* only, no argument or
20
+ // return-value changes, no Lua API calls, and no control-flow replacement.
21
+ function installErrorHook(_address) {
22
+ // Reserved for a verified build adapter.
23
+ }
24
+ function requireLuaTraceEngine() {
25
+ if (luaTraceEngine === null) {
26
+ throw new Error("Lua trace catalog is not configured");
27
+ }
28
+ return luaTraceEngine;
29
+ }
30
+ rpc.exports = {
31
+ collectorStatus() {
32
+ return { ready: true };
33
+ },
34
+ configureLuaTrace(catalog) {
35
+ if (luaTraceEngine !== null)
36
+ luaTraceEngine.dispose();
37
+ luaTraceEngine = createWowLuaTraceEngine(catalog, {
38
+ onEvent(event) {
39
+ send({ type: "lua_trace_event", schema: 1, event });
40
+ }
41
+ });
42
+ return {
43
+ configured: true,
44
+ buildKey: catalog.buildKey,
45
+ moduleName: catalog.moduleName,
46
+ targets: catalog.targets.length,
47
+ abiProfiles: catalog.abiProfiles.length
48
+ };
49
+ },
50
+ wowLuaTraceStart(request) {
51
+ return requireLuaTraceEngine().start(request);
52
+ },
53
+ wowLuaTraceRead(afterSeq = 0, limit = 1000) {
54
+ return requireLuaTraceEngine().read(afterSeq, limit);
55
+ },
56
+ wowLuaTraceStatus() {
57
+ return requireLuaTraceEngine().status();
58
+ },
59
+ wowLuaTraceStop(reason = "requested") {
60
+ return requireLuaTraceEngine().stop(reason);
61
+ },
62
+ dispose() {
63
+ if (luaTraceEngine === null)
64
+ return { disposed: true, configured: false };
65
+ const result = luaTraceEngine.dispose();
66
+ luaTraceEngine = null;
67
+ return { disposed: true, configured: false, trace: result };
68
+ }
69
+ };
70
+
71
+ {"version":3,"file":"lua-trace.js","sourceRoot":"D:/a/wowdump/wowdump/","sources":["agent/lua-trace.ts"],"names":[],"mappings":"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"}
72
+
73
+ // GumJS-only Lua native wrapper tracing. The host supplies build-specific
74
+ // records and ABI evidence; this module deliberately contains no WoW offsets.
75
+ const INVOCATION_MARKER = "__wowLuaTraceInvocation";
76
+ const DEFAULT_TAGS = {
77
+ none: -1,
78
+ nil: 0,
79
+ boolean: 1,
80
+ lightuserdata: 2,
81
+ number: 3,
82
+ string: 4,
83
+ table: 5,
84
+ function: 6,
85
+ userdata: 7,
86
+ thread: 8
87
+ };
88
+ const MIN_LIMITS = {
89
+ tableDepth: 0,
90
+ maxItems: 1,
91
+ maxStringBytes: 1,
92
+ maxStackValues: 1,
93
+ maxInvocationDepth: 1,
94
+ maxDecodeMs: 1,
95
+ maxEvents: 1,
96
+ maxHooks: 1,
97
+ staleInvocationMs: 100
98
+ };
99
+ const MAX_LIMITS = {
100
+ tableDepth: 8,
101
+ maxItems: 1024,
102
+ maxStringBytes: 1024 * 1024,
103
+ maxStackValues: 4096,
104
+ maxInvocationDepth: 1024,
105
+ maxDecodeMs: 1000,
106
+ maxEvents: 100000,
107
+ maxHooks: 5130,
108
+ staleInvocationMs: 10 * 60 * 1000
109
+ };
110
+ export class WowLuaTraceEngine {
111
+ catalog;
112
+ onEvent;
113
+ now;
114
+ module = null;
115
+ listeners = [];
116
+ framesByThread = new Map();
117
+ events = [];
118
+ eventSeq = 0;
119
+ invocationSeq = 0;
120
+ sessionSeq = 0;
121
+ sampleCounter = 0;
122
+ droppedEvents = 0;
123
+ activeConfig = null;
124
+ durationTimer = null;
125
+ maintenanceTimer = null;
126
+ active = false;
127
+ selectedRecords = 0;
128
+ startedAt = null;
129
+ stoppedAt = null;
130
+ stopReason = null;
131
+ constructor(catalog, options = {}) {
132
+ validateCatalog(catalog);
133
+ this.catalog = catalog;
134
+ this.onEvent = options.onEvent;
135
+ this.now = options.now ?? Date.now;
136
+ }
137
+ start(request) {
138
+ if (this.active) {
139
+ throw new Error("Lua trace is already active");
140
+ }
141
+ if (this.listeners.length > 0) {
142
+ throw new Error(`${this.listeners.length} listener(s) remain after a detach failure; call stop() to retry cleanup`);
143
+ }
144
+ if (request.buildKey !== this.catalog.buildKey) {
145
+ throw new Error(`Build mismatch: requested ${request.buildKey}, catalog is ${this.catalog.buildKey}`);
146
+ }
147
+ if (request.pid !== undefined && request.pid !== Process.id) {
148
+ throw new Error(`PID mismatch: agent is loaded in ${Process.id}, requested ${request.pid}`);
149
+ }
150
+ const selected = this.selectTargets(request);
151
+ if (selected.length === 0) {
152
+ throw new Error("No Lua wrapper records matched the explicit selection");
153
+ }
154
+ const maxHooks = boundedInteger(request.maxHooks, 256, MIN_LIMITS.maxHooks, MAX_LIMITS.maxHooks);
155
+ const config = normalizeConfig(request);
156
+ const durationMs = request.durationMs === undefined
157
+ ? 0
158
+ : boundedInteger(request.durationMs, 0, 0, 24 * 60 * 60 * 1000);
159
+ const module = Process.getModuleByName(this.catalog.moduleName);
160
+ this.module = module;
161
+ this.activeConfig = config;
162
+ this.selectedRecords = selected.length;
163
+ this.events = [];
164
+ this.droppedEvents = 0;
165
+ this.framesByThread.clear();
166
+ this.eventSeq = 0;
167
+ this.invocationSeq = 0;
168
+ this.sampleCounter = 0;
169
+ this.stopReason = null;
170
+ this.stoppedAt = null;
171
+ const skipped = [];
172
+ const resolved = this.resolveTargets(selected, skipped);
173
+ if (resolved.length > maxHooks) {
174
+ this.resetInactiveState();
175
+ throw new Error(`Selection resolves to ${resolved.length} hooks, exceeding maxHooks=${maxHooks}`);
176
+ }
177
+ if (resolved.length === 0) {
178
+ this.resetInactiveState();
179
+ throw new Error(`No hookable targets; skipped ${skipped.length} selected records`);
180
+ }
181
+ this.active = true;
182
+ this.sessionSeq += 1;
183
+ this.startedAt = isoTimestamp(this.now());
184
+ try {
185
+ for (const target of resolved) {
186
+ this.listeners.push(this.attachTarget(target));
187
+ }
188
+ }
189
+ catch (error) {
190
+ const detachErrors = this.detachListeners();
191
+ this.resetInactiveState();
192
+ const suffix = detachErrors.length === 0 ? "" : `; cleanup: ${detachErrors.join("; ")}`;
193
+ throw new Error(`Failed to install Lua trace hooks: ${errorText(error)}${suffix}`);
194
+ }
195
+ if (durationMs > 0) {
196
+ this.durationTimer = setTimeout(() => {
197
+ if (this.active) {
198
+ this.stop("duration_elapsed");
199
+ }
200
+ }, durationMs);
201
+ }
202
+ const maintenanceInterval = Math.min(this.activeConfig.staleInvocationMs, 1000);
203
+ this.maintenanceTimer = setInterval(() => {
204
+ if (this.active)
205
+ this.reapStaleFrames(this.now());
206
+ }, maintenanceInterval);
207
+ return {
208
+ active: true,
209
+ buildKey: this.catalog.buildKey,
210
+ pid: Process.id,
211
+ moduleName: this.module.name,
212
+ moduleBase: this.module.base.toString(),
213
+ selectedRecords: selected.length,
214
+ installedHooks: this.listeners.length,
215
+ skipped,
216
+ startedAt: this.startedAt
217
+ };
218
+ }
219
+ read(afterSeq = 0, limit = 1000) {
220
+ const safeAfterSeq = Number.isFinite(afterSeq) ? Math.max(0, Math.floor(afterSeq)) : 0;
221
+ const safeLimit = boundedInteger(limit, 1000, 1, 10000);
222
+ const selected = this.events
223
+ .filter((event) => event.seq > safeAfterSeq)
224
+ .slice(0, safeLimit);
225
+ const newestRead = selected.length > 0 ? selected[selected.length - 1].seq : safeAfterSeq;
226
+ return {
227
+ events: selected,
228
+ oldestSeq: this.events.length > 0 ? this.events[0].seq : null,
229
+ newestSeq: this.events.length > 0 ? this.events[this.events.length - 1].seq : null,
230
+ nextAfterSeq: newestRead,
231
+ droppedEvents: this.droppedEvents
232
+ };
233
+ }
234
+ status() {
235
+ let activeInvocations = 0;
236
+ for (const stack of this.framesByThread.values()) {
237
+ activeInvocations += stack.length;
238
+ }
239
+ return {
240
+ active: this.active,
241
+ buildKey: this.catalog.buildKey,
242
+ pid: Process.id,
243
+ moduleName: this.catalog.moduleName,
244
+ moduleBase: this.module?.base.toString() ?? null,
245
+ startedAt: this.startedAt,
246
+ stoppedAt: this.stoppedAt,
247
+ stopReason: this.stopReason,
248
+ installedHooks: this.listeners.length,
249
+ selectedRecords: this.selectedRecords,
250
+ activeInvocations,
251
+ queuedEvents: this.events.length,
252
+ droppedEvents: this.droppedEvents,
253
+ oldestSeq: this.events.length > 0 ? this.events[0].seq : null,
254
+ newestSeq: this.events.length > 0 ? this.events[this.events.length - 1].seq : null
255
+ };
256
+ }
257
+ stop(reason = "requested") {
258
+ const wasActive = this.active;
259
+ this.active = false;
260
+ if (this.durationTimer !== null) {
261
+ clearTimeout(this.durationTimer);
262
+ this.durationTimer = null;
263
+ }
264
+ if (this.maintenanceTimer !== null) {
265
+ clearInterval(this.maintenanceTimer);
266
+ this.maintenanceTimer = null;
267
+ }
268
+ const listenerCount = this.listeners.length;
269
+ const detachErrors = this.detachListeners();
270
+ let abandonedInvocations = 0;
271
+ for (const [threadId, stack] of this.framesByThread) {
272
+ for (const frame of stack) {
273
+ abandonedInvocations += 1;
274
+ this.emitDiagnostic("hook_detached", `Invocation ended without onLeave because tracing stopped (${reason})`, frame);
275
+ }
276
+ this.framesByThread.delete(threadId);
277
+ }
278
+ if (wasActive || listenerCount > 0 || this.stoppedAt === null) {
279
+ this.stoppedAt = isoTimestamp(this.now());
280
+ this.stopReason = reason;
281
+ }
282
+ const snapshot = this.status();
283
+ this.activeConfig = null;
284
+ return {
285
+ ...snapshot,
286
+ detachedHooks: Math.max(0, listenerCount - detachErrors.length),
287
+ abandonedInvocations,
288
+ detachErrors
289
+ };
290
+ }
291
+ dispose() {
292
+ return this.stop("disposed");
293
+ }
294
+ selectTargets(request) {
295
+ const apiList = [...(request.apis ?? []), ...(request.APIs ?? [])];
296
+ const apiSet = new Set(apiList);
297
+ const rvaValues = request.rva === undefined
298
+ ? []
299
+ : Array.isArray(request.rva)
300
+ ? request.rva
301
+ : [request.rva];
302
+ const rvaSet = new Set(rvaValues.map(normalizeRva));
303
+ const hasSelector = request.all === true ||
304
+ apiSet.size > 0 ||
305
+ request.namespace !== undefined ||
306
+ request.glob !== undefined ||
307
+ rvaSet.size > 0;
308
+ if (!hasSelector) {
309
+ throw new Error("An explicit API, namespace, glob, RVA, or all=true selection is required");
310
+ }
311
+ const glob = request.glob === undefined ? null : compileGlob(request.glob);
312
+ return this.catalog.targets.filter((target) => {
313
+ if (target.buildKey !== request.buildKey)
314
+ return false;
315
+ const api = apiName(target);
316
+ if (apiSet.size > 0 && !apiSet.has(api))
317
+ return false;
318
+ if (request.namespace !== undefined && target.namespace !== request.namespace)
319
+ return false;
320
+ if (glob !== null && !glob.test(api))
321
+ return false;
322
+ if (rvaSet.size > 0 && !rvaSet.has(normalizeRva(target.rva)))
323
+ return false;
324
+ return true;
325
+ });
326
+ }
327
+ resolveTargets(selected, skipped) {
328
+ if (this.module === null)
329
+ throw new Error("Module is not resolved");
330
+ const profileById = new Map(this.catalog.abiProfiles.map((profile) => [profile.id, profile]));
331
+ const runtimeProfiles = new Map();
332
+ const groups = new Map();
333
+ for (const record of selected) {
334
+ const reason = validateTargetAbi(record, profileById.get(record.abi.profileId));
335
+ if (reason !== null) {
336
+ skipped.push({ api: apiName(record), rva: normalizeRva(record.rva), reason });
337
+ continue;
338
+ }
339
+ const rvaText = normalizeRva(record.rva);
340
+ const group = groups.get(rvaText);
341
+ if (group === undefined)
342
+ groups.set(rvaText, [record]);
343
+ else
344
+ group.push(record);
345
+ }
346
+ const resolved = [];
347
+ for (const [rvaText, groupedRecords] of groups) {
348
+ const primary = groupedRecords[0];
349
+ const records = [];
350
+ for (const record of groupedRecords) {
351
+ if (!sameHookAbi(primary.abi, record.abi)) {
352
+ skipped.push({
353
+ api: apiName(record),
354
+ rva: rvaText,
355
+ reason: `shared_RVA_ABI_conflict_with:${apiName(primary)}`
356
+ });
357
+ }
358
+ else {
359
+ records.push(record);
360
+ }
361
+ }
362
+ try {
363
+ const rva = rvaToNumber(primary.rva);
364
+ const address = this.module.base.add(rva);
365
+ assertInsideModule(address, this.module, true);
366
+ let runtimeProfile = runtimeProfiles.get(primary.abi.profileId);
367
+ if (runtimeProfile === undefined) {
368
+ const profile = profileById.get(primary.abi.profileId);
369
+ if (profile === undefined)
370
+ throw new Error(`Missing ABI profile ${primary.abi.profileId}`);
371
+ runtimeProfile = bindRuntimeAbi(profile, this.module);
372
+ runtimeProfiles.set(profile.id, runtimeProfile);
373
+ }
374
+ const aliases = records.map(apiName);
375
+ resolved.push({
376
+ records,
377
+ primary,
378
+ address,
379
+ addressText: address.toString(),
380
+ rvaText,
381
+ profile: runtimeProfile,
382
+ view: {
383
+ id: primary.id ?? `${this.catalog.buildKey}:${rvaText}`,
384
+ api: aliases[0],
385
+ aliases,
386
+ namespace: primary.namespace,
387
+ name: primary.name,
388
+ rva: rvaText,
389
+ runtimeAddress: address.toString(),
390
+ registrationPrimitive: primary.registrationPrimitive,
391
+ sourceKind: primary.sourceKind,
392
+ abiProfileId: primary.abi.profileId
393
+ }
394
+ });
395
+ }
396
+ catch (error) {
397
+ for (const record of records) {
398
+ skipped.push({
399
+ api: apiName(record),
400
+ rva: rvaText,
401
+ reason: errorText(error)
402
+ });
403
+ }
404
+ }
405
+ }
406
+ return resolved;
407
+ }
408
+ attachTarget(target) {
409
+ const engine = this;
410
+ return Interceptor.attach(target.address, {
411
+ onEnter(args) {
412
+ const marker = { captured: false };
413
+ this[INVOCATION_MARKER] = marker;
414
+ if (!engine.active)
415
+ return;
416
+ if (!engine.shouldSample())
417
+ return;
418
+ const abi = target.primary.abi;
419
+ if (abi.luaStateArgIndex === null)
420
+ return;
421
+ const luaState = args[abi.luaStateArgIndex];
422
+ if (luaState === undefined || luaState.isNull()) {
423
+ engine.emitDiagnostic("decode_error", `Confirmed lua_State argument ${abi.luaStateArgIndex} was null or unavailable`, undefined, target.view, this.threadId);
424
+ return;
425
+ }
426
+ const now = engine.now();
427
+ engine.reapStaleFrames(now);
428
+ const threadId = this.threadId;
429
+ const stack = engine.framesByThread.get(threadId) ?? [];
430
+ if (!engine.framesByThread.has(threadId))
431
+ engine.framesByThread.set(threadId, stack);
432
+ const maxDepth = engine.activeConfig?.maxInvocationDepth ?? 128;
433
+ if (stack.length >= maxDepth) {
434
+ engine.emitDiagnostic("decode_error", `Invocation depth ${stack.length} reached limit ${maxDepth}`, undefined, target.view, threadId, stack.length);
435
+ return;
436
+ }
437
+ const depth = stack.length;
438
+ const frame = {
439
+ id: `${engine.sessionSeq}:${threadId}:${depth}:${++engine.invocationSeq}`,
440
+ threadId,
441
+ depth,
442
+ startedAt: now,
443
+ target,
444
+ luaState,
445
+ luaStateText: luaState.toString(),
446
+ stackTopBefore: null
447
+ };
448
+ stack.push(frame);
449
+ marker.captured = true;
450
+ marker.frameId = frame.id;
451
+ marker.threadId = threadId;
452
+ marker.depth = depth;
453
+ const errors = [];
454
+ frame.stackTopBefore = engine.safeGetTop(target.profile, luaState, errors);
455
+ const values = engine.activeConfig?.captureArgs === true
456
+ ? engine.decodeStackRange(target.profile, luaState, 1, frame.stackTopBefore ?? 0, "raw_argument", errors)
457
+ : [];
458
+ const nativeArguments = engine.activeConfig?.captureNativeArguments === true
459
+ ? args
460
+ .slice(0, Math.max(0, abi.nativeArgumentCount ?? abi.luaStateArgIndex + 1))
461
+ .map((value) => value.toString())
462
+ : undefined;
463
+ engine.emit({
464
+ type: "lua_trace_enter",
465
+ timestamp: isoTimestamp(now),
466
+ buildKey: engine.catalog.buildKey,
467
+ moduleName: engine.catalog.moduleName,
468
+ moduleBase: engine.module?.base.toString() ?? "0x0",
469
+ invocationId: frame.id,
470
+ threadId,
471
+ depth,
472
+ target: target.view,
473
+ luaState: frame.luaStateText,
474
+ nativeArguments,
475
+ stackTopBefore: frame.stackTopBefore,
476
+ arguments: values,
477
+ decodeErrors: errors
478
+ });
479
+ },
480
+ onLeave(retval) {
481
+ const marker = this[INVOCATION_MARKER];
482
+ delete this[INVOCATION_MARKER];
483
+ if (marker?.captured !== true || marker.frameId === undefined)
484
+ return;
485
+ const threadId = marker.threadId ?? this.threadId;
486
+ const stack = engine.framesByThread.get(threadId);
487
+ if (stack === undefined) {
488
+ engine.emitDiagnostic("orphan_leave", `No invocation stack for ${marker.frameId}`, undefined, target.view, threadId, marker.depth);
489
+ return;
490
+ }
491
+ const frameIndex = findFrameFromEnd(stack, marker.frameId);
492
+ if (frameIndex < 0) {
493
+ engine.emitDiagnostic("orphan_leave", `Invocation frame ${marker.frameId} was already reaped`, undefined, target.view, threadId, marker.depth);
494
+ return;
495
+ }
496
+ const frame = stack[frameIndex];
497
+ stack.splice(frameIndex, 1);
498
+ if (stack.length === 0)
499
+ engine.framesByThread.delete(threadId);
500
+ const errors = [];
501
+ const stackTopAfter = engine.safeGetTop(target.profile, frame.luaState, errors);
502
+ const returnCount = decodeReturnCount(target.primary.abi.returnConvention, retval, errors);
503
+ let returns = [];
504
+ let temporaries = [];
505
+ if (engine.activeConfig?.captureReturns === true && stackTopAfter !== null) {
506
+ if (returnCount !== null && returnCount >= 0 && returnCount <= stackTopAfter) {
507
+ const returnStart = stackTopAfter - returnCount + 1;
508
+ returns = returnCount === 0
509
+ ? []
510
+ : engine.decodeStackRange(target.profile, frame.luaState, returnStart, stackTopAfter, "return", errors);
511
+ const temporaryStart = (frame.stackTopBefore ?? 0) + 1;
512
+ const temporaryEnd = returnStart - 1;
513
+ temporaries = temporaryStart <= temporaryEnd
514
+ ? engine.decodeStackRange(target.profile, frame.luaState, temporaryStart, temporaryEnd, "temporary", errors)
515
+ : [];
516
+ }
517
+ else if (returnCount !== null) {
518
+ errors.push(`Invalid Lua return count ${returnCount} for post-call stack top ${stackTopAfter}`);
519
+ }
520
+ }
521
+ const now = engine.now();
522
+ engine.emit({
523
+ type: "lua_trace_leave",
524
+ timestamp: isoTimestamp(now),
525
+ buildKey: engine.catalog.buildKey,
526
+ moduleName: engine.catalog.moduleName,
527
+ moduleBase: engine.module?.base.toString() ?? "0x0",
528
+ invocationId: frame.id,
529
+ threadId,
530
+ depth: frame.depth,
531
+ target: frame.target.view,
532
+ luaState: frame.luaStateText,
533
+ nativeReturnValue: retval.toString(),
534
+ luaReturnCount: returnCount,
535
+ stackTopBefore: frame.stackTopBefore,
536
+ stackTopAfter,
537
+ temporaries,
538
+ returns,
539
+ durationMs: Math.max(0, now - frame.startedAt),
540
+ decodeErrors: errors
541
+ });
542
+ }
543
+ });
544
+ }
545
+ safeGetTop(profile, luaState, errors) {
546
+ try {
547
+ const top = profile.stackLayout === undefined
548
+ ? profile.getTop === undefined
549
+ ? (() => { throw new Error("lua_gettop_binding_unavailable"); })()
550
+ : nativeNumber(profile.getTop(luaState))
551
+ : readDirectStackTop(luaState, profile.stackLayout);
552
+ if (!Number.isInteger(top) || top < 0) {
553
+ errors.push(`lua_gettop returned invalid value ${String(top)}`);
554
+ return null;
555
+ }
556
+ const max = this.activeConfig?.maxStackValues ?? 256;
557
+ if (top > max) {
558
+ errors.push(`Stack top ${top} exceeds decode limit ${max}`);
559
+ }
560
+ return top;
561
+ }
562
+ catch (error) {
563
+ errors.push(`lua_gettop failed: ${errorText(error)}`);
564
+ return null;
565
+ }
566
+ }
567
+ decodeStackRange(profile, luaState, start, end, role, errors) {
568
+ const config = this.activeConfig;
569
+ if (config === null || start > end)
570
+ return [];
571
+ const boundedEnd = Math.min(end, start + config.maxStackValues - 1);
572
+ if (boundedEnd < end) {
573
+ errors.push(`Stack decode truncated from ${end - start + 1} to ${config.maxStackValues} values`);
574
+ }
575
+ const budget = {
576
+ deadline: this.now() + config.maxDecodeMs,
577
+ visitedTables: new Set(),
578
+ remainingItems: config.maxItems
579
+ };
580
+ const values = [];
581
+ for (let index = Math.max(1, start); index <= boundedEnd; index += 1) {
582
+ values.push(this.decodeValue(profile, luaState, index, role, 0, budget));
583
+ if (this.now() > budget.deadline) {
584
+ errors.push(`Decode timeout after stack index ${index}`);
585
+ break;
586
+ }
587
+ }
588
+ return values;
589
+ }
590
+ decodeValue(profile, luaState, index, role, depth, budget) {
591
+ if (this.now() > budget.deadline) {
592
+ return { index, role, type: "invalid", reason: "decode_timeout" };
593
+ }
594
+ try {
595
+ const directSlot = profile.stackLayout === undefined
596
+ ? null
597
+ : readDirectStackSlot(luaState, index, profile.stackLayout);
598
+ const tag = directSlot === null
599
+ ? profile.type === undefined
600
+ ? (() => { throw new Error("lua_type_binding_unavailable"); })()
601
+ : nativeNumber(profile.type(luaState, index))
602
+ : directSlot.tag;
603
+ const tags = profile.tags;
604
+ if (tag === tags.none)
605
+ return { index, role, type: "none" };
606
+ if (tag === tags.nil)
607
+ return { index, role, type: "nil", value: null };
608
+ if (tag === tags.boolean) {
609
+ if (directSlot !== null) {
610
+ return {
611
+ index,
612
+ role,
613
+ type: "boolean",
614
+ value: directSlot.payload.readU32() !== 0
615
+ };
616
+ }
617
+ if (profile.toBoolean === undefined) {
618
+ return { index, role, type: "boolean", reason: "toBoolean_binding_unavailable" };
619
+ }
620
+ return {
621
+ index,
622
+ role,
623
+ type: "boolean",
624
+ value: nativeNumber(profile.toBoolean(luaState, index)) !== 0
625
+ };
626
+ }
627
+ if (tag === tags.number) {
628
+ if (directSlot !== null && profile.isInteger === undefined) {
629
+ return {
630
+ index,
631
+ role,
632
+ type: "number",
633
+ value: directSlot.payload.readDouble()
634
+ };
635
+ }
636
+ const isInteger = profile.isInteger === undefined
637
+ ? false
638
+ : nativeNumber(profile.isInteger(luaState, index)) !== 0;
639
+ if (isInteger) {
640
+ if (profile.toInteger === undefined) {
641
+ return { index, role, type: "integer", reason: "toInteger_binding_unavailable" };
642
+ }
643
+ return {
644
+ index,
645
+ role,
646
+ type: "integer",
647
+ value: nativeExactInteger(profile.toInteger(luaState, index))
648
+ };
649
+ }
650
+ if (profile.toNumber === undefined) {
651
+ return { index, role, type: "number", reason: "toNumber_binding_unavailable" };
652
+ }
653
+ return {
654
+ index,
655
+ role,
656
+ type: "number",
657
+ value: nativeNumber(profile.toNumber(luaState, index))
658
+ };
659
+ }
660
+ if (tag === tags.string) {
661
+ if (profile.toLString === undefined && directSlot !== null) {
662
+ const pointer = directSlot.payload.readPointer();
663
+ return {
664
+ index,
665
+ role,
666
+ type: "string",
667
+ pointer: pointer.toString(),
668
+ reason: "string_object_layout_unverified"
669
+ };
670
+ }
671
+ return this.decodeString(profile, luaState, index, role);
672
+ }
673
+ if (tag === tags.lightuserdata) {
674
+ return this.decodePointerValue(profile, luaState, index, role, "lightuserdata", directSlot);
675
+ }
676
+ if (tag === tags.function) {
677
+ return this.decodePointerValue(profile, luaState, index, role, "function", directSlot);
678
+ }
679
+ if (tag === tags.thread) {
680
+ return this.decodePointerValue(profile, luaState, index, role, "thread", directSlot);
681
+ }
682
+ if (tag === tags.userdata) {
683
+ return this.decodeUserdata(profile, luaState, index, role, directSlot);
684
+ }
685
+ if (tag === tags.table) {
686
+ return this.decodeTable(profile, luaState, index, role, depth, budget);
687
+ }
688
+ return { index, role, type: "unknown", value: { tag } };
689
+ }
690
+ catch (error) {
691
+ return { index, role, type: "invalid", reason: errorText(error) };
692
+ }
693
+ }
694
+ decodeString(profile, luaState, index, role) {
695
+ if (profile.toLString === undefined) {
696
+ return { index, role, type: "string", reason: "toLString_binding_unavailable" };
697
+ }
698
+ const lengthStorage = Memory.alloc(Process.pointerSize);
699
+ const stringPointer = nativePointer(profile.toLString(luaState, index, lengthStorage));
700
+ if (stringPointer.isNull())
701
+ return { index, role, type: "string", value: "" };
702
+ const actualLength = readSizeT(lengthStorage);
703
+ const limit = this.activeConfig?.maxStringBytes ?? 4096;
704
+ const readLength = Math.min(actualLength, limit);
705
+ assertReadable(stringPointer, Math.max(1, readLength));
706
+ return {
707
+ index,
708
+ role,
709
+ type: "string",
710
+ value: stringPointer.readUtf8String(readLength) ?? "",
711
+ truncated: actualLength > limit,
712
+ reason: actualLength > limit ? `length=${actualLength}` : undefined
713
+ };
714
+ }
715
+ decodePointerValue(profile, luaState, index, role, type, directSlot) {
716
+ if (profile.toPointer === undefined && directSlot !== null) {
717
+ return {
718
+ index,
719
+ role,
720
+ type,
721
+ pointer: directSlot.payload.readPointer().toString(),
722
+ reason: "direct_slot_identity"
723
+ };
724
+ }
725
+ if (profile.toPointer === undefined) {
726
+ return { index, role, type, reason: "toPointer_binding_unavailable" };
727
+ }
728
+ const value = nativePointer(profile.toPointer(luaState, index));
729
+ return { index, role, type, pointer: value.toString() };
730
+ }
731
+ decodeUserdata(profile, luaState, index, role, directSlot) {
732
+ const pointerFunction = profile.toUserdata ?? profile.toPointer;
733
+ if (pointerFunction === undefined && directSlot === null) {
734
+ return {
735
+ index,
736
+ role,
737
+ type: "userdata",
738
+ unconfirmedFields: "not_read",
739
+ reason: "toUserdata_binding_unavailable"
740
+ };
741
+ }
742
+ const storage = pointerFunction === undefined
743
+ ? directSlot.payload.readPointer()
744
+ : nativePointer(pointerFunction(luaState, index));
745
+ let typeName;
746
+ if (profile.auxiliaryTypeName !== undefined) {
747
+ try {
748
+ const namePointer = nativePointer(profile.auxiliaryTypeName(luaState, index));
749
+ if (!namePointer.isNull()) {
750
+ assertReadable(namePointer, 1);
751
+ typeName = namePointer.readUtf8String(this.activeConfig?.maxStringBytes ?? 4096) ?? undefined;
752
+ }
753
+ }
754
+ catch {
755
+ typeName = undefined;
756
+ }
757
+ }
758
+ const userdataProfile = typeName === undefined
759
+ ? undefined
760
+ : profile.userdataProfiles.get(typeName);
761
+ let objectPointer = storage;
762
+ const confirmedFields = {};
763
+ let vtable;
764
+ let reason;
765
+ try {
766
+ if (userdataProfile !== undefined && userdataProfile.inlineObject !== true) {
767
+ const objectOffset = userdataProfile.objectPointerOffset ?? 0;
768
+ assertReadable(storage.add(objectOffset), Process.pointerSize);
769
+ objectPointer = storage.add(objectOffset).readPointer();
770
+ }
771
+ if (!objectPointer.isNull() && userdataProfile !== undefined) {
772
+ if (userdataProfile.vtableOffset !== undefined) {
773
+ const vtableSlot = objectPointer.add(userdataProfile.vtableOffset);
774
+ assertReadable(vtableSlot, Process.pointerSize);
775
+ const candidate = vtableSlot.readPointer();
776
+ if (!candidate.isNull()) {
777
+ assertReadable(candidate, Process.pointerSize);
778
+ const firstVirtualFunction = candidate.readPointer();
779
+ const functionRange = Process.findRangeByAddress(firstVirtualFunction);
780
+ if (functionRange === null || !functionRange.protection.includes("x")) {
781
+ throw new Error(`vtable_first_entry_not_executable:${firstVirtualFunction.toString()}`);
782
+ }
783
+ vtable = candidate.toString();
784
+ }
785
+ }
786
+ for (const field of userdataProfile.fields ?? []) {
787
+ confirmedFields[field.name] = readVerifiedField(objectPointer, field);
788
+ }
789
+ }
790
+ else if (userdataProfile === undefined) {
791
+ reason = "no_verified_userdata_profile";
792
+ }
793
+ }
794
+ catch (error) {
795
+ reason = `userdata_validation_failed: ${errorText(error)}`;
796
+ }
797
+ return {
798
+ index,
799
+ role,
800
+ type: "userdata",
801
+ pointer: objectPointer.toString(),
802
+ typeName,
803
+ vtable,
804
+ confirmedFields,
805
+ unconfirmedFields: "not_read",
806
+ reason
807
+ };
808
+ }
809
+ decodeTable(profile, luaState, index, role, depth, budget) {
810
+ const identity = this.pointerIdentity(profile, luaState, index);
811
+ const base = {
812
+ index,
813
+ role,
814
+ type: "table",
815
+ pointer: identity ?? undefined
816
+ };
817
+ const config = this.activeConfig;
818
+ if (config === null)
819
+ return { ...base, reason: "trace_inactive" };
820
+ if (depth >= config.tableDepth) {
821
+ return { ...base, truncated: true, reason: "max_table_depth" };
822
+ }
823
+ if (identity !== null && budget.visitedTables.has(identity)) {
824
+ return { ...base, truncated: true, reason: "cycle_reference" };
825
+ }
826
+ if (!config.allowTableIteration) {
827
+ return { ...base, reason: "table_iteration_disabled" };
828
+ }
829
+ if (profile.setTop === undefined ||
830
+ profile.pushNil === undefined ||
831
+ profile.next === undefined) {
832
+ return { ...base, reason: "table_iteration_bindings_unavailable" };
833
+ }
834
+ if (budget.remainingItems <= 0) {
835
+ return { ...base, truncated: true, reason: "max_items" };
836
+ }
837
+ const topErrors = [];
838
+ const savedTop = this.safeGetTop(profile, luaState, topErrors);
839
+ if (savedTop === null) {
840
+ return { ...base, reason: `stack_top_unavailable:${topErrors.join(";")}` };
841
+ }
842
+ const absoluteIndex = index > 0 ? index : savedTop + index + 1;
843
+ const entries = [];
844
+ if (identity !== null)
845
+ budget.visitedTables.add(identity);
846
+ let truncated = false;
847
+ let reason;
848
+ try {
849
+ profile.pushNil(luaState);
850
+ while (nativeNumber(profile.next(luaState, absoluteIndex)) !== 0) {
851
+ if (this.now() > budget.deadline) {
852
+ truncated = true;
853
+ reason = "decode_timeout";
854
+ break;
855
+ }
856
+ if (budget.remainingItems <= 0) {
857
+ truncated = true;
858
+ reason = "max_items";
859
+ break;
860
+ }
861
+ budget.remainingItems -= 1;
862
+ entries.push({
863
+ key: this.decodeValue(profile, luaState, -2, "table_key", depth + 1, budget),
864
+ value: this.decodeValue(profile, luaState, -1, "table_value", depth + 1, budget)
865
+ });
866
+ // lua_pop(L, 1), preserving the key expected by lua_next.
867
+ profile.setTop(luaState, -2);
868
+ }
869
+ }
870
+ catch (error) {
871
+ truncated = true;
872
+ reason = `table_decode_failed: ${errorText(error)}`;
873
+ }
874
+ finally {
875
+ try {
876
+ profile.setTop(luaState, savedTop);
877
+ }
878
+ catch (error) {
879
+ reason = `stack_restore_failed: ${errorText(error)}`;
880
+ truncated = true;
881
+ }
882
+ }
883
+ return {
884
+ ...base,
885
+ value: entries,
886
+ truncated,
887
+ reason
888
+ };
889
+ }
890
+ pointerIdentity(profile, luaState, index) {
891
+ if (profile.toPointer === undefined && profile.stackLayout !== undefined) {
892
+ try {
893
+ return readDirectStackSlot(luaState, index, profile.stackLayout)
894
+ .payload
895
+ .readPointer()
896
+ .toString();
897
+ }
898
+ catch {
899
+ return null;
900
+ }
901
+ }
902
+ if (profile.toPointer === undefined)
903
+ return null;
904
+ try {
905
+ return nativePointer(profile.toPointer(luaState, index)).toString();
906
+ }
907
+ catch {
908
+ return null;
909
+ }
910
+ }
911
+ shouldSample() {
912
+ const sampling = this.activeConfig?.sampling ?? 1;
913
+ this.sampleCounter += 1;
914
+ if (sampling >= 1) {
915
+ const every = Math.max(1, Math.floor(sampling));
916
+ return (this.sampleCounter - 1) % every === 0;
917
+ }
918
+ return Math.random() < sampling;
919
+ }
920
+ reapStaleFrames(now) {
921
+ const staleMs = this.activeConfig?.staleInvocationMs ?? 30000;
922
+ for (const [threadId, stack] of this.framesByThread) {
923
+ const survivors = [];
924
+ for (const frame of stack) {
925
+ if (now - frame.startedAt > staleMs) {
926
+ this.emitDiagnostic("stale_invocation", `No onLeave observed within ${staleMs} ms`, frame);
927
+ }
928
+ else {
929
+ survivors.push(frame);
930
+ }
931
+ }
932
+ if (survivors.length === 0)
933
+ this.framesByThread.delete(threadId);
934
+ else
935
+ this.framesByThread.set(threadId, survivors);
936
+ }
937
+ }
938
+ emit(event) {
939
+ const complete = { ...event, seq: ++this.eventSeq };
940
+ const maxEvents = this.activeConfig?.maxEvents ?? 10000;
941
+ this.events.push(complete);
942
+ while (this.events.length > maxEvents) {
943
+ this.events.shift();
944
+ this.droppedEvents += 1;
945
+ }
946
+ if (this.onEvent !== undefined) {
947
+ try {
948
+ this.onEvent(complete);
949
+ }
950
+ catch {
951
+ // A host callback must not destabilize a hooked game thread.
952
+ }
953
+ }
954
+ }
955
+ emitDiagnostic(code, message, frame, target, threadId, depth) {
956
+ this.emit({
957
+ type: "lua_trace_diagnostic",
958
+ timestamp: isoTimestamp(this.now()),
959
+ buildKey: this.catalog.buildKey,
960
+ code,
961
+ message,
962
+ invocationId: frame?.id,
963
+ threadId: frame?.threadId ?? threadId,
964
+ depth: frame?.depth ?? depth,
965
+ target: frame?.target.view ?? target
966
+ });
967
+ }
968
+ detachListeners() {
969
+ const listeners = this.listeners.splice(0);
970
+ const failed = [];
971
+ const errors = [];
972
+ for (const listener of listeners) {
973
+ try {
974
+ listener.detach();
975
+ }
976
+ catch (error) {
977
+ const message = errorText(error);
978
+ errors.push(message);
979
+ failed.push(listener);
980
+ this.emitDiagnostic("listener_detach_error", message);
981
+ }
982
+ }
983
+ this.listeners.push(...failed);
984
+ return errors;
985
+ }
986
+ resetInactiveState() {
987
+ this.active = false;
988
+ this.module = null;
989
+ this.activeConfig = null;
990
+ this.selectedRecords = 0;
991
+ this.startedAt = null;
992
+ this.framesByThread.clear();
993
+ if (this.durationTimer !== null) {
994
+ clearTimeout(this.durationTimer);
995
+ this.durationTimer = null;
996
+ }
997
+ if (this.maintenanceTimer !== null) {
998
+ clearInterval(this.maintenanceTimer);
999
+ this.maintenanceTimer = null;
1000
+ }
1001
+ }
1002
+ }
1003
+ export function createWowLuaTraceEngine(catalog, options = {}) {
1004
+ return new WowLuaTraceEngine(catalog, options);
1005
+ }
1006
+ function validateCatalog(catalog) {
1007
+ if (catalog.buildKey.length === 0)
1008
+ throw new Error("catalog.buildKey is required");
1009
+ if (catalog.moduleName.length === 0)
1010
+ throw new Error("catalog.moduleName is required");
1011
+ const profileIds = new Set();
1012
+ for (const profile of catalog.abiProfiles) {
1013
+ if (profile.id.length === 0)
1014
+ throw new Error("ABI profile id is required");
1015
+ if (profileIds.has(profile.id))
1016
+ throw new Error(`Duplicate ABI profile ${profile.id}`);
1017
+ if (profile.buildKey !== catalog.buildKey) {
1018
+ throw new Error(`ABI profile ${profile.id} belongs to ${profile.buildKey}`);
1019
+ }
1020
+ profileIds.add(profile.id);
1021
+ if (profile.stackLayout !== undefined)
1022
+ validateStackLayout(profile.stackLayout);
1023
+ }
1024
+ for (const target of catalog.targets) {
1025
+ if (target.buildKey !== catalog.buildKey) {
1026
+ throw new Error(`Target ${apiName(target)} belongs to ${target.buildKey}`);
1027
+ }
1028
+ rvaToNumber(target.rva);
1029
+ }
1030
+ }
1031
+ function validateTargetAbi(target, profile) {
1032
+ if (target.abi.status !== "confirmed" && target.abi.status !== "dynamically_verified") {
1033
+ return `target_abi_${target.abi.status}`;
1034
+ }
1035
+ if (target.abi.luaStateArgIndex === null || target.abi.luaStateArgIndex < 0) {
1036
+ return "lua_State_argument_unresolved";
1037
+ }
1038
+ if (!Number.isInteger(target.abi.luaStateArgIndex)) {
1039
+ return "lua_State_argument_not_integer";
1040
+ }
1041
+ if (profile === undefined)
1042
+ return `missing_abi_profile:${target.abi.profileId}`;
1043
+ if (profile.status !== "confirmed" && profile.status !== "dynamically_verified") {
1044
+ return `profile_abi_${profile.status}`;
1045
+ }
1046
+ if (profile.buildKey !== target.buildKey)
1047
+ return "abi_profile_build_mismatch";
1048
+ return null;
1049
+ }
1050
+ function sameHookAbi(left, right) {
1051
+ return (left.profileId === right.profileId &&
1052
+ left.luaStateArgIndex === right.luaStateArgIndex &&
1053
+ left.returnConvention === right.returnConvention &&
1054
+ (left.nativeArgumentCount ?? null) === (right.nativeArgumentCount ?? null));
1055
+ }
1056
+ function bindRuntimeAbi(profile, module) {
1057
+ const bindings = profile.bindings;
1058
+ const bind = (rva, returnType, argumentTypes) => {
1059
+ if (rva === undefined)
1060
+ return undefined;
1061
+ const address = module.base.add(rvaToNumber(rva));
1062
+ assertInsideModule(address, module, true);
1063
+ return new NativeFunction(address, returnType, argumentTypes, { exceptions: "steal" });
1064
+ };
1065
+ const getTop = bind(bindings.getTop, "int", ["pointer"]);
1066
+ const type = bind(bindings.type, "int", ["pointer", "int"]);
1067
+ if (getTop === undefined || (type === undefined && profile.stackLayout === undefined)) {
1068
+ throw new Error(`ABI profile ${profile.id} lacks mandatory stack bindings`);
1069
+ }
1070
+ return {
1071
+ profile,
1072
+ getTop,
1073
+ type,
1074
+ toBoolean: bind(bindings.toBoolean, "int", ["pointer", "int"]),
1075
+ isInteger: bind(bindings.isInteger, "int", ["pointer", "int"]),
1076
+ toInteger: bind(bindings.toInteger, "int64", ["pointer", "int"]),
1077
+ toNumber: bind(bindings.toNumber, "double", ["pointer", "int"]),
1078
+ toLString: bind(bindings.toLString, "pointer", ["pointer", "int", "pointer"]),
1079
+ toPointer: bind(bindings.toPointer, "pointer", ["pointer", "int"]),
1080
+ toUserdata: bind(bindings.toUserdata, "pointer", ["pointer", "int"]),
1081
+ auxiliaryTypeName: bind(bindings.auxiliaryTypeName, "pointer", ["pointer", "int"]),
1082
+ setTop: bind(bindings.setTop, "void", ["pointer", "int"]),
1083
+ pushNil: bind(bindings.pushNil, "void", ["pointer"]),
1084
+ next: bind(bindings.next, "int", ["pointer", "int"]),
1085
+ tags: { ...DEFAULT_TAGS, ...profile.typeTags },
1086
+ userdataProfiles: new Map((profile.userdataProfiles ?? []).map((item) => [item.typeName, item])),
1087
+ stackLayout: profile.stackLayout
1088
+ };
1089
+ }
1090
+ function normalizeConfig(request) {
1091
+ const sampling = request.sampling ?? 1;
1092
+ if (!Number.isFinite(sampling) || sampling <= 0) {
1093
+ throw new Error("sampling must be a finite positive number");
1094
+ }
1095
+ return {
1096
+ captureArgs: request.captureArgs ?? true,
1097
+ captureReturns: request.captureReturns ?? true,
1098
+ captureNativeArguments: request.captureNativeArguments ?? false,
1099
+ tableDepth: boundedInteger(request.tableDepth, 2, MIN_LIMITS.tableDepth, MAX_LIMITS.tableDepth),
1100
+ maxItems: boundedInteger(request.maxItems, 64, MIN_LIMITS.maxItems, MAX_LIMITS.maxItems),
1101
+ maxStringBytes: boundedInteger(request.maxStringBytes, 4096, MIN_LIMITS.maxStringBytes, MAX_LIMITS.maxStringBytes),
1102
+ maxStackValues: boundedInteger(request.maxStackValues, 256, MIN_LIMITS.maxStackValues, MAX_LIMITS.maxStackValues),
1103
+ maxInvocationDepth: boundedInteger(request.maxInvocationDepth, 128, MIN_LIMITS.maxInvocationDepth, MAX_LIMITS.maxInvocationDepth),
1104
+ maxDecodeMs: boundedInteger(request.maxDecodeMs, 20, MIN_LIMITS.maxDecodeMs, MAX_LIMITS.maxDecodeMs),
1105
+ maxEvents: boundedInteger(request.maxEvents, 10000, MIN_LIMITS.maxEvents, MAX_LIMITS.maxEvents),
1106
+ sampling,
1107
+ allowTableIteration: request.allowTableIteration ?? false,
1108
+ staleInvocationMs: boundedInteger(request.staleInvocationMs, 30000, MIN_LIMITS.staleInvocationMs, MAX_LIMITS.staleInvocationMs)
1109
+ };
1110
+ }
1111
+ function decodeReturnCount(convention, retval, errors) {
1112
+ if (convention !== "lua_return_count_int32")
1113
+ return null;
1114
+ try {
1115
+ return retval.toInt32();
1116
+ }
1117
+ catch (error) {
1118
+ errors.push(`Native return count decode failed: ${errorText(error)}`);
1119
+ return null;
1120
+ }
1121
+ }
1122
+ function readVerifiedField(base, field) {
1123
+ if (!Number.isInteger(field.offset) || field.offset < 0) {
1124
+ throw new Error(`Invalid verified field offset ${field.name}:${field.offset}`);
1125
+ }
1126
+ const address = base.add(field.offset);
1127
+ const size = fieldSize(field.kind);
1128
+ assertReadable(address, size);
1129
+ switch (field.kind) {
1130
+ case "pointer": return address.readPointer().toString();
1131
+ case "u8": return address.readU8();
1132
+ case "u16": return address.readU16();
1133
+ case "u32": return address.readU32();
1134
+ case "u64": return address.readU64().toString();
1135
+ case "s8": return address.readS8();
1136
+ case "s16": return address.readS16();
1137
+ case "s32": return address.readS32();
1138
+ case "s64": return address.readS64().toString();
1139
+ case "float": return address.readFloat();
1140
+ case "double": return address.readDouble();
1141
+ }
1142
+ }
1143
+ function validateStackLayout(layout) {
1144
+ const offsets = [
1145
+ layout.basePointerOffset,
1146
+ layout.topPointerOffset,
1147
+ layout.payloadOffset,
1148
+ layout.tagOffset,
1149
+ ...(layout.auxiliaryOffset === undefined ? [] : [layout.auxiliaryOffset])
1150
+ ];
1151
+ if (offsets.some((value) => !Number.isInteger(value) || value < 0)) {
1152
+ throw new Error("Lua stack layout offsets must be non-negative integers");
1153
+ }
1154
+ if (!Number.isInteger(layout.slotSize) || layout.slotSize <= 0) {
1155
+ throw new Error(`Invalid Lua stack slot size ${layout.slotSize}`);
1156
+ }
1157
+ if (!Number.isInteger(layout.maxSlots) || layout.maxSlots <= 0 || layout.maxSlots > 100000) {
1158
+ throw new Error(`Invalid Lua stack maxSlots ${layout.maxSlots}`);
1159
+ }
1160
+ if (![1, 2, 4].includes(layout.tagSize)) {
1161
+ throw new Error(`Invalid Lua stack tag size ${layout.tagSize}`);
1162
+ }
1163
+ if (layout.payloadOffset + Process.pointerSize > layout.slotSize) {
1164
+ throw new Error("Lua stack payload exceeds slot boundary");
1165
+ }
1166
+ if (layout.tagOffset + layout.tagSize > layout.slotSize) {
1167
+ throw new Error("Lua stack tag exceeds slot boundary");
1168
+ }
1169
+ }
1170
+ function readDirectStackTop(luaState, layout) {
1171
+ assertReadable(luaState.add(layout.topPointerOffset), Process.pointerSize);
1172
+ assertReadable(luaState.add(layout.basePointerOffset), Process.pointerSize);
1173
+ const top = luaState.add(layout.topPointerOffset).readPointer();
1174
+ const base = luaState.add(layout.basePointerOffset).readPointer();
1175
+ if (top.isNull() || base.isNull())
1176
+ throw new Error("null_lua_stack_pointer");
1177
+ if (top.compare(base) < 0)
1178
+ throw new Error("lua_stack_top_before_base");
1179
+ const difference = BigInt(top.toString()) - BigInt(base.toString());
1180
+ const stride = BigInt(layout.slotSize);
1181
+ if (difference % stride !== 0n)
1182
+ throw new Error("lua_stack_stride_invariant_failed");
1183
+ const count = Number(difference / stride);
1184
+ if (!Number.isSafeInteger(count) || count < 0 || count > layout.maxSlots) {
1185
+ throw new Error(`lua_stack_count_out_of_range:${count}`);
1186
+ }
1187
+ if (count > 0)
1188
+ assertReadable(base, count * layout.slotSize);
1189
+ return count;
1190
+ }
1191
+ function readDirectStackSlot(luaState, index, layout) {
1192
+ if (!Number.isInteger(index) || index === 0) {
1193
+ throw new Error(`invalid_lua_stack_index:${index}`);
1194
+ }
1195
+ const top = readDirectStackTop(luaState, layout);
1196
+ const zeroBased = index > 0 ? index - 1 : top + index;
1197
+ if (zeroBased < 0 || zeroBased >= top) {
1198
+ throw new Error(`lua_stack_index_out_of_range:${index}:${top}`);
1199
+ }
1200
+ const base = luaState.add(layout.basePointerOffset).readPointer();
1201
+ const address = base.add(zeroBased * layout.slotSize);
1202
+ assertReadable(address, layout.slotSize);
1203
+ const tagAddress = address.add(layout.tagOffset);
1204
+ const tag = layout.tagSize === 1
1205
+ ? tagAddress.readU8()
1206
+ : layout.tagSize === 2
1207
+ ? tagAddress.readU16()
1208
+ : tagAddress.readU32();
1209
+ return {
1210
+ address,
1211
+ payload: address.add(layout.payloadOffset),
1212
+ tag
1213
+ };
1214
+ }
1215
+ function fieldSize(kind) {
1216
+ switch (kind) {
1217
+ case "u8":
1218
+ case "s8": return 1;
1219
+ case "u16":
1220
+ case "s16": return 2;
1221
+ case "u32":
1222
+ case "s32":
1223
+ case "float": return 4;
1224
+ case "u64":
1225
+ case "s64":
1226
+ case "double": return 8;
1227
+ case "pointer": return Process.pointerSize;
1228
+ }
1229
+ }
1230
+ function assertInsideModule(address, module, executable) {
1231
+ const moduleEnd = module.base.add(module.size);
1232
+ if (address.compare(module.base) < 0 || address.compare(moduleEnd) >= 0) {
1233
+ throw new Error(`Address ${address.toString()} is outside ${module.name}`);
1234
+ }
1235
+ const range = Process.findRangeByAddress(address);
1236
+ if (range === null)
1237
+ throw new Error(`Address ${address.toString()} is unmapped`);
1238
+ if (executable && !range.protection.includes("x")) {
1239
+ throw new Error(`Address ${address.toString()} is not executable (${range.protection})`);
1240
+ }
1241
+ }
1242
+ function assertReadable(address, size) {
1243
+ if (address.isNull())
1244
+ throw new Error("null_pointer");
1245
+ const range = Process.findRangeByAddress(address);
1246
+ if (range === null || !range.protection.includes("r")) {
1247
+ throw new Error(`unreadable_pointer:${address.toString()}`);
1248
+ }
1249
+ const rangeEnd = range.base.add(range.size);
1250
+ const readEnd = address.add(Math.max(1, size));
1251
+ if (readEnd.compare(rangeEnd) > 0) {
1252
+ throw new Error(`read_crosses_range:${address.toString()}:${size}`);
1253
+ }
1254
+ }
1255
+ function readSizeT(storage) {
1256
+ const result = Process.pointerSize === 8
1257
+ ? storage.readU64().toNumber()
1258
+ : storage.readU32();
1259
+ if (!Number.isSafeInteger(result) || result < 0) {
1260
+ throw new Error(`Invalid size_t ${String(result)}`);
1261
+ }
1262
+ return result;
1263
+ }
1264
+ function nativeNumber(value) {
1265
+ if (typeof value === "number")
1266
+ return value;
1267
+ if (value !== null && typeof value === "object" && "toNumber" in value) {
1268
+ return value.toNumber();
1269
+ }
1270
+ const result = Number(String(value));
1271
+ if (!Number.isFinite(result))
1272
+ throw new Error(`Expected native number, got ${String(value)}`);
1273
+ return result;
1274
+ }
1275
+ function nativeExactInteger(value) {
1276
+ if (typeof value === "number") {
1277
+ return Number.isSafeInteger(value) ? value : String(value);
1278
+ }
1279
+ return String(value);
1280
+ }
1281
+ function nativePointer(value) {
1282
+ if (value !== null && typeof value === "object" && "isNull" in value) {
1283
+ return value;
1284
+ }
1285
+ return ptr(String(value));
1286
+ }
1287
+ function apiName(target) {
1288
+ if (target.namespace.length === 0 || target.namespace === "global")
1289
+ return target.name;
1290
+ if (target.name.startsWith(`${target.namespace}.`))
1291
+ return target.name;
1292
+ return `${target.namespace}.${target.name}`;
1293
+ }
1294
+ function normalizeRva(value) {
1295
+ return `0x${rvaToNumber(value).toString(16)}`;
1296
+ }
1297
+ function rvaToNumber(value) {
1298
+ const result = typeof value === "number" ? value : Number(value);
1299
+ if (!Number.isSafeInteger(result) || result < 0) {
1300
+ throw new Error(`Invalid RVA ${String(value)}`);
1301
+ }
1302
+ return result;
1303
+ }
1304
+ function compileGlob(pattern) {
1305
+ let source = "^";
1306
+ for (const character of pattern) {
1307
+ if (character === "*")
1308
+ source += ".*";
1309
+ else if (character === "?")
1310
+ source += ".";
1311
+ else
1312
+ source += character.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
1313
+ }
1314
+ source += "$";
1315
+ return new RegExp(source);
1316
+ }
1317
+ function boundedInteger(value, fallback, minimum, maximum) {
1318
+ const result = value ?? fallback;
1319
+ if (!Number.isFinite(result))
1320
+ throw new Error(`Expected finite limit, got ${String(result)}`);
1321
+ return Math.min(maximum, Math.max(minimum, Math.floor(result)));
1322
+ }
1323
+ function findFrameFromEnd(stack, id) {
1324
+ for (let index = stack.length - 1; index >= 0; index -= 1) {
1325
+ if (stack[index].id === id)
1326
+ return index;
1327
+ }
1328
+ return -1;
1329
+ }
1330
+ function errorText(error) {
1331
+ return error instanceof Error ? error.message : String(error);
1332
+ }
1333
+ function isoTimestamp(timestamp) {
1334
+ return new Date(timestamp).toISOString();
1335
+ }