@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 @@
1
+ {"version":3,"file":"dbk-backend.js","sourceRoot":"","sources":["../../../src/backend/dbk-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,667 @@
1
+ "use strict";
2
+ /**
3
+ * 原生 CE 后端 —— 作为客户端连接 Cheat Engine 官方的 `ceserver`。
4
+ *
5
+ * 协议来源:`Cheat Engine/ceserver/ceserver.h`(命令号与结构体定义)+
6
+ * `ceserver.c` 的 `DispatchCommand` 分支(收发顺序与字段宽度)。
7
+ *
8
+ * 线上格式(全部小端):每个请求 = 1 字节命令号 + 该命令的输入负载;
9
+ * 每条命令使用一个独立连接。
10
+ *
11
+ * ## 为什么这个后端是异步的
12
+ *
13
+ * 它必须走 socket,而 socket 本质异步。
14
+ * 曾经尝试把它包装成同步接口,两条路都**实测失败**:
15
+ *
16
+ * 1. 主线程里 `Promise + Atomics.wait` → 阻塞把事件循环卡死,
17
+ * socket 回调永不执行(`_probe/atomics-wait-io.js` 可复现);
18
+ * 2. 把 socket 挪到 worker 线程、主线程仍 `Atomics.wait` → **同样死锁**,
19
+ * 因为 worker 线程被 `Atomics.wait` 阻塞后,它自己的事件循环也停了,
20
+ * socket 回调一样不会跑(`_probe/mini-repro.js` 可复现)。
21
+ *
22
+ * 结论:`Atomics.wait` 与 socket I/O 无法在任何同一线程内共存。
23
+ * 因此本后端**诚实地暴露为异步 API**(方法返回 Promise),
24
+ * 而不是用子进程或忙轮询去伪造同步 —— 那只会把复杂度推移到别处。
25
+ *
26
+ * ## 与 SelfBackend 的一致性
27
+ *
28
+ * 方法名、参数、返回类型语义与 `SelfBackend` 完全一致,区别只有一个 `await`:
29
+ * ```ts
30
+ * const buf = proc.readMemory(addr, 16); // 自研后端:同步
31
+ * const buf = await proc.readMemoryAsync(addr, 16); // 原生 CE:异步
32
+ * ```
33
+ * (`Process` 上的 `*Async` 变体对两种后端都可用。)
34
+ *
35
+ * ## 已对齐的命令
36
+ * GETVERSION(0)、GETARCHITECTURE(21)、OPENPROCESS(3)、CLOSEHANDLE(7)、
37
+ * CREATETOOLHELP32SNAPSHOT(4)、PROCESS32FIRST(5)、PROCESS32NEXT(6)、
38
+ * VIRTUALQUERYEX(8)、READPROCESSMEMORY(9)、WRITEPROCESSMEMORY(10)、
39
+ * MODULE32FIRST(22)、MODULE32NEXT(23)、ALLOC(26)、FREE(27)、
40
+ * CHANGEMEMORYPROTECTION(36)
41
+ *
42
+ * ## 未实现(调用会抛错,不假装支持)
43
+ * 线程枚举(CMD_CREATETOOLHELP32SNAPSHOTEX 响应布局随版本变化)、
44
+ * 调试器相关命令、速度修改、管道、符号文件加载。
45
+ */
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.CeServerConnection = exports.NativeCeBackend = exports.CeReader = exports.CeWriter = exports.CESERVER_DEFAULT_PORT = exports.CESERVER_CMD = void 0;
48
+ const node_net_1 = require("node:net");
49
+ const self_backend_1 = require("./self-backend");
50
+ const types_1 = require("../types");
51
+ /* ------------------------------------------------------------------ *
52
+ * 协议常量(严格对齐 ceserver.h)
53
+ * ------------------------------------------------------------------ */
54
+ exports.CESERVER_CMD = {
55
+ GETVERSION: 0,
56
+ CLOSECONNECTION: 1,
57
+ TERMINATESERVER: 2,
58
+ OPENPROCESS: 3,
59
+ CREATETOOLHELP32SNAPSHOT: 4,
60
+ PROCESS32FIRST: 5,
61
+ PROCESS32NEXT: 6,
62
+ CLOSEHANDLE: 7,
63
+ VIRTUALQUERYEX: 8,
64
+ READPROCESSMEMORY: 9,
65
+ WRITEPROCESSMEMORY: 10,
66
+ STARTDEBUG: 11,
67
+ STOPDEBUG: 12,
68
+ WAITFORDEBUGEVENT: 13,
69
+ CONTINUEFROMDEBUGEVENT: 14,
70
+ SETBREAKPOINT: 15,
71
+ REMOVEBREAKPOINT: 16,
72
+ SUSPENDTHREAD: 17,
73
+ RESUMETHREAD: 18,
74
+ GETTHREADCONTEXT: 19,
75
+ SETTHREADCONTEXT: 20,
76
+ GETARCHITECTURE: 21,
77
+ MODULE32FIRST: 22,
78
+ MODULE32NEXT: 23,
79
+ GETSYMBOLLISTFROMFILE: 24,
80
+ LOADEXTENSION: 25,
81
+ ALLOC: 26,
82
+ FREE: 27,
83
+ CREATETHREAD: 28,
84
+ LOADMODULE: 29,
85
+ SPEEDHACK_SETSPEED: 30,
86
+ VIRTUALQUERYEXFULL: 31,
87
+ GETREGIONINFO: 32,
88
+ GETABI: 33,
89
+ SET_CONNECTION_NAME: 34,
90
+ CREATETOOLHELP32SNAPSHOTEX: 35,
91
+ CHANGEMEMORYPROTECTION: 36,
92
+ GETOPTIONS: 37,
93
+ GETOPTIONVALUE: 38,
94
+ SETOPTIONVALUE: 39,
95
+ PTRACE_MMAP: 40,
96
+ OPENNAMEDPIPE: 41,
97
+ PIPEREAD: 42,
98
+ PIPEWRITE: 43,
99
+ GETCESERVERPATH: 44,
100
+ ISANDROID: 45,
101
+ LOADMODULEEX: 46,
102
+ SETCURRENTPATH: 47,
103
+ GETCURRENTPATH: 48,
104
+ ENUMFILES: 49,
105
+ GETFILEPERMISSIONS: 50,
106
+ SETFILEPERMISSIONS: 51,
107
+ GETFILE: 52,
108
+ PUTFILE: 53,
109
+ CREATEDIR: 54,
110
+ DELETEFILE: 55,
111
+ AOBSCAN: 200,
112
+ COMMANDLIST2: 255,
113
+ };
114
+ const TH32CS_SNAPPROCESS = 0x00000002;
115
+ const TH32CS_SNAPMODULE = 0x00000008;
116
+ /** CE 官方 ceserver 的默认端口(ceserver.c 的 PORT 默认值) */
117
+ exports.CESERVER_DEFAULT_PORT = 52736;
118
+ /* ------------------------------------------------------------------ *
119
+ * 组帧辅助
120
+ * ------------------------------------------------------------------ */
121
+ /** 累积式小端写入器 */
122
+ class CeWriter {
123
+ parts = [];
124
+ u8(v) {
125
+ const b = Buffer.alloc(1);
126
+ b.writeUInt8(v & 0xff, 0);
127
+ this.parts.push(b);
128
+ return this;
129
+ }
130
+ i32(v) {
131
+ const b = Buffer.alloc(4);
132
+ b.writeInt32LE(v | 0, 0);
133
+ this.parts.push(b);
134
+ return this;
135
+ }
136
+ u32(v) {
137
+ const b = Buffer.alloc(4);
138
+ b.writeUInt32LE(v >>> 0, 0);
139
+ this.parts.push(b);
140
+ return this;
141
+ }
142
+ i64(v) {
143
+ const b = Buffer.alloc(8);
144
+ b.writeBigInt64LE(BigInt.asIntN(64, v), 0);
145
+ this.parts.push(b);
146
+ return this;
147
+ }
148
+ u64(v) {
149
+ const b = Buffer.alloc(8);
150
+ b.writeBigUInt64LE(BigInt.asUintN(64, v), 0);
151
+ this.parts.push(b);
152
+ return this;
153
+ }
154
+ bytes(b) {
155
+ this.parts.push(b);
156
+ return this;
157
+ }
158
+ build() {
159
+ return Buffer.concat(this.parts);
160
+ }
161
+ }
162
+ exports.CeWriter = CeWriter;
163
+ /** 顺序小端读取器 */
164
+ class CeReader {
165
+ buf;
166
+ pos = 0;
167
+ constructor(buf) {
168
+ this.buf = buf;
169
+ }
170
+ get remaining() {
171
+ return this.buf.length - this.pos;
172
+ }
173
+ u8() {
174
+ const v = this.buf.readUInt8(this.pos);
175
+ this.pos += 1;
176
+ return v;
177
+ }
178
+ i32() {
179
+ const v = this.buf.readInt32LE(this.pos);
180
+ this.pos += 4;
181
+ return v;
182
+ }
183
+ u32() {
184
+ const v = this.buf.readUInt32LE(this.pos);
185
+ this.pos += 4;
186
+ return v;
187
+ }
188
+ i64() {
189
+ const v = this.buf.readBigInt64LE(this.pos);
190
+ this.pos += 8;
191
+ return v;
192
+ }
193
+ u64() {
194
+ const v = this.buf.readBigUInt64LE(this.pos);
195
+ this.pos += 8;
196
+ return v;
197
+ }
198
+ bytes(n) {
199
+ const v = this.buf.subarray(this.pos, this.pos + n);
200
+ this.pos += n;
201
+ return v;
202
+ }
203
+ skip(n) {
204
+ this.pos += n;
205
+ }
206
+ }
207
+ exports.CeReader = CeReader;
208
+ /**
209
+ * 原生 CE 后端(通过 ceserver 的 TCP 协议)。
210
+ *
211
+ * 所有方法都是**异步**的(返回 Promise),因为 socket 本质异步 —— 原因见文件头注释。
212
+ *
213
+ * ```ts
214
+ * const backend = new NativeCeBackend({ host: '127.0.0.1', port: 52736 });
215
+ * const h = await backend.openProcess(pid);
216
+ * const buf = await backend.readProcessMemory(h, addr, 64);
217
+ * await backend.dispose();
218
+ * ```
219
+ */
220
+ class NativeCeBackend {
221
+ name = 'native-ce';
222
+ capabilities = {
223
+ // 本后端是异步的(socket 决定),因此 sync = false
224
+ sync: false,
225
+ enumerateProcesses: true,
226
+ queryRegions: true,
227
+ queryModules: true,
228
+ queryThreads: false,
229
+ suspendThreads: false,
230
+ allocateMemory: true,
231
+ changeProtection: true,
232
+ local: false,
233
+ requiresServer: true,
234
+ };
235
+ host;
236
+ port;
237
+ timeoutMs;
238
+ conn;
239
+ disposed = false;
240
+ /** handle id -> ceserver 侧 HANDLE */
241
+ nextHandleId = 1;
242
+ handles = new Map();
243
+ version = null;
244
+ constructor(options = {}) {
245
+ this.host = options.host ?? '127.0.0.1';
246
+ this.port = options.port ?? exports.CESERVER_DEFAULT_PORT;
247
+ this.timeoutMs = options.timeoutMs ?? 15000;
248
+ this.conn = new CeServerConnection(this.host, this.port, this.timeoutMs);
249
+ }
250
+ /** 后端描述,用于日志 */
251
+ describe() {
252
+ return `NativeCeBackend(${this.host}:${this.port})`;
253
+ }
254
+ /* ---------------------------------------------------------------- *
255
+ * 版本
256
+ * ---------------------------------------------------------------- */
257
+ /**
258
+ * 读取 ceserver 版本字符串(CMD_GETVERSION,结果缓存)。
259
+ *
260
+ * 响应布局:`{ int32 version; uint8 stringsize; char versionstring[stringsize]; }`
261
+ * 分两轮读(先读 5 字节头拿长度,再读全)—— 因为 ceserver 每条命令一个连接,
262
+ * 无法在一条连接上续读。
263
+ */
264
+ async getVersion() {
265
+ if (this.version !== null)
266
+ return this.version;
267
+ const head = await this.conn.exchange('GETVERSION', Buffer.from([exports.CESERVER_CMD.GETVERSION]), 5);
268
+ const hr = new CeReader(head);
269
+ hr.i32();
270
+ const nameLen = hr.u8();
271
+ if (nameLen <= 0) {
272
+ this.version = '';
273
+ return this.version;
274
+ }
275
+ const full = await this.conn.exchange('GETVERSION', Buffer.from([exports.CESERVER_CMD.GETVERSION]), 5 + nameLen);
276
+ this.version = Buffer.from(full.subarray(5, 5 + nameLen)).toString('utf8');
277
+ return this.version;
278
+ }
279
+ /* ---------------------------------------------------------------- *
280
+ * 进程枚举
281
+ * ---------------------------------------------------------------- */
282
+ async listProcesses() {
283
+ const snapHandle = new CeReader(await this.exchange('CREATETOOLHELP32SNAPSHOT', new CeWriter()
284
+ .u8(exports.CESERVER_CMD.CREATETOOLHELP32SNAPSHOT)
285
+ .u32(TH32CS_SNAPPROCESS)
286
+ .u32(0)
287
+ .build(), 4)).i32();
288
+ if (snapHandle <= 0) {
289
+ throw new Error('ceserver 创建进程快照失败(返回无效句柄)');
290
+ }
291
+ const out = [];
292
+ try {
293
+ // CeProcessEntry = { int result; int pid; int processnamesize; char name[] }
294
+ for (;;) {
295
+ const frame = new CeWriter().u8(exports.CESERVER_CMD.PROCESS32NEXT).i32(snapHandle).build();
296
+ const head = await this.exchange('PROCESS32NEXT', frame, 12);
297
+ const r = new CeReader(head);
298
+ const result = r.i32();
299
+ if (result === 0)
300
+ break;
301
+ const pid = r.i32();
302
+ const nameLen = r.i32();
303
+ let name = '';
304
+ if (nameLen > 0) {
305
+ const full = await this.exchange('PROCESS32NEXT', frame, 12 + nameLen);
306
+ name = Buffer.from(full.subarray(12, 12 + nameLen)).toString('utf8');
307
+ }
308
+ out.push({
309
+ pid,
310
+ name: name.replace(/\0.*$/, ''),
311
+ parentPid: 0,
312
+ threadCount: 0,
313
+ });
314
+ }
315
+ }
316
+ finally {
317
+ await this.closeServerHandle(snapHandle);
318
+ }
319
+ return out;
320
+ }
321
+ /* ---------------------------------------------------------------- *
322
+ * 句柄
323
+ * ---------------------------------------------------------------- */
324
+ async openProcess(pid) {
325
+ const serverHandle = new CeReader(await this.exchange('OPENPROCESS', new CeWriter().u8(exports.CESERVER_CMD.OPENPROCESS).i32(pid).build(), 4)).i32();
326
+ if (serverHandle === 0) {
327
+ throw new Error(`ceserver 无法打开进程 ${pid}(进程不存在,或服务端权限不足;` +
328
+ `若目标是受保护进程,请以管理员身份运行 ceserver)`);
329
+ }
330
+ const id = this.nextHandleId++;
331
+ this.handles.set(id, serverHandle);
332
+ return { id, pid };
333
+ }
334
+ async closeProcess(handle) {
335
+ const h = this.handles.get(handle.id);
336
+ if (h === undefined)
337
+ return;
338
+ this.handles.delete(handle.id);
339
+ await this.closeServerHandle(h);
340
+ }
341
+ async closeServerHandle(serverHandle) {
342
+ try {
343
+ await this.exchange('CLOSEHANDLE', new CeWriter().u8(exports.CESERVER_CMD.CLOSEHANDLE).i32(serverHandle).build(), 4);
344
+ }
345
+ catch {
346
+ // 服务端可能已断开,忽略
347
+ }
348
+ }
349
+ serverHandle(handle) {
350
+ const h = this.handles.get(handle.id);
351
+ if (h === undefined)
352
+ throw new Error(`进程 ${handle.pid} 的句柄已关闭`);
353
+ return h;
354
+ }
355
+ /* ---------------------------------------------------------------- *
356
+ * 内存区域
357
+ * ---------------------------------------------------------------- */
358
+ async queryRegions(handle, filter = {}) {
359
+ const h = this.serverHandle(handle);
360
+ const all = [];
361
+ const maxAddr = filter.maxAddress ?? 0x7fffffffffffn;
362
+ // CeVirtualQueryExInput = { int handle; uint64 baseaddress; } → 12 字节
363
+ // CeVirtualQueryExOutput = { uint8 result; uint32 protection; uint32 type;
364
+ // uint64 baseaddress; uint64 size; } → 25 字节
365
+ let addr = 0n;
366
+ for (;;) {
367
+ if (addr >= maxAddr)
368
+ break;
369
+ const res = await this.exchange('VIRTUALQUERYEX', new CeWriter().u8(exports.CESERVER_CMD.VIRTUALQUERYEX).i32(h).u64(addr).build(), 25);
370
+ const r = new CeReader(res);
371
+ const result = r.u8();
372
+ if (result === 0)
373
+ break;
374
+ const protection = r.u32();
375
+ const type = r.u32();
376
+ const base = r.u64();
377
+ const size = r.u64();
378
+ if (size <= 0n)
379
+ break;
380
+ all.push({
381
+ baseAddress: base,
382
+ regionSize: size,
383
+ state: types_1.MEM_COMMIT,
384
+ protect: protection,
385
+ type,
386
+ });
387
+ const next = base + size;
388
+ if (next <= addr)
389
+ break;
390
+ addr = next;
391
+ }
392
+ if (filter.includeFree)
393
+ return all;
394
+ return (0, self_backend_1.filterScanRegions)(all, filter);
395
+ }
396
+ /* ---------------------------------------------------------------- *
397
+ * 读写内存
398
+ * ---------------------------------------------------------------- */
399
+ async readProcessMemory(handle, address, size) {
400
+ if (size <= 0)
401
+ return Buffer.alloc(0);
402
+ const h = this.serverHandle(handle);
403
+ // CeReadProcessMemoryInput = { uint32 handle; uint64 address; uint32 size; uint8 compress; }
404
+ // 响应 = { int read; byte data[read]; }
405
+ // compress 固定 0,避免依赖服务端压缩实现。
406
+ const frame = new CeWriter()
407
+ .u8(exports.CESERVER_CMD.READPROCESSMEMORY)
408
+ .u32(h)
409
+ .u64(address)
410
+ .u32(size)
411
+ .u8(0)
412
+ .build();
413
+ const head = await this.exchange('READPROCESSMEMORY', frame, 4);
414
+ const read = new CeReader(head).i32();
415
+ if (read <= 0)
416
+ return Buffer.alloc(0);
417
+ const body = await this.exchange('READPROCESSMEMORY', frame, 4 + read);
418
+ return Buffer.from(body.subarray(4, 4 + read));
419
+ }
420
+ async writeProcessMemory(handle, address, data, fixProtection = true) {
421
+ const h = this.serverHandle(handle);
422
+ if (fixProtection) {
423
+ try {
424
+ await this.changeProtection(handle, address, data.length, 0x04);
425
+ }
426
+ catch {
427
+ /* 部分服务端不支持改保护,忽略 */
428
+ }
429
+ }
430
+ // CeWriteProcessMemoryInput = { int32 handle; int64 address; int32 size; } + data[size]
431
+ const frame = new CeWriter()
432
+ .u8(exports.CESERVER_CMD.WRITEPROCESSMEMORY)
433
+ .i32(h)
434
+ .i64(address)
435
+ .i32(data.length)
436
+ .bytes(data)
437
+ .build();
438
+ const written = new CeReader(await this.exchange('WRITEPROCESSMEMORY', frame, 4)).i32();
439
+ if (written !== data.length) {
440
+ throw new Error(`ceserver 写入不完整:请求 ${data.length} 字节,实际写入 ${written} 字节`);
441
+ }
442
+ return written;
443
+ }
444
+ /* ---------------------------------------------------------------- *
445
+ * 模块
446
+ * ---------------------------------------------------------------- */
447
+ async queryModules(handle) {
448
+ const snapHandle = new CeReader(await this.exchange('CREATETOOLHELP32SNAPSHOT', new CeWriter()
449
+ .u8(exports.CESERVER_CMD.CREATETOOLHELP32SNAPSHOT)
450
+ .u32(TH32CS_SNAPMODULE)
451
+ .u32(handle.pid)
452
+ .build(), 4)).i32();
453
+ if (snapHandle <= 0)
454
+ return [];
455
+ const out = [];
456
+ try {
457
+ for (;;) {
458
+ // CeModuleEntry 固定头 = { int32 result; int64 modulebase; int32 modulepart;
459
+ // int32 modulesize; uint32 modulefileoffset; int32 modulenamesize; } → 28 字节
460
+ const frame = new CeWriter().u8(exports.CESERVER_CMD.MODULE32NEXT).i32(snapHandle).build();
461
+ const head = await this.exchange('MODULE32NEXT', frame, 28);
462
+ const r = new CeReader(head);
463
+ const result = r.i32();
464
+ if (result === 0)
465
+ break;
466
+ const moduleBase = r.i64();
467
+ r.i32(); // modulepart
468
+ const moduleSize = r.i32();
469
+ r.u32(); // modulefileoffset
470
+ const nameLen = r.i32();
471
+ let name = '';
472
+ if (nameLen > 0) {
473
+ const full = await this.exchange('MODULE32NEXT', frame, 28 + nameLen);
474
+ name = Buffer.from(full.subarray(28, 28 + nameLen)).toString('utf8');
475
+ }
476
+ const clean = name.replace(/\0.*$/, '');
477
+ out.push({
478
+ name: clean,
479
+ // ceserver 不回报完整路径,用名字代替
480
+ path: clean,
481
+ baseAddress: moduleBase,
482
+ size: moduleSize,
483
+ });
484
+ }
485
+ }
486
+ finally {
487
+ await this.closeServerHandle(snapHandle);
488
+ }
489
+ return out;
490
+ }
491
+ /* ---------------------------------------------------------------- *
492
+ * 分配 / 保护
493
+ * ---------------------------------------------------------------- */
494
+ async allocate(handle, size, protect = 0x04, preferred = 0n) {
495
+ const h = this.serverHandle(handle);
496
+ // CeAllocInput = { HANDLE hProcess; uint64 preferedBase; uint32 size; uint32 windowsprotection; }
497
+ const frame = new CeWriter()
498
+ .u8(exports.CESERVER_CMD.ALLOC)
499
+ .u64(BigInt(h))
500
+ .u64(preferred)
501
+ .u32(size)
502
+ .u32(protect)
503
+ .build();
504
+ const addr = new CeReader(await this.exchange('ALLOC', frame, 8)).u64();
505
+ if (addr === 0n)
506
+ throw new Error('ceserver 分配内存失败(返回地址 0)');
507
+ return addr;
508
+ }
509
+ async free(handle, address) {
510
+ const h = this.serverHandle(handle);
511
+ const frame = new CeWriter()
512
+ .u8(exports.CESERVER_CMD.FREE)
513
+ .u64(BigInt(h))
514
+ .u64(address)
515
+ .u32(0)
516
+ .build();
517
+ const result = new CeReader(await this.exchange('FREE', frame, 4)).u32();
518
+ if (result === 0)
519
+ throw new Error('ceserver 释放内存失败');
520
+ }
521
+ async changeProtection(handle, address, size, newProtect) {
522
+ const h = this.serverHandle(handle);
523
+ const frame = new CeWriter()
524
+ .u8(exports.CESERVER_CMD.CHANGEMEMORYPROTECTION)
525
+ .u64(BigInt(h))
526
+ .u64(address)
527
+ .u32(size)
528
+ .u32(newProtect)
529
+ .build();
530
+ // 复用 CeVirtualQueryExOutput 的布局:result(u8) protection(u32) type(u32) base(u64) size(u64)
531
+ const res = await this.exchange('CHANGEMEMORYPROTECTION', frame, 25);
532
+ const r = new CeReader(res);
533
+ const result = r.u8();
534
+ if (result === 0)
535
+ throw new Error('ceserver 修改内存保护失败');
536
+ return r.u32();
537
+ }
538
+ /* ---------------------------------------------------------------- *
539
+ * 不支持的能力
540
+ * ---------------------------------------------------------------- */
541
+ queryThreads() {
542
+ throw new Error('NativeCeBackend 未实现线程枚举:ceserver 的线程枚举走 ' +
543
+ 'CMD_CREATETOOLHELP32SNAPSHOTEX(35),其响应布局随版本变化,' +
544
+ '为可靠性起见暂不实现(capabilities.queryThreads 已声明为 false)。');
545
+ }
546
+ isWow64() {
547
+ // ceserver 的 CMD_GETARCHITECTURE 不区分"目标进程位数"与"服务端位数",不做猜测
548
+ return false;
549
+ }
550
+ /** 发送一帧、读回 expectedBytes 字节 */
551
+ exchange(label, frame, expectedBytes) {
552
+ return this.conn.exchange(label, frame, expectedBytes);
553
+ }
554
+ /** 释放后端资源 */
555
+ async dispose() {
556
+ if (this.disposed)
557
+ return;
558
+ this.disposed = true;
559
+ // 尽力关闭远端句柄
560
+ for (const h of [...this.handles.values()])
561
+ await this.closeServerHandle(h);
562
+ this.handles.clear();
563
+ }
564
+ }
565
+ exports.NativeCeBackend = NativeCeBackend;
566
+ /* ------------------------------------------------------------------ *
567
+ * 连接封装
568
+ * ------------------------------------------------------------------ */
569
+ /**
570
+ * ceserver 的 TCP 通道。
571
+ *
572
+ * 每条命令使用一个独立连接:服务端 `DispatchCommand` 处理完一条命令即关闭,
573
+ * 而且"每条命令一个连接"能让"先读计数、再读数据"这类两步读取天然成立
574
+ * (两边各自重新发一次命令即可)。
575
+ */
576
+ class CeServerConnection {
577
+ host;
578
+ port;
579
+ timeoutMs;
580
+ constructor(host, port, timeoutMs = 15000) {
581
+ this.host = host;
582
+ this.port = port;
583
+ this.timeoutMs = timeoutMs;
584
+ }
585
+ /** 发送一帧并读回 expectedBytes 字节 */
586
+ async exchange(label, frame, expectedBytes) {
587
+ const socket = await this.connect();
588
+ try {
589
+ await this.write(socket, frame);
590
+ if (expectedBytes <= 0)
591
+ return Buffer.alloc(0);
592
+ return await this.readExactly(socket, expectedBytes, label);
593
+ }
594
+ finally {
595
+ socket.destroy();
596
+ }
597
+ }
598
+ connect() {
599
+ return new Promise((resolve, reject) => {
600
+ const socket = (0, node_net_1.connect)({ host: this.host, port: this.port });
601
+ const timer = setTimeout(() => {
602
+ socket.destroy();
603
+ reject(new Error(`连接 ceserver 超时(${this.host}:${this.port})`));
604
+ }, this.timeoutMs);
605
+ socket.once('connect', () => {
606
+ clearTimeout(timer);
607
+ socket.setNoDelay(true);
608
+ resolve(socket);
609
+ });
610
+ socket.once('error', (e) => {
611
+ clearTimeout(timer);
612
+ reject(new Error(`无法连接 ceserver(${this.host}:${this.port}):${e.message}。` +
613
+ `请先启动 ceserver(CE 源码 Cheat Engine/ceserver 的编译产物,或官方发行版自带)。`));
614
+ });
615
+ });
616
+ }
617
+ write(socket, data) {
618
+ return new Promise((resolve, reject) => {
619
+ socket.write(data, (err) => (err ? reject(err) : resolve()));
620
+ });
621
+ }
622
+ readExactly(socket, n, label) {
623
+ return new Promise((resolve, reject) => {
624
+ const chunks = [];
625
+ let got = 0;
626
+ let settled = false;
627
+ const cleanup = () => {
628
+ clearTimeout(timer);
629
+ socket.off('data', onData);
630
+ socket.off('end', onEnd);
631
+ socket.off('error', onError);
632
+ };
633
+ const settle = (fn) => {
634
+ if (settled)
635
+ return;
636
+ settled = true;
637
+ cleanup();
638
+ fn();
639
+ };
640
+ const timer = setTimeout(() => {
641
+ settle(() => reject(new Error(`ceserver 命令 "${label}" 响应超时(期望 ${n} 字节,已收到 ${got} 字节)`)));
642
+ }, this.timeoutMs);
643
+ const onData = (chunk) => {
644
+ chunks.push(chunk);
645
+ got += chunk.length;
646
+ if (got >= n) {
647
+ const all = Buffer.concat(chunks);
648
+ settle(() => resolve(all.length === n ? all : all.subarray(0, n)));
649
+ }
650
+ };
651
+ const onEnd = () => {
652
+ settle(() => {
653
+ if (got >= n)
654
+ resolve(Buffer.concat(chunks).subarray(0, n));
655
+ else
656
+ reject(new Error(`ceserver 命令 "${label}" 提前关闭连接(期望 ${n} 字节,收到 ${got} 字节)`));
657
+ });
658
+ };
659
+ const onError = (e) => settle(() => reject(e));
660
+ socket.on('data', onData);
661
+ socket.once('end', onEnd);
662
+ socket.once('error', onError);
663
+ });
664
+ }
665
+ }
666
+ exports.CeServerConnection = CeServerConnection;
667
+ //# sourceMappingURL=native-ce-backend.js.map