@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,403 @@
1
+ "use strict";
2
+ /**
3
+ * Windows 原生 API 绑定层。
4
+ *
5
+ * 通过 koffi 直接绑定 kernel32/psapi 等导出函数,替代 Cheat Engine 里的
6
+ * `NewKernelHandler.pas` / `ProcessHandlerUnit.pas`(用户态部分)。
7
+ *
8
+ * 注意:CE 在内核态做的部分(dbk32/DBKKernel 驱动读写物理内存、
9
+ * 绕过 ObRegisterCallbacks 等)在 Node 中不存在实现路径,见 PORT-SCOPE.md。
10
+ * 本模块只覆盖 CE 的"无驱动回退路径"所使用的那套用户态 API。
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.THREAD_QUERY_INFORMATION = exports.THREAD_SET_CONTEXT = exports.THREAD_GET_CONTEXT = exports.THREAD_SUSPEND_RESUME = exports.TH32CS_SNAPALL = exports.TH32CS_SNAPMODULE32 = exports.TH32CS_SNAPMODULE = exports.TH32CS_SNAPTHREAD = exports.TH32CS_SNAPPROCESS = exports.EnumProcessModules = exports.GetModuleFileNameExW = exports.INVALID_HANDLE_VALUE = exports.FILE_ATTRIBUTE_NORMAL = exports.CREATE_EXISTING = exports.FILE_SHARE_WRITE = exports.FILE_SHARE_READ = exports.GENERIC_WRITE = exports.GENERIC_READ = exports.DeviceIoControl = exports.CreateFileW = exports.GetLastError = exports.UnmapViewOfFile = exports.MapViewOfFile = exports.OpenFileMappingW = exports.CreateFileMappingW = exports.SetThreadContext = exports.GetThreadContext = exports.ResumeThread = exports.SuspendThread = exports.OpenThread = exports.VirtualFreeEx = exports.VirtualAllocEx = exports.VirtualProtectEx = exports.VirtualQueryEx = exports.WriteProcessMemory = exports.ReadProcessMemory = exports.IsWow64Process = exports.TerminateProcess = exports.GetProcessId = exports.GetCurrentProcessId = exports.GetCurrentProcess = exports.CloseHandle = exports.OpenProcess = exports.Module32NextW = exports.Module32FirstW = exports.Thread32Next = exports.Thread32First = exports.Process32NextW = exports.Process32FirstW = exports.CreateToolhelp32Snapshot = void 0;
47
+ exports.koffi = exports.SECURITY_ATTRIBUTES = exports.MEMORY_BASIC_INFORMATION = exports.MODULEENTRY32W = exports.THREADENTRY32 = exports.PROCESSENTRY32W = exports.ACCESS = exports.PAGE_PROTECT_NAMES = exports.MEM_TYPE_NAMES = exports.MEM_STATE_NAMES = exports.PAGE_READWRITE_MAP = exports.FILE_MAP_ALL_ACCESS = exports.PAGE_GUARD_FLAG = exports.PAGE_PROTECTION_MASK = exports.PAGE_EXECUTE_READWRITE_FLAG = exports.PAGE_EXECUTE_READ_FLAG = exports.PAGE_EXECUTE_FLAG = exports.PAGE_READWRITE_FLAG = exports.PAGE_READONLY_FLAG = exports.MEM_COMMIT_FLAG = exports.MEM_RESERVE_FLAG = exports.MEM_RELEASE = void 0;
48
+ exports.win32ErrorMessage = win32ErrorMessage;
49
+ exports.lastErrorMessage = lastErrorMessage;
50
+ exports.isValidHandle = isValidHandle;
51
+ exports.handleToBigInt = handleToBigInt;
52
+ exports.asPointer = asPointer;
53
+ exports.bufferAsPointer = bufferAsPointer;
54
+ const koffi = __importStar(require("koffi"));
55
+ exports.koffi = koffi;
56
+ const types_1 = require("../types");
57
+ /* ------------------------------------------------------------------ *
58
+ * 结构体
59
+ * ------------------------------------------------------------------ */
60
+ const PROCESSENTRY32W = koffi.struct('NCE_PROCESSENTRY32W', {
61
+ dwSize: 'uint32',
62
+ cntUsage: 'uint32',
63
+ th32ProcessID: 'uint32',
64
+ th32DefaultHeapID: 'uintptr_t',
65
+ th32ModuleID: 'uint32',
66
+ cntThreads: 'uint32',
67
+ th32ParentProcessID: 'uint32',
68
+ pcPriClassBase: 'long',
69
+ dwFlags: 'uint32',
70
+ szExeFile: koffi.array('uint16', 260),
71
+ });
72
+ exports.PROCESSENTRY32W = PROCESSENTRY32W;
73
+ const THREADENTRY32 = koffi.struct('NCE_THREADENTRY32', {
74
+ dwSize: 'uint32',
75
+ cntUsage: 'uint32',
76
+ th32ThreadID: 'uint32',
77
+ th32OwnerProcessID: 'uint32',
78
+ tpBasePri: 'long',
79
+ tpDeltaPri: 'long',
80
+ dwFlags: 'uint32',
81
+ });
82
+ exports.THREADENTRY32 = THREADENTRY32;
83
+ const MODULEENTRY32W = koffi.struct('NCE_MODULEENTRY32W', {
84
+ dwSize: 'uint32',
85
+ th32ModuleID: 'uint32',
86
+ th32ProcessID: 'uint32',
87
+ GlblcntUsage: 'uint32',
88
+ ProccntUsage: 'uint32',
89
+ modBaseAddr: 'void*',
90
+ modBaseSize: 'uint32',
91
+ hModule: 'void*',
92
+ szModule: koffi.array('uint16', 256),
93
+ szExePath: koffi.array('uint16', 260),
94
+ });
95
+ exports.MODULEENTRY32W = MODULEENTRY32W;
96
+ /** MEMORY_BASIC_INFORMATION (x64)。sizeof = 48。 */
97
+ const MEMORY_BASIC_INFORMATION = koffi.struct('NCE_MEMORY_BASIC_INFORMATION', {
98
+ BaseAddress: 'void*',
99
+ AllocationBase: 'void*',
100
+ AllocationProtect: 'uint32',
101
+ PartitionId: 'uint16',
102
+ __pad1: 'uint16',
103
+ RegionSize: 'size_t',
104
+ State: 'uint32',
105
+ Protect: 'uint32',
106
+ Type: 'uint32',
107
+ __pad2: 'uint32',
108
+ });
109
+ exports.MEMORY_BASIC_INFORMATION = MEMORY_BASIC_INFORMATION;
110
+ /** SECURITY_ATTRIBUTES,用于 CreateFileMapping 共享内存。 */
111
+ const SECURITY_ATTRIBUTES = koffi.struct('NCE_SECURITY_ATTRIBUTES', {
112
+ nLength: 'uint32',
113
+ __pad: 'uint32',
114
+ lpSecurityDescriptor: 'void*',
115
+ bInheritHandle: 'bool',
116
+ __pad2: 'uint8[7]',
117
+ });
118
+ exports.SECURITY_ATTRIBUTES = SECURITY_ATTRIBUTES;
119
+ /* ------------------------------------------------------------------ *
120
+ * 函数绑定
121
+ * ------------------------------------------------------------------ */
122
+ const k32 = koffi.load('kernel32.dll');
123
+ const psapi = (() => {
124
+ try {
125
+ return koffi.load('psapi.dll');
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ })();
131
+ /* —— 进程/线程/模块枚举 —— */
132
+ exports.CreateToolhelp32Snapshot = k32.func('CreateToolhelp32Snapshot', 'void*', [
133
+ 'uint32',
134
+ 'uint32',
135
+ ]);
136
+ /**
137
+ * 关于 koffi 的结构体出入参约定(实测结论,勿改):
138
+ * - 用 `koffi.pointer(STRUCT)` 作为参数类型,**不要**再套 `koffi.out()`;
139
+ * 套了 out() 会让 koffi 只写不回,传对象时字段读不到(全为 0/undefined)。
140
+ * - 调用时传一块 `Buffer`(首字节按结构体布局写入入参字段)最稳,
141
+ * 也可以传 `koffi.alloc(STRUCT, 1)` 并用 `koffi.decode(ptr, STRUCT)` 取回。
142
+ * - 结构体返回值无法直接用 JS 对象承接,必须走上面两种方式之一。
143
+ */
144
+ exports.Process32FirstW = k32.func('Process32FirstW', 'bool', [
145
+ 'void*',
146
+ koffi.pointer(PROCESSENTRY32W),
147
+ ]);
148
+ exports.Process32NextW = k32.func('Process32NextW', 'bool', [
149
+ 'void*',
150
+ koffi.pointer(PROCESSENTRY32W),
151
+ ]);
152
+ exports.Thread32First = k32.func('Thread32First', 'bool', [
153
+ 'void*',
154
+ koffi.pointer(THREADENTRY32),
155
+ ]);
156
+ exports.Thread32Next = k32.func('Thread32Next', 'bool', [
157
+ 'void*',
158
+ koffi.pointer(THREADENTRY32),
159
+ ]);
160
+ exports.Module32FirstW = k32.func('Module32FirstW', 'bool', [
161
+ 'void*',
162
+ koffi.pointer(MODULEENTRY32W),
163
+ ]);
164
+ exports.Module32NextW = k32.func('Module32NextW', 'bool', [
165
+ 'void*',
166
+ koffi.pointer(MODULEENTRY32W),
167
+ ]);
168
+ /* —— 进程句柄 —— */
169
+ exports.OpenProcess = k32.func('OpenProcess', 'void*', ['uint32', 'bool', 'uint32']);
170
+ exports.CloseHandle = k32.func('CloseHandle', 'bool', ['void*']);
171
+ exports.GetCurrentProcess = k32.func('GetCurrentProcess', 'void*', []);
172
+ exports.GetCurrentProcessId = k32.func('GetCurrentProcessId', 'uint32', []);
173
+ exports.GetProcessId = k32.func('GetProcessId', 'uint32', ['void*']);
174
+ exports.TerminateProcess = k32.func('TerminateProcess', 'bool', ['void*', 'uint32']);
175
+ exports.IsWow64Process = k32.func('IsWow64Process', 'bool', ['void*', koffi.out(koffi.pointer('int'))]);
176
+ /* —— 内存读写 —— */
177
+ exports.ReadProcessMemory = k32.func('ReadProcessMemory', 'bool', [
178
+ 'void*',
179
+ 'void*',
180
+ 'void*',
181
+ 'size_t',
182
+ koffi.out(koffi.pointer('size_t')),
183
+ ]);
184
+ exports.WriteProcessMemory = k32.func('WriteProcessMemory', 'bool', [
185
+ 'void*',
186
+ 'void*',
187
+ 'void*',
188
+ 'size_t',
189
+ koffi.out(koffi.pointer('size_t')),
190
+ ]);
191
+ /* —— 内存区域 —— */
192
+ exports.VirtualQueryEx = k32.func('VirtualQueryEx', 'size_t', [
193
+ 'void*',
194
+ 'void*',
195
+ koffi.pointer(MEMORY_BASIC_INFORMATION),
196
+ 'size_t',
197
+ ]);
198
+ exports.VirtualProtectEx = k32.func('VirtualProtectEx', 'bool', [
199
+ 'void*',
200
+ 'void*',
201
+ 'size_t',
202
+ 'uint32',
203
+ koffi.out(koffi.pointer('uint32')),
204
+ ]);
205
+ exports.VirtualAllocEx = k32.func('VirtualAllocEx', 'void*', [
206
+ 'void*',
207
+ 'void*',
208
+ 'size_t',
209
+ 'uint32',
210
+ 'uint32',
211
+ ]);
212
+ exports.VirtualFreeEx = k32.func('VirtualFreeEx', 'bool', ['void*', 'void*', 'size_t', 'uint32']);
213
+ /* —— 线程控制 —— */
214
+ exports.OpenThread = k32.func('OpenThread', 'void*', ['uint32', 'bool', 'uint32']);
215
+ exports.SuspendThread = k32.func('SuspendThread', 'uint32', ['void*']);
216
+ exports.ResumeThread = k32.func('ResumeThread', 'uint32', ['void*']);
217
+ exports.GetThreadContext = k32.func('GetThreadContext', 'bool', ['void*', 'void*']);
218
+ exports.SetThreadContext = k32.func('SetThreadContext', 'bool', ['void*', 'void*']);
219
+ /* —— 共享内存 / 派发 —— */
220
+ exports.CreateFileMappingW = k32.func('CreateFileMappingW', 'void*', [
221
+ 'void*',
222
+ 'void*',
223
+ 'uint32',
224
+ 'uint32',
225
+ 'uint32',
226
+ 'str16',
227
+ ]);
228
+ exports.OpenFileMappingW = k32.func('OpenFileMappingW', 'void*', ['uint32', 'bool', 'str16']);
229
+ exports.MapViewOfFile = k32.func('MapViewOfFile', 'void*', [
230
+ 'void*',
231
+ 'uint32',
232
+ 'uint32',
233
+ 'uint32',
234
+ 'size_t',
235
+ ]);
236
+ exports.UnmapViewOfFile = k32.func('UnmapViewOfFile', 'bool', ['void*']);
237
+ /* —— 错误处理 —— */
238
+ exports.GetLastError = k32.func('GetLastError', 'uint32', []);
239
+ /* —— 设备 I/O(内核驱动通信用) —— */
240
+ /**
241
+ * `CreateFileW`。
242
+ *
243
+ * 用于打开内核驱动暴露的设备对象,例如 `\\.\CEDRIVER73`(CE 的 DBK 驱动)。
244
+ * 句柄返回 `void*`,失败时是 `INVALID_HANDLE_VALUE`。
245
+ */
246
+ exports.CreateFileW = k32.func('CreateFileW', 'void*', [
247
+ 'str16', // lpFileName
248
+ 'uint32', // dwDesiredAccess
249
+ 'uint32', // dwShareMode
250
+ 'void*', // lpSecurityAttributes(NULL)
251
+ 'uint32', // dwCreationDisposition(OPEN_EXISTING)
252
+ 'uint32', // dwFlagsAndAttributes(FILE_ATTRIBUTE_NORMAL)
253
+ 'void*', // hTemplateFile(NULL)
254
+ ]);
255
+ /**
256
+ * `DeviceIoControl`。
257
+ *
258
+ * 输入/输出缓冲区都按 `void*` 传:传 `Buffer` 时用 `bufferAsPointer(buf)` 换指针。
259
+ * 对 `METHOD_BUFFERED` 的 ioctl,输入与输出都经系统缓冲区中转,
260
+ * 因此**同一块 Buffer 同时当 in/out 是合法的** —— CE 的写内存就是这么用的
261
+ * (`deviceiocontrol(hdevice, cc, @ao[0], 512, @ao[0], 512, br, nil)`)。
262
+ */
263
+ exports.DeviceIoControl = k32.func('DeviceIoControl', 'bool', [
264
+ 'void*', // hDevice
265
+ 'uint32', // dwIoControlCode
266
+ 'void*', // lpInBuffer
267
+ 'uint32', // nInBufferSize
268
+ 'void*', // lpOutBuffer
269
+ 'uint32', // nOutBufferSize
270
+ koffi.out(koffi.pointer('uint32')), // lpBytesReturned
271
+ 'void*', // lpOverlapped
272
+ ]);
273
+ /* —— CreateFile / CreateFileMapping 用到的常量 —— */
274
+ /** 读写访问 */
275
+ exports.GENERIC_READ = 0x80000000;
276
+ exports.GENERIC_WRITE = 0x40000000;
277
+ /** 共享读写(CE 打开驱动时就是这么传的) */
278
+ exports.FILE_SHARE_READ = 0x00000001;
279
+ exports.FILE_SHARE_WRITE = 0x00000002;
280
+ /** `CREATE_EXISTING`:只打开已存在的设备,不创建 */
281
+ exports.CREATE_EXISTING = 3;
282
+ /** `FILE_ATTRIBUTE_NORMAL` */
283
+ exports.FILE_ATTRIBUTE_NORMAL = 0x00000080;
284
+ /** `INVALID_HANDLE_VALUE`(Win32 的 -1),用 bigint 表示避免 32 位截断 */
285
+ exports.INVALID_HANDLE_VALUE = -1n;
286
+ /* —— psapi 扩展 —— */
287
+ exports.GetModuleFileNameExW = psapi?.func('GetModuleFileNameExW', 'uint32', ['void*', 'void*', 'void*', 'uint32']) ?? null;
288
+ exports.EnumProcessModules = psapi?.func('EnumProcessModules', 'bool', ['void*', 'void*', 'uint32', koffi.out(koffi.pointer('uint32'))]) ?? null;
289
+ /* ------------------------------------------------------------------ *
290
+ * 高层封装
291
+ * ------------------------------------------------------------------ */
292
+ /** 把 Windows 错误码翻成可读文本。 */
293
+ const ERROR_MESSAGES = {
294
+ 2: '系统找不到指定的文件',
295
+ 5: '拒绝访问(权限不足,通常需要以管理员身份运行,或目标进程受保护)',
296
+ 6: '句柄无效',
297
+ 8: '内存不足',
298
+ 24: '程序发出命令,但命令长度不正确',
299
+ 87: '参数错误',
300
+ 998: '对内存位置的访问无效',
301
+ 299: '仅完成了部分 ReadProcessMemory 或 WriteProcessMemory 请求',
302
+ };
303
+ function win32ErrorMessage(code) {
304
+ const known = ERROR_MESSAGES[code];
305
+ return known ? `${known} (Win32 错误 ${code})` : `Win32 错误 ${code}`;
306
+ }
307
+ /** 读取一句话的当前错误。 */
308
+ function lastErrorMessage() {
309
+ return win32ErrorMessage((0, exports.GetLastError)());
310
+ }
311
+ /** 判断句柄是否有效(koffi 返回 bigint 指针)。 */
312
+ function isValidHandle(h) {
313
+ if (h === null || h === undefined)
314
+ return false;
315
+ if (typeof h === 'bigint')
316
+ return h !== 0n && h !== 0xffffffffffffffffn;
317
+ if (typeof h === 'number')
318
+ return h !== 0 && h !== -1;
319
+ return true;
320
+ }
321
+ /** 把 koffi 返回的指针/HANDLE 统一成 bigint。 */
322
+ function handleToBigInt(h) {
323
+ if (typeof h === 'bigint')
324
+ return h;
325
+ if (typeof h === 'number')
326
+ return BigInt(Math.trunc(h));
327
+ if (h === null || h === undefined)
328
+ return 0n;
329
+ return BigInt(koffi.address(h));
330
+ }
331
+ /**
332
+ * 把 bigint 地址转成 koffi 需要的指针参数。
333
+ *
334
+ * 关键约定(实测):
335
+ * - `koffi.as(x, 'void*')` 只接受"外部指针/缓冲区",传裸地址会抛错;
336
+ * - `koffi.address(x)` 是反方向(外部指针 → 地址),也不要在这里用;
337
+ * - koffi 直接接受 BigInt/number 作为指针参数的地址值,因此原样返回即可。
338
+ */
339
+ function asPointer(addr) {
340
+ return addr;
341
+ }
342
+ /**
343
+ * 把 JS 缓冲区暴露为指针(用于把 Buffer 当作 OUT 参数传给原生函数)。
344
+ * 与 asPointer 的区别:asPointer 转的是"裸地址",这里转的是"缓冲区句柄"。
345
+ */
346
+ function bufferAsPointer(buf) {
347
+ return koffi.as(buf, 'void*');
348
+ }
349
+ /* —— 常量(供内部与其他模块复用) —— */
350
+ exports.TH32CS_SNAPPROCESS = 0x00000002;
351
+ exports.TH32CS_SNAPTHREAD = 0x00000004;
352
+ exports.TH32CS_SNAPMODULE = 0x00000008;
353
+ exports.TH32CS_SNAPMODULE32 = 0x00000010;
354
+ exports.TH32CS_SNAPALL = exports.TH32CS_SNAPPROCESS | exports.TH32CS_SNAPTHREAD | exports.TH32CS_SNAPMODULE | exports.TH32CS_SNAPMODULE32;
355
+ exports.THREAD_SUSPEND_RESUME = 0x0002;
356
+ exports.THREAD_GET_CONTEXT = 0x0008;
357
+ exports.THREAD_SET_CONTEXT = 0x0010;
358
+ exports.THREAD_QUERY_INFORMATION = 0x0040;
359
+ exports.MEM_RELEASE = 0x8000;
360
+ exports.MEM_RESERVE_FLAG = types_1.MEM_RESERVE;
361
+ exports.MEM_COMMIT_FLAG = types_1.MEM_COMMIT;
362
+ exports.PAGE_READONLY_FLAG = types_1.PAGE_READONLY;
363
+ exports.PAGE_READWRITE_FLAG = types_1.PAGE_READWRITE;
364
+ exports.PAGE_EXECUTE_FLAG = types_1.PAGE_EXECUTE;
365
+ exports.PAGE_EXECUTE_READ_FLAG = types_1.PAGE_EXECUTE_READ;
366
+ exports.PAGE_EXECUTE_READWRITE_FLAG = types_1.PAGE_EXECUTE_READWRITE;
367
+ exports.PAGE_PROTECTION_MASK = 0xff;
368
+ exports.PAGE_GUARD_FLAG = types_1.PAGE_GUARD;
369
+ exports.FILE_MAP_ALL_ACCESS = 0xf001f;
370
+ exports.PAGE_READWRITE_MAP = 0x04;
371
+ exports.MEM_STATE_NAMES = {
372
+ [types_1.MEM_COMMIT]: 'MEM_COMMIT',
373
+ [types_1.MEM_RESERVE]: 'MEM_RESERVE',
374
+ [types_1.MEM_FREE]: 'MEM_FREE',
375
+ };
376
+ exports.MEM_TYPE_NAMES = {
377
+ [types_1.MEM_IMAGE]: 'MEM_IMAGE',
378
+ [types_1.MEM_MAPPED]: 'MEM_MAPPED',
379
+ [types_1.MEM_PRIVATE]: 'MEM_PRIVATE',
380
+ 0: 'MEM_FREE',
381
+ };
382
+ exports.PAGE_PROTECT_NAMES = {
383
+ [types_1.PAGE_NOACCESS]: 'PAGE_NOACCESS',
384
+ [types_1.PAGE_READONLY]: 'PAGE_READONLY',
385
+ [types_1.PAGE_READWRITE]: 'PAGE_READWRITE',
386
+ [types_1.PAGE_WRITECOPY]: 'PAGE_WRITECOPY',
387
+ [types_1.PAGE_EXECUTE]: 'PAGE_EXECUTE',
388
+ [types_1.PAGE_EXECUTE_READ]: 'PAGE_EXECUTE_READ',
389
+ [types_1.PAGE_EXECUTE_READWRITE]: 'PAGE_EXECUTE_READWRITE',
390
+ [types_1.PAGE_EXECUTE_WRITECOPY]: 'PAGE_EXECUTE_WRITECOPY',
391
+ };
392
+ /** 常用进程访问权限(导出给调用方) */
393
+ exports.ACCESS = {
394
+ TERMINATE: types_1.PROCESS_TERMINATE,
395
+ CREATE_THREAD: types_1.PROCESS_CREATE_THREAD,
396
+ VM_OPERATION: types_1.PROCESS_VM_OPERATION,
397
+ VM_READ: types_1.PROCESS_VM_READ,
398
+ VM_WRITE: types_1.PROCESS_VM_WRITE,
399
+ QUERY_INFORMATION: types_1.PROCESS_QUERY_INFORMATION,
400
+ QUERY_LIMITED_INFORMATION: types_1.PROCESS_QUERY_LIMITED_INFORMATION,
401
+ SUSPEND_RESUME: types_1.PROCESS_SUSPEND_RESUME,
402
+ };
403
+ //# sourceMappingURL=winapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"winapi.js","sourceRoot":"","sources":["../../../src/win/winapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 地址表达式求值 —— 对齐 Cheat Engine `addressparser.pas` 的功能子集。
3
+ *
4
+ * CE 的地址栏支持这些写法(这也是本模块要支持的):
5
+ * - 十六进制 / 十进制字面量:`1234ABCD`、`0x1234`、`$1234`、`1234`
6
+ * - 模块相对地址:`"game.exe"+1234`、`game.exe+1234`
7
+ * - 符号名:已注册的符号,或模块内的导出符号
8
+ * - 解引用:`[[ game.exe+1234 ]+10]`、`[rax]`(寄存器在脚本上下文才有意义)
9
+ * - 算术:`+ - * / % << >> & | ^ ~`,以及括号
10
+ * - 内置函数:`GetModuleBase("x")`、`GetModuleSize("x")`、`GetAddress("expr")`
11
+ * - 寄存器占位:`EAX`/`RAX` 等 —— 仅在提供了寄存器上下文的场景下解析,
12
+ * 否则报错(本移植不含调试器,故没有真实的寄存器上下文)
13
+ *
14
+ * 设计说明:表达式先编译成 AST(可在表中反复复用,避免每次重解析),
15
+ * 求值时再访问模块列表与符号表,这样模块基址变化(重启进程)不需要重编译。
16
+ */
17
+ import { Process } from '../win/process';
18
+ /** 表达式求值错误 */
19
+ export declare class ExpressionError extends Error {
20
+ readonly expression: string;
21
+ readonly position?: number | undefined;
22
+ constructor(message: string, expression: string, position?: number | undefined);
23
+ }
24
+ export type ExprNode = {
25
+ kind: 'number';
26
+ value: bigint;
27
+ } | {
28
+ kind: 'symbol';
29
+ name: string;
30
+ } | {
31
+ kind: 'module';
32
+ name: string;
33
+ offset: ExprNode;
34
+ } | {
35
+ kind: 'deref';
36
+ inner: ExprNode;
37
+ } | {
38
+ kind: 'unary';
39
+ op: string;
40
+ operand: ExprNode;
41
+ } | {
42
+ kind: 'binary';
43
+ op: string;
44
+ left: ExprNode;
45
+ right: ExprNode;
46
+ } | {
47
+ kind: 'call';
48
+ name: string;
49
+ args: ExprNode[];
50
+ } | {
51
+ kind: 'register';
52
+ name: string;
53
+ };
54
+ /** 求值上下文 */
55
+ export interface EvalContext {
56
+ /** 目标进程(解析模块、解引用内存都要用) */
57
+ process?: Process;
58
+ /** 已注册符号表 */
59
+ symbols?: Map<string, bigint>;
60
+ /** 寄存器值(仅调试器场景才有) */
61
+ registers?: Record<string, bigint>;
62
+ /** 模块列表缓存(避免每次求值都枚举模块) */
63
+ moduleCache?: Array<{
64
+ name: string;
65
+ baseAddress: bigint;
66
+ size: number;
67
+ }>;
68
+ /**
69
+ * 求值策略:
70
+ * - 'address'(默认):解引用真的去读目标进程内存,得到最终地址
71
+ * - 'parseOnly':只做算术,遇到解引用抛错(用于校验语法)
72
+ */
73
+ mode?: 'address' | 'parseOnly';
74
+ }
75
+ /** 编译表达式为 AST(可缓存复用)。 */
76
+ export declare function compileExpression(expression: string): ExprNode;
77
+ /** 求值表达式为 64 位地址。 */
78
+ export declare function evaluateExpression(node: ExprNode, ctx: EvalContext, expression?: string): bigint;
79
+ /**
80
+ * 直接求值一个地址表达式。
81
+ *
82
+ * ```ts
83
+ * const addr = resolveAddress('"notepad.exe"+1234', { process: proc });
84
+ * const pointee = resolveAddress('[[notepad.exe+10]+8]', { process: proc });
85
+ * ```
86
+ */
87
+ export declare function resolveAddress(expression: string, ctx: EvalContext): bigint;
88
+ /** 已编译的表达式(便于在地址表里反复求值)。 */
89
+ export declare class CompiledAddress {
90
+ readonly source: string;
91
+ private readonly ast;
92
+ private readonly error;
93
+ constructor(expression: string);
94
+ get isValid(): boolean;
95
+ get parseError(): Error | null;
96
+ resolve(ctx: EvalContext): bigint;
97
+ }
98
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../../src/addr/expression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,cAAc;AACd,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM;gBAF1B,OAAO,EAAE,MAAM,EACN,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,YAAA;CAK7B;AAqKD,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA8OvC,YAAY;AACZ,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa;IACb,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,0BAA0B;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CAChC;AAID,yBAAyB;AACzB,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAK9D;AAqBD,qBAAqB;AACrB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,SAAK,GAAG,MAAM,CAI5F;AA+LD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAG3E;AAED,4BAA4B;AAC5B,qBAAa,eAAe;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,UAAU,EAAE,MAAM;IAW9B,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,UAAU,IAAI,KAAK,GAAG,IAAI,CAE7B;IAED,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM;CAIlC"}