@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.
- package/PORT-SCOPE.md +169 -0
- package/README.md +451 -2
- package/dist/cjs/addr/expression.js +650 -0
- package/dist/cjs/addr/expression.js.map +1 -0
- package/dist/cjs/addresslist/memory-record.js +612 -0
- package/dist/cjs/addresslist/memory-record.js.map +1 -0
- package/dist/cjs/asm/assembler.js +354 -0
- package/dist/cjs/asm/assembler.js.map +1 -0
- package/dist/cjs/asm/autoassembler-directives.js +362 -0
- package/dist/cjs/asm/autoassembler-directives.js.map +1 -0
- package/dist/cjs/asm/autoassembler.js +2163 -0
- package/dist/cjs/asm/autoassembler.js.map +1 -0
- package/dist/cjs/asm/backend.js +394 -0
- package/dist/cjs/asm/backend.js.map +1 -0
- package/dist/cjs/asm/disassembler.js +715 -0
- package/dist/cjs/asm/disassembler.js.map +1 -0
- package/dist/cjs/backend/dbk-backend.js +683 -0
- package/dist/cjs/backend/dbk-backend.js.map +1 -0
- package/dist/cjs/backend/native-ce-backend.js +667 -0
- package/dist/cjs/backend/native-ce-backend.js.map +1 -0
- package/dist/cjs/backend/self-backend.js +449 -0
- package/dist/cjs/backend/self-backend.js.map +1 -0
- package/dist/cjs/backend/types.js +48 -0
- package/dist/cjs/backend/types.js.map +1 -0
- package/dist/cjs/cheattable/ct-format.js +533 -0
- package/dist/cjs/cheattable/ct-format.js.map +1 -0
- package/dist/cjs/index.js +219 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lua/aa.js +230 -0
- package/dist/cjs/lua/aa.js.map +1 -0
- package/dist/cjs/lua/addressing.js +118 -0
- package/dist/cjs/lua/addressing.js.map +1 -0
- package/dist/cjs/lua/api.js +736 -0
- package/dist/cjs/lua/api.js.map +1 -0
- package/dist/cjs/lua/asm.js +220 -0
- package/dist/cjs/lua/asm.js.map +1 -0
- package/dist/cjs/lua/bridge.js +526 -0
- package/dist/cjs/lua/bridge.js.map +1 -0
- package/dist/cjs/lua/marshal.js +562 -0
- package/dist/cjs/lua/marshal.js.map +1 -0
- package/dist/cjs/lua/memory.js +213 -0
- package/dist/cjs/lua/memory.js.map +1 -0
- package/dist/cjs/lua/objects.js +1070 -0
- package/dist/cjs/lua/objects.js.map +1 -0
- package/dist/cjs/lua/scan.js +543 -0
- package/dist/cjs/lua/scan.js.map +1 -0
- package/dist/cjs/lua/types.js +103 -0
- package/dist/cjs/lua/types.js.map +1 -0
- package/dist/cjs/scanner/matcher.js +781 -0
- package/dist/cjs/scanner/matcher.js.map +1 -0
- package/dist/cjs/scanner/pointer-scan.js +546 -0
- package/dist/cjs/scanner/pointer-scan.js.map +1 -0
- package/dist/cjs/scanner/scanner.js +513 -0
- package/dist/cjs/scanner/scanner.js.map +1 -0
- package/dist/cjs/scanner/shared-layout.js +207 -0
- package/dist/cjs/scanner/shared-layout.js.map +1 -0
- package/dist/cjs/types.js +190 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/value-codec.js +515 -0
- package/dist/cjs/value-codec.js.map +1 -0
- package/dist/cjs/win/process.js +475 -0
- package/dist/cjs/win/process.js.map +1 -0
- package/dist/cjs/win/scan-worker.js +84 -0
- package/dist/cjs/win/scan-worker.js.map +1 -0
- package/dist/cjs/win/winapi.js +403 -0
- package/dist/cjs/win/winapi.js.map +1 -0
- package/dist/types/addr/expression.d.ts +98 -0
- package/dist/types/addr/expression.d.ts.map +1 -0
- package/dist/types/addresslist/memory-record.d.ts +218 -0
- package/dist/types/addresslist/memory-record.d.ts.map +1 -0
- package/dist/types/asm/assembler.d.ts +106 -0
- package/dist/types/asm/assembler.d.ts.map +1 -0
- package/dist/types/asm/autoassembler-directives.d.ts +118 -0
- package/dist/types/asm/autoassembler-directives.d.ts.map +1 -0
- package/dist/types/asm/autoassembler.d.ts +434 -0
- package/dist/types/asm/autoassembler.d.ts.map +1 -0
- package/dist/types/asm/backend.d.ts +167 -0
- package/dist/types/asm/backend.d.ts.map +1 -0
- package/dist/types/asm/disassembler.d.ts +194 -0
- package/dist/types/asm/disassembler.d.ts.map +1 -0
- package/dist/types/backend/dbk-backend.d.ts +353 -0
- package/dist/types/backend/dbk-backend.d.ts.map +1 -0
- package/dist/types/backend/native-ce-backend.d.ts +213 -0
- package/dist/types/backend/native-ce-backend.d.ts.map +1 -0
- package/dist/types/backend/self-backend.d.ts +64 -0
- package/dist/types/backend/self-backend.d.ts.map +1 -0
- package/dist/types/backend/types.d.ts +176 -0
- package/dist/types/backend/types.d.ts.map +1 -0
- package/dist/types/cheattable/ct-format.d.ts +100 -0
- package/dist/types/cheattable/ct-format.d.ts.map +1 -0
- package/dist/types/index.d.ts +54 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lua/aa.d.ts +107 -0
- package/dist/types/lua/aa.d.ts.map +1 -0
- package/dist/types/lua/addressing.d.ts +41 -0
- package/dist/types/lua/addressing.d.ts.map +1 -0
- package/dist/types/lua/api.d.ts +46 -0
- package/dist/types/lua/api.d.ts.map +1 -0
- package/dist/types/lua/asm.d.ts +42 -0
- package/dist/types/lua/asm.d.ts.map +1 -0
- package/dist/types/lua/bridge.d.ts +129 -0
- package/dist/types/lua/bridge.d.ts.map +1 -0
- package/dist/types/lua/marshal.d.ts +244 -0
- package/dist/types/lua/marshal.d.ts.map +1 -0
- package/dist/types/lua/memory.d.ts +61 -0
- package/dist/types/lua/memory.d.ts.map +1 -0
- package/dist/types/lua/objects.d.ts +210 -0
- package/dist/types/lua/objects.d.ts.map +1 -0
- package/dist/types/lua/scan.d.ts +106 -0
- package/dist/types/lua/scan.d.ts.map +1 -0
- package/dist/types/lua/types.d.ts +146 -0
- package/dist/types/lua/types.d.ts.map +1 -0
- package/dist/types/scanner/matcher.d.ts +122 -0
- package/dist/types/scanner/matcher.d.ts.map +1 -0
- package/dist/types/scanner/pointer-scan.d.ts +187 -0
- package/dist/types/scanner/pointer-scan.d.ts.map +1 -0
- package/dist/types/scanner/scanner.d.ts +150 -0
- package/dist/types/scanner/scanner.d.ts.map +1 -0
- package/dist/types/scanner/shared-layout.d.ts +96 -0
- package/dist/types/scanner/shared-layout.d.ts.map +1 -0
- package/dist/types/types.d.ts +239 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/value-codec.d.ts +134 -0
- package/dist/types/value-codec.d.ts.map +1 -0
- package/dist/types/win/process.d.ts +190 -0
- package/dist/types/win/process.d.ts.map +1 -0
- package/dist/types/win/scan-worker.d.ts +51 -0
- package/dist/types/win/scan-worker.d.ts.map +1 -0
- package/dist/types/win/winapi.d.ts +144 -0
- package/dist/types/win/winapi.d.ts.map +1 -0
- package/docs/assembler.md +371 -0
- package/docs/autoassembler.md +423 -0
- package/docs/backend-dbk.md +305 -0
- package/docs/backends.md +273 -0
- package/docs/evidence/atomics-wait-io.js +20 -0
- package/docs/evidence/mini-repro.js +98 -0
- package/docs/lua-api.md +718 -0
- 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"}
|