@bingine/cemem 0.0.0-stage → 0.1.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 (138) hide show
  1. package/PORT-SCOPE.md +169 -0
  2. package/README.md +451 -2
  3. package/dist/cjs/addr/expression.js +650 -0
  4. package/dist/cjs/addr/expression.js.map +1 -0
  5. package/dist/cjs/addresslist/memory-record.js +612 -0
  6. package/dist/cjs/addresslist/memory-record.js.map +1 -0
  7. package/dist/cjs/asm/assembler.js +354 -0
  8. package/dist/cjs/asm/assembler.js.map +1 -0
  9. package/dist/cjs/asm/autoassembler-directives.js +362 -0
  10. package/dist/cjs/asm/autoassembler-directives.js.map +1 -0
  11. package/dist/cjs/asm/autoassembler.js +2163 -0
  12. package/dist/cjs/asm/autoassembler.js.map +1 -0
  13. package/dist/cjs/asm/backend.js +394 -0
  14. package/dist/cjs/asm/backend.js.map +1 -0
  15. package/dist/cjs/asm/disassembler.js +715 -0
  16. package/dist/cjs/asm/disassembler.js.map +1 -0
  17. package/dist/cjs/backend/dbk-backend.js +683 -0
  18. package/dist/cjs/backend/dbk-backend.js.map +1 -0
  19. package/dist/cjs/backend/native-ce-backend.js +667 -0
  20. package/dist/cjs/backend/native-ce-backend.js.map +1 -0
  21. package/dist/cjs/backend/self-backend.js +449 -0
  22. package/dist/cjs/backend/self-backend.js.map +1 -0
  23. package/dist/cjs/backend/types.js +48 -0
  24. package/dist/cjs/backend/types.js.map +1 -0
  25. package/dist/cjs/cheattable/ct-format.js +533 -0
  26. package/dist/cjs/cheattable/ct-format.js.map +1 -0
  27. package/dist/cjs/index.js +219 -0
  28. package/dist/cjs/index.js.map +1 -0
  29. package/dist/cjs/lua/aa.js +230 -0
  30. package/dist/cjs/lua/aa.js.map +1 -0
  31. package/dist/cjs/lua/addressing.js +118 -0
  32. package/dist/cjs/lua/addressing.js.map +1 -0
  33. package/dist/cjs/lua/api.js +736 -0
  34. package/dist/cjs/lua/api.js.map +1 -0
  35. package/dist/cjs/lua/asm.js +220 -0
  36. package/dist/cjs/lua/asm.js.map +1 -0
  37. package/dist/cjs/lua/bridge.js +526 -0
  38. package/dist/cjs/lua/bridge.js.map +1 -0
  39. package/dist/cjs/lua/marshal.js +562 -0
  40. package/dist/cjs/lua/marshal.js.map +1 -0
  41. package/dist/cjs/lua/memory.js +213 -0
  42. package/dist/cjs/lua/memory.js.map +1 -0
  43. package/dist/cjs/lua/objects.js +1070 -0
  44. package/dist/cjs/lua/objects.js.map +1 -0
  45. package/dist/cjs/lua/scan.js +543 -0
  46. package/dist/cjs/lua/scan.js.map +1 -0
  47. package/dist/cjs/lua/types.js +103 -0
  48. package/dist/cjs/lua/types.js.map +1 -0
  49. package/dist/cjs/scanner/matcher.js +781 -0
  50. package/dist/cjs/scanner/matcher.js.map +1 -0
  51. package/dist/cjs/scanner/pointer-scan.js +546 -0
  52. package/dist/cjs/scanner/pointer-scan.js.map +1 -0
  53. package/dist/cjs/scanner/scanner.js +513 -0
  54. package/dist/cjs/scanner/scanner.js.map +1 -0
  55. package/dist/cjs/scanner/shared-layout.js +207 -0
  56. package/dist/cjs/scanner/shared-layout.js.map +1 -0
  57. package/dist/cjs/types.js +190 -0
  58. package/dist/cjs/types.js.map +1 -0
  59. package/dist/cjs/value-codec.js +515 -0
  60. package/dist/cjs/value-codec.js.map +1 -0
  61. package/dist/cjs/win/process.js +475 -0
  62. package/dist/cjs/win/process.js.map +1 -0
  63. package/dist/cjs/win/scan-worker.js +84 -0
  64. package/dist/cjs/win/scan-worker.js.map +1 -0
  65. package/dist/cjs/win/winapi.js +403 -0
  66. package/dist/cjs/win/winapi.js.map +1 -0
  67. package/dist/types/addr/expression.d.ts +98 -0
  68. package/dist/types/addr/expression.d.ts.map +1 -0
  69. package/dist/types/addresslist/memory-record.d.ts +218 -0
  70. package/dist/types/addresslist/memory-record.d.ts.map +1 -0
  71. package/dist/types/asm/assembler.d.ts +106 -0
  72. package/dist/types/asm/assembler.d.ts.map +1 -0
  73. package/dist/types/asm/autoassembler-directives.d.ts +118 -0
  74. package/dist/types/asm/autoassembler-directives.d.ts.map +1 -0
  75. package/dist/types/asm/autoassembler.d.ts +434 -0
  76. package/dist/types/asm/autoassembler.d.ts.map +1 -0
  77. package/dist/types/asm/backend.d.ts +167 -0
  78. package/dist/types/asm/backend.d.ts.map +1 -0
  79. package/dist/types/asm/disassembler.d.ts +194 -0
  80. package/dist/types/asm/disassembler.d.ts.map +1 -0
  81. package/dist/types/backend/dbk-backend.d.ts +353 -0
  82. package/dist/types/backend/dbk-backend.d.ts.map +1 -0
  83. package/dist/types/backend/native-ce-backend.d.ts +213 -0
  84. package/dist/types/backend/native-ce-backend.d.ts.map +1 -0
  85. package/dist/types/backend/self-backend.d.ts +64 -0
  86. package/dist/types/backend/self-backend.d.ts.map +1 -0
  87. package/dist/types/backend/types.d.ts +176 -0
  88. package/dist/types/backend/types.d.ts.map +1 -0
  89. package/dist/types/cheattable/ct-format.d.ts +100 -0
  90. package/dist/types/cheattable/ct-format.d.ts.map +1 -0
  91. package/dist/types/index.d.ts +54 -0
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/lua/aa.d.ts +107 -0
  94. package/dist/types/lua/aa.d.ts.map +1 -0
  95. package/dist/types/lua/addressing.d.ts +41 -0
  96. package/dist/types/lua/addressing.d.ts.map +1 -0
  97. package/dist/types/lua/api.d.ts +46 -0
  98. package/dist/types/lua/api.d.ts.map +1 -0
  99. package/dist/types/lua/asm.d.ts +42 -0
  100. package/dist/types/lua/asm.d.ts.map +1 -0
  101. package/dist/types/lua/bridge.d.ts +129 -0
  102. package/dist/types/lua/bridge.d.ts.map +1 -0
  103. package/dist/types/lua/marshal.d.ts +244 -0
  104. package/dist/types/lua/marshal.d.ts.map +1 -0
  105. package/dist/types/lua/memory.d.ts +61 -0
  106. package/dist/types/lua/memory.d.ts.map +1 -0
  107. package/dist/types/lua/objects.d.ts +210 -0
  108. package/dist/types/lua/objects.d.ts.map +1 -0
  109. package/dist/types/lua/scan.d.ts +106 -0
  110. package/dist/types/lua/scan.d.ts.map +1 -0
  111. package/dist/types/lua/types.d.ts +146 -0
  112. package/dist/types/lua/types.d.ts.map +1 -0
  113. package/dist/types/scanner/matcher.d.ts +122 -0
  114. package/dist/types/scanner/matcher.d.ts.map +1 -0
  115. package/dist/types/scanner/pointer-scan.d.ts +187 -0
  116. package/dist/types/scanner/pointer-scan.d.ts.map +1 -0
  117. package/dist/types/scanner/scanner.d.ts +150 -0
  118. package/dist/types/scanner/scanner.d.ts.map +1 -0
  119. package/dist/types/scanner/shared-layout.d.ts +96 -0
  120. package/dist/types/scanner/shared-layout.d.ts.map +1 -0
  121. package/dist/types/types.d.ts +239 -0
  122. package/dist/types/types.d.ts.map +1 -0
  123. package/dist/types/value-codec.d.ts +134 -0
  124. package/dist/types/value-codec.d.ts.map +1 -0
  125. package/dist/types/win/process.d.ts +190 -0
  126. package/dist/types/win/process.d.ts.map +1 -0
  127. package/dist/types/win/scan-worker.d.ts +51 -0
  128. package/dist/types/win/scan-worker.d.ts.map +1 -0
  129. package/dist/types/win/winapi.d.ts +144 -0
  130. package/dist/types/win/winapi.d.ts.map +1 -0
  131. package/docs/assembler.md +371 -0
  132. package/docs/autoassembler.md +423 -0
  133. package/docs/backend-dbk.md +305 -0
  134. package/docs/backends.md +273 -0
  135. package/docs/evidence/atomics-wait-io.js +20 -0
  136. package/docs/evidence/mini-repro.js +98 -0
  137. package/docs/lua-api.md +718 -0
  138. package/package.json +60 -4
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * node-cheat-engine —— Cheat Engine 核心引擎的 Node.js 移植版。
4
+ *
5
+ * 公共 API 入口。设计目标:用 Node 复刻 CE 在**用户态**能做的核心能力:
6
+ * 跨进程内存读写、全类型内存扫描(对齐 memscan.pas 的比较语义)、
7
+ * 指针扫描、地址表与 .CT 读写、地址表达式解析、脚本桥。
8
+ *
9
+ * 明确不在范围内(Node 中不存在实现路径,详见 PORT-SCOPE.md):
10
+ * - dbk32/DBKKernel 内核驱动:ring-0 物理内存读写、绕过进程保护
11
+ * - dbvm/DBVM UEFI:VT-x/AMD-V hypervisor、硬件断点与隐身
12
+ * - LCL/VCL 图形界面(.lfm 窗体)
13
+ * - x86/x64 反汇编与汇编器(原样保留 AutoAssembler 语义需要独立移植)
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DbkBackend = exports.CESERVER_DEFAULT_PORT = exports.CESERVER_CMD = exports.CeReader = exports.CeWriter = exports.CeServerConnection = exports.NativeCeBackend = exports.filterScanRegions = exports.SelfBackend = exports.BackendUnsupportedError = exports.aobHasNibbleWildcard = exports.aobMatchesAt = exports.doubleMatches = exports.singleMatches = exports.buildFloatCompareParams = exports.parseBinaryPattern = exports.parseAob = exports.decimalsOf = exports.parseFloatLiteral = exports.parseIntegerLiteral = exports.roundTo = exports.DEFAULT_PROCESS_ACCESS = exports.PROCESS_QUERY_INFORMATION = exports.PROCESS_VM_OPERATION = exports.PROCESS_VM_WRITE = exports.PROCESS_VM_READ = exports.PAGE_GUARD = exports.PAGE_EXECUTE_WRITECOPY = exports.PAGE_EXECUTE_READWRITE = exports.PAGE_EXECUTE_READ = exports.PAGE_EXECUTE = exports.PAGE_WRITECOPY = exports.PAGE_READWRITE = exports.PAGE_READONLY = exports.PAGE_NOACCESS = exports.MEM_IMAGE = exports.MEM_MAPPED = exports.MEM_PRIVATE = exports.MEM_FREE = exports.MEM_RESERVE = exports.MEM_COMMIT = exports.SCAN_OPTION_NAMES = exports.VARIABLE_TYPE_SIZES = exports.VARIABLE_TYPE_NAMES = exports.FastScanMethod = exports.PointerType = exports.ScanType = exports.RoundingType = exports.ScanOption = exports.VariableType = void 0;
17
+ exports.writeCheatTable = exports.parseCheatTable = exports.buildRecordsFromScan = exports.addScanResults = exports.MemoryRecord = exports.AddressList = exports.ExpressionError = exports.CompiledAddress = exports.resolveAddress = exports.evaluateExpression = exports.compileExpression = exports.applyPointerPath = exports.formatPointerPath = exports.PointerScanner = exports.optionNeedsOldValue = exports.scanBlock = exports.compileConfig = exports.ScanSession = exports.win32ErrorMessage = exports.findProcessesByNameAsync = exports.listProcessesAsync = exports.openProcessByNameAsync = exports.openProcessAsync = exports.regionTypeName = exports.setDefaultBackend = exports.getDefaultBackend = exports.isExecutable = exports.isWritable = exports.isReadable = exports.selectScannableRegions = exports.enumerateRegions = exports.findProcessesByName = exports.listProcesses = exports.ProcessOpenError = exports.Process = exports.readServiceNameFromDriverDat = exports.resolveDevicePath = exports.readAllocResult = exports.packAllocInput = exports.packWriteBuffer = exports.packReadInput = exports.DEFAULT_DBK_SERVICE_NAME = exports.DBK_ALLOC_INPUT_SIZE = exports.DBK_MAX_READ_CHUNK = exports.DBK_MAX_WRITE_PAYLOAD = exports.DBK_WRITE_BUFFER_SIZE = exports.DBK_WRITE_INPUT_SIZE = exports.DBK_READ_INPUT_SIZE = exports.DBK_IOCTL = exports.DbkDeviceError = void 0;
18
+ exports.bytesToDbArguments = exports.patternToDbArguments = exports.parsePseudoDirective = exports.encodeAlign = exports.encodeNop = exports.encodeDataDirective = exports.splitDirectiveArguments = exports.parseCeInteger = exports.autoAssemble = exports.AutoAssemblerError = exports.AutoAssembler = exports.AssemblerError = exports.assembleToBytes = exports.assembleLines = exports.assemble = exports.DisasmValueType = exports.instructionText = exports.branchTarget = exports.formatBytes = exports.splitDisassembledString = exports.formatDisassembled = exports.disassembleAt = exports.disassembleOne = exports.disassemble = exports.AsmBackendError = exports.toSafeNumberAddress = exports.backendVersions = exports.instructionNameOf = exports.assembleRaw = exports.disassembleRaw = exports.archFromBitness = exports.normalizeArchitecture = exports.architectureInfo = exports.isArchitectureSupported = exports.resetAsmBackendForTests = exports.isAsmBackendReady = exports.ensureAsmBackend = exports.LuaMarshal = exports.LuaError = exports.LuaScriptError = exports.LuaEngine = exports.stringToVariableType = exports.variableTypeToString = exports.saveCheatTable = exports.loadCheatTable = void 0;
19
+ var types_1 = require("./types");
20
+ Object.defineProperty(exports, "VariableType", { enumerable: true, get: function () { return types_1.VariableType; } });
21
+ Object.defineProperty(exports, "ScanOption", { enumerable: true, get: function () { return types_1.ScanOption; } });
22
+ Object.defineProperty(exports, "RoundingType", { enumerable: true, get: function () { return types_1.RoundingType; } });
23
+ Object.defineProperty(exports, "ScanType", { enumerable: true, get: function () { return types_1.ScanType; } });
24
+ Object.defineProperty(exports, "PointerType", { enumerable: true, get: function () { return types_1.PointerType; } });
25
+ Object.defineProperty(exports, "FastScanMethod", { enumerable: true, get: function () { return types_1.FastScanMethod; } });
26
+ Object.defineProperty(exports, "VARIABLE_TYPE_NAMES", { enumerable: true, get: function () { return types_1.VARIABLE_TYPE_NAMES; } });
27
+ Object.defineProperty(exports, "VARIABLE_TYPE_SIZES", { enumerable: true, get: function () { return types_1.VARIABLE_TYPE_SIZES; } });
28
+ Object.defineProperty(exports, "SCAN_OPTION_NAMES", { enumerable: true, get: function () { return types_1.SCAN_OPTION_NAMES; } });
29
+ Object.defineProperty(exports, "MEM_COMMIT", { enumerable: true, get: function () { return types_1.MEM_COMMIT; } });
30
+ Object.defineProperty(exports, "MEM_RESERVE", { enumerable: true, get: function () { return types_1.MEM_RESERVE; } });
31
+ Object.defineProperty(exports, "MEM_FREE", { enumerable: true, get: function () { return types_1.MEM_FREE; } });
32
+ Object.defineProperty(exports, "MEM_PRIVATE", { enumerable: true, get: function () { return types_1.MEM_PRIVATE; } });
33
+ Object.defineProperty(exports, "MEM_MAPPED", { enumerable: true, get: function () { return types_1.MEM_MAPPED; } });
34
+ Object.defineProperty(exports, "MEM_IMAGE", { enumerable: true, get: function () { return types_1.MEM_IMAGE; } });
35
+ Object.defineProperty(exports, "PAGE_NOACCESS", { enumerable: true, get: function () { return types_1.PAGE_NOACCESS; } });
36
+ Object.defineProperty(exports, "PAGE_READONLY", { enumerable: true, get: function () { return types_1.PAGE_READONLY; } });
37
+ Object.defineProperty(exports, "PAGE_READWRITE", { enumerable: true, get: function () { return types_1.PAGE_READWRITE; } });
38
+ Object.defineProperty(exports, "PAGE_WRITECOPY", { enumerable: true, get: function () { return types_1.PAGE_WRITECOPY; } });
39
+ Object.defineProperty(exports, "PAGE_EXECUTE", { enumerable: true, get: function () { return types_1.PAGE_EXECUTE; } });
40
+ Object.defineProperty(exports, "PAGE_EXECUTE_READ", { enumerable: true, get: function () { return types_1.PAGE_EXECUTE_READ; } });
41
+ Object.defineProperty(exports, "PAGE_EXECUTE_READWRITE", { enumerable: true, get: function () { return types_1.PAGE_EXECUTE_READWRITE; } });
42
+ Object.defineProperty(exports, "PAGE_EXECUTE_WRITECOPY", { enumerable: true, get: function () { return types_1.PAGE_EXECUTE_WRITECOPY; } });
43
+ Object.defineProperty(exports, "PAGE_GUARD", { enumerable: true, get: function () { return types_1.PAGE_GUARD; } });
44
+ Object.defineProperty(exports, "PROCESS_VM_READ", { enumerable: true, get: function () { return types_1.PROCESS_VM_READ; } });
45
+ Object.defineProperty(exports, "PROCESS_VM_WRITE", { enumerable: true, get: function () { return types_1.PROCESS_VM_WRITE; } });
46
+ Object.defineProperty(exports, "PROCESS_VM_OPERATION", { enumerable: true, get: function () { return types_1.PROCESS_VM_OPERATION; } });
47
+ Object.defineProperty(exports, "PROCESS_QUERY_INFORMATION", { enumerable: true, get: function () { return types_1.PROCESS_QUERY_INFORMATION; } });
48
+ Object.defineProperty(exports, "DEFAULT_PROCESS_ACCESS", { enumerable: true, get: function () { return types_1.DEFAULT_PROCESS_ACCESS; } });
49
+ /* —— 值编解码 —— */
50
+ var value_codec_1 = require("./value-codec");
51
+ Object.defineProperty(exports, "roundTo", { enumerable: true, get: function () { return value_codec_1.roundTo; } });
52
+ Object.defineProperty(exports, "parseIntegerLiteral", { enumerable: true, get: function () { return value_codec_1.parseIntegerLiteral; } });
53
+ Object.defineProperty(exports, "parseFloatLiteral", { enumerable: true, get: function () { return value_codec_1.parseFloatLiteral; } });
54
+ Object.defineProperty(exports, "decimalsOf", { enumerable: true, get: function () { return value_codec_1.decimalsOf; } });
55
+ Object.defineProperty(exports, "parseAob", { enumerable: true, get: function () { return value_codec_1.parseAob; } });
56
+ Object.defineProperty(exports, "parseBinaryPattern", { enumerable: true, get: function () { return value_codec_1.parseBinaryPattern; } });
57
+ Object.defineProperty(exports, "buildFloatCompareParams", { enumerable: true, get: function () { return value_codec_1.buildFloatCompareParams; } });
58
+ Object.defineProperty(exports, "singleMatches", { enumerable: true, get: function () { return value_codec_1.singleMatches; } });
59
+ Object.defineProperty(exports, "doubleMatches", { enumerable: true, get: function () { return value_codec_1.doubleMatches; } });
60
+ Object.defineProperty(exports, "aobMatchesAt", { enumerable: true, get: function () { return value_codec_1.aobMatchesAt; } });
61
+ Object.defineProperty(exports, "aobHasNibbleWildcard", { enumerable: true, get: function () { return value_codec_1.aobHasNibbleWildcard; } });
62
+ var types_2 = require("./backend/types");
63
+ Object.defineProperty(exports, "BackendUnsupportedError", { enumerable: true, get: function () { return types_2.BackendUnsupportedError; } });
64
+ var self_backend_1 = require("./backend/self-backend");
65
+ Object.defineProperty(exports, "SelfBackend", { enumerable: true, get: function () { return self_backend_1.SelfBackend; } });
66
+ Object.defineProperty(exports, "filterScanRegions", { enumerable: true, get: function () { return self_backend_1.filterScanRegions; } });
67
+ var native_ce_backend_1 = require("./backend/native-ce-backend");
68
+ Object.defineProperty(exports, "NativeCeBackend", { enumerable: true, get: function () { return native_ce_backend_1.NativeCeBackend; } });
69
+ Object.defineProperty(exports, "CeServerConnection", { enumerable: true, get: function () { return native_ce_backend_1.CeServerConnection; } });
70
+ Object.defineProperty(exports, "CeWriter", { enumerable: true, get: function () { return native_ce_backend_1.CeWriter; } });
71
+ Object.defineProperty(exports, "CeReader", { enumerable: true, get: function () { return native_ce_backend_1.CeReader; } });
72
+ Object.defineProperty(exports, "CESERVER_CMD", { enumerable: true, get: function () { return native_ce_backend_1.CESERVER_CMD; } });
73
+ Object.defineProperty(exports, "CESERVER_DEFAULT_PORT", { enumerable: true, get: function () { return native_ce_backend_1.CESERVER_DEFAULT_PORT; } });
74
+ /* —— DBK 内核驱动后端 ——
75
+ *
76
+ * 通过 CE 自己的 DBK 驱动 ioctl 读写受保护进程内存。**需要驱动已加载**
77
+ * (加载需要管理员权限,见 `ce_kernel`)。
78
+ *
79
+ * ⚠️ 能力边界:ioctl 码与输入结构是按 CE 源码逐行实现的,但
80
+ * **结构布局未经真机验证**(本机无法加载驱动来试),详见
81
+ * `docs/backend-dbk.md` 的"未验证部分"。
82
+ */
83
+ var dbk_backend_1 = require("./backend/dbk-backend");
84
+ Object.defineProperty(exports, "DbkBackend", { enumerable: true, get: function () { return dbk_backend_1.DbkBackend; } });
85
+ Object.defineProperty(exports, "DbkDeviceError", { enumerable: true, get: function () { return dbk_backend_1.DbkDeviceError; } });
86
+ Object.defineProperty(exports, "DBK_IOCTL", { enumerable: true, get: function () { return dbk_backend_1.DBK_IOCTL; } });
87
+ Object.defineProperty(exports, "DBK_READ_INPUT_SIZE", { enumerable: true, get: function () { return dbk_backend_1.DBK_READ_INPUT_SIZE; } });
88
+ Object.defineProperty(exports, "DBK_WRITE_INPUT_SIZE", { enumerable: true, get: function () { return dbk_backend_1.DBK_WRITE_INPUT_SIZE; } });
89
+ Object.defineProperty(exports, "DBK_WRITE_BUFFER_SIZE", { enumerable: true, get: function () { return dbk_backend_1.DBK_WRITE_BUFFER_SIZE; } });
90
+ Object.defineProperty(exports, "DBK_MAX_WRITE_PAYLOAD", { enumerable: true, get: function () { return dbk_backend_1.DBK_MAX_WRITE_PAYLOAD; } });
91
+ Object.defineProperty(exports, "DBK_MAX_READ_CHUNK", { enumerable: true, get: function () { return dbk_backend_1.DBK_MAX_READ_CHUNK; } });
92
+ Object.defineProperty(exports, "DBK_ALLOC_INPUT_SIZE", { enumerable: true, get: function () { return dbk_backend_1.DBK_ALLOC_INPUT_SIZE; } });
93
+ Object.defineProperty(exports, "DEFAULT_DBK_SERVICE_NAME", { enumerable: true, get: function () { return dbk_backend_1.DEFAULT_DBK_SERVICE_NAME; } });
94
+ Object.defineProperty(exports, "packReadInput", { enumerable: true, get: function () { return dbk_backend_1.packReadInput; } });
95
+ Object.defineProperty(exports, "packWriteBuffer", { enumerable: true, get: function () { return dbk_backend_1.packWriteBuffer; } });
96
+ Object.defineProperty(exports, "packAllocInput", { enumerable: true, get: function () { return dbk_backend_1.packAllocInput; } });
97
+ Object.defineProperty(exports, "readAllocResult", { enumerable: true, get: function () { return dbk_backend_1.readAllocResult; } });
98
+ Object.defineProperty(exports, "resolveDevicePath", { enumerable: true, get: function () { return dbk_backend_1.resolveDevicePath; } });
99
+ Object.defineProperty(exports, "readServiceNameFromDriverDat", { enumerable: true, get: function () { return dbk_backend_1.readServiceNameFromDriverDat; } });
100
+ /* —— 进程与内存 —— */
101
+ var process_1 = require("./win/process");
102
+ Object.defineProperty(exports, "Process", { enumerable: true, get: function () { return process_1.Process; } });
103
+ Object.defineProperty(exports, "ProcessOpenError", { enumerable: true, get: function () { return process_1.ProcessOpenError; } });
104
+ Object.defineProperty(exports, "listProcesses", { enumerable: true, get: function () { return process_1.listProcesses; } });
105
+ Object.defineProperty(exports, "findProcessesByName", { enumerable: true, get: function () { return process_1.findProcessesByName; } });
106
+ Object.defineProperty(exports, "enumerateRegions", { enumerable: true, get: function () { return process_1.enumerateRegions; } });
107
+ Object.defineProperty(exports, "selectScannableRegions", { enumerable: true, get: function () { return process_1.selectScannableRegions; } });
108
+ Object.defineProperty(exports, "isReadable", { enumerable: true, get: function () { return process_1.isReadable; } });
109
+ Object.defineProperty(exports, "isWritable", { enumerable: true, get: function () { return process_1.isWritable; } });
110
+ Object.defineProperty(exports, "isExecutable", { enumerable: true, get: function () { return process_1.isExecutable; } });
111
+ Object.defineProperty(exports, "getDefaultBackend", { enumerable: true, get: function () { return process_1.getDefaultBackend; } });
112
+ Object.defineProperty(exports, "setDefaultBackend", { enumerable: true, get: function () { return process_1.setDefaultBackend; } });
113
+ Object.defineProperty(exports, "regionTypeName", { enumerable: true, get: function () { return process_1.regionTypeName; } });
114
+ Object.defineProperty(exports, "openProcessAsync", { enumerable: true, get: function () { return process_1.openProcessAsync; } });
115
+ Object.defineProperty(exports, "openProcessByNameAsync", { enumerable: true, get: function () { return process_1.openProcessByNameAsync; } });
116
+ Object.defineProperty(exports, "listProcessesAsync", { enumerable: true, get: function () { return process_1.listProcessesAsync; } });
117
+ Object.defineProperty(exports, "findProcessesByNameAsync", { enumerable: true, get: function () { return process_1.findProcessesByNameAsync; } });
118
+ var winapi_1 = require("./win/winapi");
119
+ Object.defineProperty(exports, "win32ErrorMessage", { enumerable: true, get: function () { return winapi_1.win32ErrorMessage; } });
120
+ /* —— 扫描 —— */
121
+ var scanner_1 = require("./scanner/scanner");
122
+ Object.defineProperty(exports, "ScanSession", { enumerable: true, get: function () { return scanner_1.ScanSession; } });
123
+ var matcher_1 = require("./scanner/matcher");
124
+ Object.defineProperty(exports, "compileConfig", { enumerable: true, get: function () { return matcher_1.compileConfig; } });
125
+ Object.defineProperty(exports, "scanBlock", { enumerable: true, get: function () { return matcher_1.scanBlock; } });
126
+ Object.defineProperty(exports, "optionNeedsOldValue", { enumerable: true, get: function () { return matcher_1.optionNeedsOldValue; } });
127
+ var pointer_scan_1 = require("./scanner/pointer-scan");
128
+ Object.defineProperty(exports, "PointerScanner", { enumerable: true, get: function () { return pointer_scan_1.PointerScanner; } });
129
+ Object.defineProperty(exports, "formatPointerPath", { enumerable: true, get: function () { return pointer_scan_1.formatPointerPath; } });
130
+ Object.defineProperty(exports, "applyPointerPath", { enumerable: true, get: function () { return pointer_scan_1.applyPointerPath; } });
131
+ /* —— 地址表达式 —— */
132
+ var expression_1 = require("./addr/expression");
133
+ Object.defineProperty(exports, "compileExpression", { enumerable: true, get: function () { return expression_1.compileExpression; } });
134
+ Object.defineProperty(exports, "evaluateExpression", { enumerable: true, get: function () { return expression_1.evaluateExpression; } });
135
+ Object.defineProperty(exports, "resolveAddress", { enumerable: true, get: function () { return expression_1.resolveAddress; } });
136
+ Object.defineProperty(exports, "CompiledAddress", { enumerable: true, get: function () { return expression_1.CompiledAddress; } });
137
+ Object.defineProperty(exports, "ExpressionError", { enumerable: true, get: function () { return expression_1.ExpressionError; } });
138
+ /* —— 地址表 —— */
139
+ var memory_record_1 = require("./addresslist/memory-record");
140
+ Object.defineProperty(exports, "AddressList", { enumerable: true, get: function () { return memory_record_1.AddressList; } });
141
+ Object.defineProperty(exports, "MemoryRecord", { enumerable: true, get: function () { return memory_record_1.MemoryRecord; } });
142
+ Object.defineProperty(exports, "addScanResults", { enumerable: true, get: function () { return memory_record_1.addScanResults; } });
143
+ Object.defineProperty(exports, "buildRecordsFromScan", { enumerable: true, get: function () { return memory_record_1.buildRecordsFromScan; } });
144
+ /* —— Cheat Table 读写 —— */
145
+ var ct_format_1 = require("./cheattable/ct-format");
146
+ Object.defineProperty(exports, "parseCheatTable", { enumerable: true, get: function () { return ct_format_1.parseCheatTable; } });
147
+ Object.defineProperty(exports, "writeCheatTable", { enumerable: true, get: function () { return ct_format_1.writeCheatTable; } });
148
+ Object.defineProperty(exports, "loadCheatTable", { enumerable: true, get: function () { return ct_format_1.loadCheatTable; } });
149
+ Object.defineProperty(exports, "saveCheatTable", { enumerable: true, get: function () { return ct_format_1.saveCheatTable; } });
150
+ Object.defineProperty(exports, "variableTypeToString", { enumerable: true, get: function () { return ct_format_1.variableTypeToString; } });
151
+ Object.defineProperty(exports, "stringToVariableType", { enumerable: true, get: function () { return ct_format_1.stringToVariableType; } });
152
+ /* —— Lua 脚本桥 ——
153
+ *
154
+ * 61 个 CE Lua API 函数的实现,详见 docs/lua-api.md。
155
+ * 需要 wasmoon(Lua 5.4,靠整数子类型保证 int64 地址不丢精度)。
156
+ */
157
+ var bridge_1 = require("./lua/bridge");
158
+ Object.defineProperty(exports, "LuaEngine", { enumerable: true, get: function () { return bridge_1.LuaEngine; } });
159
+ Object.defineProperty(exports, "LuaScriptError", { enumerable: true, get: function () { return bridge_1.LuaScriptError; } });
160
+ Object.defineProperty(exports, "LuaError", { enumerable: true, get: function () { return bridge_1.LuaError; } });
161
+ Object.defineProperty(exports, "LuaMarshal", { enumerable: true, get: function () { return bridge_1.LuaMarshal; } });
162
+ /* —— 反汇编 / 汇编 ——
163
+ *
164
+ * 后端是 capstone-wasm(反汇编)与 keystone-wasm(汇编):
165
+ * Cheat Engine 自己也是调 binutils 的 objdump/as,自带 Pascal 实现只是回退路径。
166
+ * **使用前必须 await ensureAsmBackend()**(WASM 异步初始化)。
167
+ * 详见 docs/assembler.md。
168
+ */
169
+ var backend_1 = require("./asm/backend");
170
+ Object.defineProperty(exports, "ensureAsmBackend", { enumerable: true, get: function () { return backend_1.ensureAsmBackend; } });
171
+ Object.defineProperty(exports, "isAsmBackendReady", { enumerable: true, get: function () { return backend_1.isAsmBackendReady; } });
172
+ Object.defineProperty(exports, "resetAsmBackendForTests", { enumerable: true, get: function () { return backend_1.resetAsmBackendForTests; } });
173
+ Object.defineProperty(exports, "isArchitectureSupported", { enumerable: true, get: function () { return backend_1.isArchitectureSupported; } });
174
+ Object.defineProperty(exports, "architectureInfo", { enumerable: true, get: function () { return backend_1.architectureInfo; } });
175
+ Object.defineProperty(exports, "normalizeArchitecture", { enumerable: true, get: function () { return backend_1.normalizeArchitecture; } });
176
+ Object.defineProperty(exports, "archFromBitness", { enumerable: true, get: function () { return backend_1.archFromBitness; } });
177
+ Object.defineProperty(exports, "disassembleRaw", { enumerable: true, get: function () { return backend_1.disassembleRaw; } });
178
+ Object.defineProperty(exports, "assembleRaw", { enumerable: true, get: function () { return backend_1.assembleRaw; } });
179
+ Object.defineProperty(exports, "instructionNameOf", { enumerable: true, get: function () { return backend_1.instructionNameOf; } });
180
+ Object.defineProperty(exports, "backendVersions", { enumerable: true, get: function () { return backend_1.backendVersions; } });
181
+ Object.defineProperty(exports, "toSafeNumberAddress", { enumerable: true, get: function () { return backend_1.toSafeNumberAddress; } });
182
+ Object.defineProperty(exports, "AsmBackendError", { enumerable: true, get: function () { return backend_1.AsmBackendError; } });
183
+ var disassembler_1 = require("./asm/disassembler");
184
+ Object.defineProperty(exports, "disassemble", { enumerable: true, get: function () { return disassembler_1.disassemble; } });
185
+ Object.defineProperty(exports, "disassembleOne", { enumerable: true, get: function () { return disassembler_1.disassembleOne; } });
186
+ Object.defineProperty(exports, "disassembleAt", { enumerable: true, get: function () { return disassembler_1.disassembleAt; } });
187
+ Object.defineProperty(exports, "formatDisassembled", { enumerable: true, get: function () { return disassembler_1.formatDisassembled; } });
188
+ Object.defineProperty(exports, "splitDisassembledString", { enumerable: true, get: function () { return disassembler_1.splitDisassembledString; } });
189
+ Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return disassembler_1.formatBytes; } });
190
+ Object.defineProperty(exports, "branchTarget", { enumerable: true, get: function () { return disassembler_1.branchTarget; } });
191
+ Object.defineProperty(exports, "instructionText", { enumerable: true, get: function () { return disassembler_1.instructionText; } });
192
+ Object.defineProperty(exports, "DisasmValueType", { enumerable: true, get: function () { return disassembler_1.DisasmValueType; } });
193
+ var assembler_1 = require("./asm/assembler");
194
+ Object.defineProperty(exports, "assemble", { enumerable: true, get: function () { return assembler_1.assemble; } });
195
+ Object.defineProperty(exports, "assembleLines", { enumerable: true, get: function () { return assembler_1.assembleLines; } });
196
+ Object.defineProperty(exports, "assembleToBytes", { enumerable: true, get: function () { return assembler_1.assembleToBytes; } });
197
+ Object.defineProperty(exports, "AssemblerError", { enumerable: true, get: function () { return assembler_1.AssemblerError; } });
198
+ /* —— Auto Assembler(CE 脚本) ——
199
+ *
200
+ * 支持 [ENABLE]/[DISABLE]、alloc/dealloc/realloc/globalalloc、label/define、
201
+ * registersymbol、aobscan(+module/region/unique)、createthread、include、
202
+ * db/dw/dd/dq、nop/align、readmem/loadbinary。详见 docs/autoassembler.md。
203
+ *
204
+ * 核心机制:ENABLE 写入前逐字节记录原字节,DISABLE 精确还原(空 [DISABLE] 也能还原)。
205
+ */
206
+ var autoassembler_1 = require("./asm/autoassembler");
207
+ Object.defineProperty(exports, "AutoAssembler", { enumerable: true, get: function () { return autoassembler_1.AutoAssembler; } });
208
+ Object.defineProperty(exports, "AutoAssemblerError", { enumerable: true, get: function () { return autoassembler_1.AutoAssemblerError; } });
209
+ Object.defineProperty(exports, "autoAssemble", { enumerable: true, get: function () { return autoassembler_1.autoAssemble; } });
210
+ var autoassembler_directives_1 = require("./asm/autoassembler-directives");
211
+ Object.defineProperty(exports, "parseCeInteger", { enumerable: true, get: function () { return autoassembler_directives_1.parseCeInteger; } });
212
+ Object.defineProperty(exports, "splitDirectiveArguments", { enumerable: true, get: function () { return autoassembler_directives_1.splitDirectiveArguments; } });
213
+ Object.defineProperty(exports, "encodeDataDirective", { enumerable: true, get: function () { return autoassembler_directives_1.encodeDataDirective; } });
214
+ Object.defineProperty(exports, "encodeNop", { enumerable: true, get: function () { return autoassembler_directives_1.encodeNop; } });
215
+ Object.defineProperty(exports, "encodeAlign", { enumerable: true, get: function () { return autoassembler_directives_1.encodeAlign; } });
216
+ Object.defineProperty(exports, "parsePseudoDirective", { enumerable: true, get: function () { return autoassembler_directives_1.parsePseudoDirective; } });
217
+ Object.defineProperty(exports, "patternToDbArguments", { enumerable: true, get: function () { return autoassembler_directives_1.patternToDbArguments; } });
218
+ Object.defineProperty(exports, "bytesToDbArguments", { enumerable: true, get: function () { return autoassembler_directives_1.bytesToDbArguments; } });
219
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ /**
3
+ * Lua 的 Auto Assembler 绑定。
4
+ *
5
+ * 把引擎层的 `AutoAssembler`(见 `../asm/autoassembler.ts`)包成 CE 的 Lua 全局函数:
6
+ *
7
+ * | Lua 函数 | 对应 CE | 返回 |
8
+ * | --- | --- | --- |
9
+ * | `autoAssemble(script [, enable])` | `autoAssemble` | 成功 `true`,失败 `false`(原因进 sink) |
10
+ * | `autoAssembleCheck(script [, enable])` | `autoAssembleCheck` | 同上,但不写目标进程 |
11
+ * | `autoAssembleError()` | —(本移植扩展) | 最近一次 AA 错误文本,无错误返回 `nil` |
12
+ *
13
+ * ## 符号双向流通(只使用引擎的公开 API 实现)
14
+ *
15
+ * - **AA → Lua**:每次执行后,把 `AutoAssembleResult.symbols` 快照灌回 Lua 的
16
+ * `SymbolTable`,因此脚本里 `alloc`/`label`/`aobscan`/`registersymbol`
17
+ * 产生的名字对 Lua 的 `getAddress()` 立即可见(与 CE 一致)。
18
+ * - **Lua → AA**:执行前把 Lua 符号表里已有的名字**做文本替换**成
19
+ * `0x...` 字面量。之所以用替换而不是注入符号表:`AutoAssembler` 的
20
+ * `symbols` 是只读快照、构造器也不接受初值,
21
+ * 而子串替换与 `assembler.ts` 的 `symbols` 选项语义一致、结果可预测。
22
+ *
23
+ * ## 与 CE 的差异(有意为之)
24
+ *
25
+ * 1. **不抛 Lua 错误,返回布尔值**。CE 的 `autoAssemble` 失败时会弹窗;
26
+ * 本移植遵循 Lua 惯用法返回 `false`,原因用 `autoAssembleError()` 取,
27
+ * 避免脚本因弹窗中断。
28
+ * 2. **`createthread` 只校验不执行**(Node 没有 `CreateRemoteThread`)。
29
+ * 脚本不会因此失败,但也不会真的建线程;错误文本里会写明。
30
+ * 3. **`[ENABLE]`/`[DISABLE]` 必须成对**:还原记录按**脚本原文**分桶
31
+ * (等价 CE 每条 memoryrecord 一份 `TDisableInfo`),
32
+ * 因此多个脚本各自独立开关互不影响。
33
+ * 4. **换目标进程会重建 AA 实例**:旧的 alloc 记录对新进程没有意义
34
+ * (那块内存已随旧进程消失)。CE 在换进程时同样会清表。
35
+ */
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.LuaAutoAssembler = void 0;
38
+ exports.formatAutoAssemblerError = formatAutoAssemblerError;
39
+ exports.createAutoAssemblerApi = createAutoAssemblerApi;
40
+ const autoassembler_1 = require("../asm/autoassembler");
41
+ const marshal_1 = require("./marshal");
42
+ /**
43
+ * Lua 的 Auto Assembler 绑定对象。
44
+ *
45
+ * 生命期与 LuaEngine 一致:持有一个 `AutoAssembler` 实例,
46
+ * 这样多次 `autoAssemble` 调用之间共享 alloc 记录与还原历史
47
+ * (`[ENABLE]` 之后才能 `[DISABLE]`)。
48
+ */
49
+ class LuaAutoAssembler {
50
+ ctx;
51
+ assembler = null;
52
+ lastError = null;
53
+ /** 最近一次同步进 Lua 符号表的条目(诊断用) */
54
+ synced = new Map();
55
+ /** 缓存的进程引用:换了目标进程要重建 assembler */
56
+ boundProcess = null;
57
+ constructor(ctx) {
58
+ this.ctx = ctx;
59
+ }
60
+ /** 按当前进程取(必要时重建)引擎实例 */
61
+ engine() {
62
+ const proc = this.ctx.currentProcess();
63
+ if (!this.assembler || this.boundProcess !== proc) {
64
+ this.assembler = new autoassembler_1.AutoAssembler({
65
+ ...(proc ? { process: proc } : {}),
66
+ });
67
+ this.boundProcess = proc;
68
+ }
69
+ return this.assembler;
70
+ }
71
+ /** 目标进程被关闭/更换时调用,丢弃旧状态 */
72
+ invalidate() {
73
+ this.assembler = null;
74
+ this.boundProcess = null;
75
+ this.synced = new Map();
76
+ }
77
+ /** 最近一次 AA 错误(无错误返回 null) */
78
+ getLastError() {
79
+ return this.lastError;
80
+ }
81
+ /** 最近一次同步进 Lua 符号表的条目 */
82
+ getSyncedSymbols() {
83
+ return this.synced;
84
+ }
85
+ /** 执行 `autoAssemble`(真正写目标进程) */
86
+ run(script, enable) {
87
+ return this.execute(script, enable, false);
88
+ }
89
+ /** 执行 `autoAssembleCheck`(只检查语法与编码,不写目标进程) */
90
+ check(script, enable) {
91
+ return this.execute(script, enable, true);
92
+ }
93
+ execute(script, enable, syntaxCheckOnly) {
94
+ this.lastError = null;
95
+ if (typeof script !== 'string' || script.trim() === '') {
96
+ this.lastError = 'autoAssemble: 脚本不能为空';
97
+ return false;
98
+ }
99
+ try {
100
+ const prepared = this.injectLuaSymbols(script);
101
+ const result = this.engine().autoAssemble(prepared, {
102
+ enable,
103
+ syntaxCheckOnly,
104
+ });
105
+ // AA → Lua:把本次的符号快照同步过去,让 getAddress() 立即可见
106
+ this.ctx.symbols.mergeFrom(result.symbols);
107
+ this.synced = new Map(result.symbols);
108
+ // createthread 只校验不执行 —— 明确告知
109
+ if (result.createThreads.length > 0) {
110
+ this.lastError =
111
+ `注意:createthread 仅做参数校验,未创建远程线程(Node 无 CreateRemoteThread)。` +
112
+ `地址:${result.createThreads.map((a) => '0x' + a.toString(16)).join(', ')}`;
113
+ }
114
+ return true;
115
+ }
116
+ catch (e) {
117
+ this.lastError = formatAutoAssemblerError(e);
118
+ return false;
119
+ }
120
+ }
121
+ /**
122
+ * 把 Lua 符号表里已有的名字替换成 `0x...` 字面量。
123
+ *
124
+ * 边界:
125
+ * - 只替换**独立标识符**(两侧非标识符字符),避免误伤 `0xAB` 这类字面量与寄存器名;
126
+ * - 跳过 AA 自己的指令关键字行(`alloc(`/`label(`/`define(`/`registersymbol(`/
127
+ * `aobscan*`),否则 `alloc(newmem,256)` 里的 `newmem` 会被替换成地址,
128
+ * 而那一行的语义是"声明名字"而不是"引用地址"。
129
+ */
130
+ injectLuaSymbols(script) {
131
+ const symbols = this.ctx.symbols.snapshot();
132
+ if (symbols.size === 0)
133
+ return script;
134
+ // 名字长的优先,避免 label 先于 label2 被匹配
135
+ const names = [...symbols.keys()].sort((a, b) => b.length - a.length);
136
+ const shouldSkip = (line) => {
137
+ const t = line.trim().toLowerCase();
138
+ return (/^(alloc|dealloc|realloc|globalalloc|label|define|registersymbol|unregistersymbol)\s*\(/.test(t) ||
139
+ /^aobscan(module|region|unique)?\s*\(/.test(t) ||
140
+ /^(kalloc|sharedalloc|createthread|include|loadbinary|readmem)\s*\(/.test(t));
141
+ };
142
+ return script
143
+ .split(/\r?\n/)
144
+ .map((line) => {
145
+ if (shouldSkip(line))
146
+ return line;
147
+ let out = line;
148
+ for (const name of names) {
149
+ const addr = symbols.get(name);
150
+ const re = new RegExp(`(?<![\\w.$?@])${escapeRegExp(name)}(?![\\w.$?@])`, 'gi');
151
+ if (re.test(out))
152
+ out = out.replace(re, '0x' + addr.toString(16));
153
+ }
154
+ return out;
155
+ })
156
+ .join('\n');
157
+ }
158
+ }
159
+ exports.LuaAutoAssembler = LuaAutoAssembler;
160
+ function escapeRegExp(s) {
161
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
162
+ }
163
+ /** 把 AutoAssemblerError 转成带行号的可读文本 */
164
+ function formatAutoAssemblerError(e) {
165
+ if (e instanceof autoassembler_1.AutoAssemblerError) {
166
+ const line = e.lineNumber !== undefined ? `第 ${e.lineNumber} 行` : '';
167
+ const phase = e.phase ? `[${e.phase}]` : '';
168
+ const at = line || phase ? `(${[phase, line].filter(Boolean).join(' ')})` : '';
169
+ return `Auto Assembler 失败${at}:${e.message}`;
170
+ }
171
+ if (e instanceof Error)
172
+ return `Auto Assembler 失败:${e.message}`;
173
+ return `Auto Assembler 失败:${(0, marshal_1.describeError)(e)}`;
174
+ }
175
+ /**
176
+ * 构造要注册进 Lua 的函数表。
177
+ *
178
+ * 单独成函数(而不是塞进 api.ts)是为了让 Lua 的 AA 绑定与引擎层保持清晰边界,
179
+ * 也便于单测。
180
+ */
181
+ function createAutoAssemblerApi(ctx, errorSink) {
182
+ const instance = new LuaAutoAssembler(ctx);
183
+ /** 把最近错误写进 sink,便于 Lua 侧统一读取 */
184
+ const report = () => {
185
+ const msg = instance.getLastError();
186
+ if (msg)
187
+ errorSink.set(msg);
188
+ else
189
+ errorSink.clear();
190
+ };
191
+ const functions = {
192
+ /**
193
+ * `autoAssemble(script [, enable]) -> boolean`
194
+ *
195
+ * CE 里失败会弹窗;本移植返回 `false` 并把原因写进错误 sink,
196
+ * 用 `autoAssembleError()` 取详情。
197
+ */
198
+ autoAssemble(args, m) {
199
+ const script = m.argToString(args, 1, 'autoAssemble');
200
+ const enable = args[1] === undefined ? true : m.argToBoolean(args, 2, true);
201
+ const ok = instance.run(script, enable);
202
+ report();
203
+ return ok;
204
+ },
205
+ /**
206
+ * `autoAssembleCheck(script [, enable]) -> boolean`
207
+ *
208
+ * 只解析与编码,不分配内存、不写目标进程,用于"能不能用"的预检。
209
+ */
210
+ autoAssembleCheck(args, m) {
211
+ const script = m.argToString(args, 1, 'autoAssembleCheck');
212
+ const enable = args[1] === undefined ? true : m.argToBoolean(args, 2, true);
213
+ const ok = instance.check(script, enable);
214
+ report();
215
+ return ok;
216
+ },
217
+ /**
218
+ * `autoAssembleError() -> string | nil`
219
+ *
220
+ * 本移植扩展:取最近一次 AA 失败的详情(含行号)。
221
+ * CE 用弹窗报告,脚本里拿不到文本,因此这里额外提供。
222
+ */
223
+ autoAssembleError() {
224
+ const msg = instance.getLastError();
225
+ return msg === null || msg === '' ? null : msg;
226
+ },
227
+ };
228
+ return { functions, instance };
229
+ }
230
+ //# sourceMappingURL=aa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aa.js","sourceRoot":"","sources":["../../../src/lua/aa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * 地址表达式解析(CE 的 getAddress / getAddressFromName 的简化实现)。
4
+ *
5
+ * 支持的写法(与 CE Lua 脚本里常见的写法对齐):
6
+ * 1234 / 0012AB00 十六进制(CE 的地址表达式里裸数字按十六进制解释)
7
+ * 0x7FF6A000 / $7FF6A000
8
+ * kernel32.dll 模块基址(大小写不敏感,可省略 .dll)
9
+ * kernel32.dll+1A2B 模块基址 + 偏移
10
+ * mySymbol+40 已注册符号 + 偏移
11
+ * a+b-c 多个项按 +/- 连接
12
+ *
13
+ * 注意:只有**字符串**里的裸数字按十六进制解释;
14
+ * `getAddress(4096)` 传 Lua 数字时原样返回 4096。
15
+ *
16
+ * 不支持:括号、乘法/除法、指针解引用(CE 里靠 `[[addr]+4]` 这类写法,本移植未实现)。
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.AddressResolver = void 0;
20
+ class AddressResolver {
21
+ deps;
22
+ constructor(deps) {
23
+ this.deps = deps;
24
+ }
25
+ /**
26
+ * 解析地址。number/bigint 直接返回;字符串走表达式解析。
27
+ * 解析失败抛 Error(中文信息),由调用方决定是抛 Lua 错误还是返回 nil。
28
+ */
29
+ resolve(value) {
30
+ if (typeof value === 'bigint')
31
+ return value;
32
+ if (typeof value === 'number') {
33
+ if (!Number.isFinite(value) || !Number.isInteger(value)) {
34
+ throw new Error(`地址必须是整数,收到 ${value}`);
35
+ }
36
+ return BigInt(value);
37
+ }
38
+ if (typeof value === 'string')
39
+ return this.parseExpression(value);
40
+ throw new Error(`地址必须是整数或字符串,收到 ${value === null ? 'nil' : typeof value}`);
41
+ }
42
+ /** 失败返回 null(对应 getAddressSafe 的语义)。 */
43
+ tryResolve(value) {
44
+ try {
45
+ return this.resolve(value);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /** 解析字符串表达式。 */
52
+ parseExpression(expr) {
53
+ const source = expr.trim();
54
+ if (source === '')
55
+ throw new Error('地址表达式为空');
56
+ const terms = this.splitTerms(source);
57
+ if (terms.length === 0)
58
+ throw new Error(`地址表达式无法解析:"${expr}"`);
59
+ let total = 0n;
60
+ for (const term of terms) {
61
+ const v = this.parseTerm(term.text, source);
62
+ total += term.sign === 1 ? v : -v;
63
+ }
64
+ return total;
65
+ }
66
+ /** 按 +/- 切分表达式(不考虑括号)。 */
67
+ splitTerms(source) {
68
+ const terms = [];
69
+ let sign = 1;
70
+ let buffer = '';
71
+ const flush = () => {
72
+ const text = buffer.trim();
73
+ if (text !== '')
74
+ terms.push({ sign, text });
75
+ buffer = '';
76
+ };
77
+ for (const ch of source) {
78
+ if (ch === '+' || ch === '-') {
79
+ flush();
80
+ sign = ch === '+' ? 1 : -1;
81
+ }
82
+ else if (ch === ' ' || ch === '\t') {
83
+ // 允许空格分隔,但不作为运算符
84
+ if (buffer !== '')
85
+ buffer += ch;
86
+ }
87
+ else {
88
+ buffer += ch;
89
+ }
90
+ }
91
+ flush();
92
+ return terms;
93
+ }
94
+ /** 解析单项:字面量、模块名或符号。 */
95
+ parseTerm(raw, source) {
96
+ const text = raw.trim();
97
+ if (text === '')
98
+ throw new Error(`地址表达式 "${source}" 中有空项`);
99
+ if (/^\$[0-9a-fA-F]+$/.test(text))
100
+ return BigInt('0x' + text.slice(1));
101
+ if (/^0x[0-9a-fA-F]+$/i.test(text))
102
+ return BigInt(text);
103
+ if (/^[0-9a-fA-F]+$/.test(text)) {
104
+ // CE 的地址表达式里裸数字一律按十六进制解释
105
+ // (`kernel32.dll+1000` 是基址 +0x1000,AOBScan 输出的 8 位串也是十六进制)
106
+ return BigInt('0x' + text);
107
+ }
108
+ const symbol = this.deps.symbols.get(text) ?? this.deps.symbols.getCaseInsensitive(text);
109
+ if (symbol !== undefined)
110
+ return symbol;
111
+ const mod = this.deps.findModule(text);
112
+ if (mod)
113
+ return mod.baseAddress;
114
+ throw new Error(`无法解析地址表达式 "${source}" 中的 "${text}":既不是数字,也不是已注册符号或模块名`);
115
+ }
116
+ }
117
+ exports.AddressResolver = AddressResolver;
118
+ //# sourceMappingURL=addressing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addressing.js","sourceRoot":"","sources":["../../../src/lua/addressing.ts"],"names":[],"mappings":"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"}