@guardbee/mcp-reverse-shield 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 (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -2
  3. package/TR.md +114 -0
  4. package/ZH.md +61 -0
  5. package/dist/__tests__/android.test.d.ts +2 -0
  6. package/dist/__tests__/android.test.d.ts.map +1 -0
  7. package/dist/__tests__/android.test.js +114 -0
  8. package/dist/__tests__/android.test.js.map +1 -0
  9. package/dist/__tests__/electron.test.d.ts +2 -0
  10. package/dist/__tests__/electron.test.d.ts.map +1 -0
  11. package/dist/__tests__/electron.test.js +128 -0
  12. package/dist/__tests__/electron.test.js.map +1 -0
  13. package/dist/__tests__/live.test.d.ts +2 -0
  14. package/dist/__tests__/live.test.d.ts.map +1 -0
  15. package/dist/__tests__/live.test.js +67 -0
  16. package/dist/__tests__/live.test.js.map +1 -0
  17. package/dist/__tests__/native.test.d.ts +2 -0
  18. package/dist/__tests__/native.test.d.ts.map +1 -0
  19. package/dist/__tests__/native.test.js +111 -0
  20. package/dist/__tests__/native.test.js.map +1 -0
  21. package/dist/__tests__/scanner.test.d.ts +2 -0
  22. package/dist/__tests__/scanner.test.d.ts.map +1 -0
  23. package/dist/__tests__/scanner.test.js +127 -0
  24. package/dist/__tests__/scanner.test.js.map +1 -0
  25. package/dist/__tests__/testFixtures.d.ts +61 -0
  26. package/dist/__tests__/testFixtures.d.ts.map +1 -0
  27. package/dist/__tests__/testFixtures.js +416 -0
  28. package/dist/__tests__/testFixtures.js.map +1 -0
  29. package/dist/__tests__/web.test.d.ts +2 -0
  30. package/dist/__tests__/web.test.d.ts.map +1 -0
  31. package/dist/__tests__/web.test.js +156 -0
  32. package/dist/__tests__/web.test.js.map +1 -0
  33. package/dist/apk.d.ts +9 -0
  34. package/dist/apk.d.ts.map +1 -0
  35. package/dist/apk.js +132 -0
  36. package/dist/apk.js.map +1 -0
  37. package/dist/asar.d.ts +10 -0
  38. package/dist/asar.d.ts.map +1 -0
  39. package/dist/asar.js +73 -0
  40. package/dist/asar.js.map +1 -0
  41. package/dist/axml.d.ts +20 -0
  42. package/dist/axml.d.ts.map +1 -0
  43. package/dist/axml.js +104 -0
  44. package/dist/axml.js.map +1 -0
  45. package/dist/cli.d.ts +3 -0
  46. package/dist/cli.d.ts.map +1 -0
  47. package/dist/cli.js +172 -0
  48. package/dist/cli.js.map +1 -0
  49. package/dist/config.d.ts +8 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +102 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/dex.d.ts +16 -0
  54. package/dist/dex.d.ts.map +1 -0
  55. package/dist/dex.js +63 -0
  56. package/dist/dex.js.map +1 -0
  57. package/dist/electron.d.ts +26 -0
  58. package/dist/electron.d.ts.map +1 -0
  59. package/dist/electron.js +146 -0
  60. package/dist/electron.js.map +1 -0
  61. package/dist/finding.d.ts +30 -0
  62. package/dist/finding.d.ts.map +1 -0
  63. package/dist/finding.js +38 -0
  64. package/dist/finding.js.map +1 -0
  65. package/dist/fsutil.d.ts +20 -0
  66. package/dist/fsutil.d.ts.map +1 -0
  67. package/dist/fsutil.js +80 -0
  68. package/dist/fsutil.js.map +1 -0
  69. package/dist/index.d.ts +16 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +12 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/live.d.ts +14 -0
  74. package/dist/live.d.ts.map +1 -0
  75. package/dist/live.js +144 -0
  76. package/dist/live.js.map +1 -0
  77. package/dist/native.d.ts +18 -0
  78. package/dist/native.d.ts.map +1 -0
  79. package/dist/native.js +411 -0
  80. package/dist/native.js.map +1 -0
  81. package/dist/rules.d.ts +22 -0
  82. package/dist/rules.d.ts.map +1 -0
  83. package/dist/rules.js +354 -0
  84. package/dist/rules.js.map +1 -0
  85. package/dist/sarif.d.ts +3 -0
  86. package/dist/sarif.d.ts.map +1 -0
  87. package/dist/sarif.js +60 -0
  88. package/dist/sarif.js.map +1 -0
  89. package/dist/scanner.d.ts +27 -0
  90. package/dist/scanner.d.ts.map +1 -0
  91. package/dist/scanner.js +169 -0
  92. package/dist/scanner.js.map +1 -0
  93. package/dist/server.d.ts +7 -0
  94. package/dist/server.d.ts.map +1 -0
  95. package/dist/server.js +88 -0
  96. package/dist/server.js.map +1 -0
  97. package/dist/web.d.ts +56 -0
  98. package/dist/web.d.ts.map +1 -0
  99. package/dist/web.js +301 -0
  100. package/dist/web.js.map +1 -0
  101. package/dist/zip.d.ts +21 -0
  102. package/dist/zip.d.ts.map +1 -0
  103. package/dist/zip.js +112 -0
  104. package/dist/zip.js.map +1 -0
  105. package/package.json +52 -3
@@ -0,0 +1,416 @@
1
+ import { deflateRawSync } from "zlib";
2
+ import { FUSE_SENTINEL } from "../electron.js";
3
+ // ── ZIP / APK ───────────────────────────────────────────────────────────────
4
+ /** Multi-entry ZIP (no CRC, which zip.ts does not check). `beforeCentralDir` is spliced in where an APK Signing Block lives. */
5
+ export function buildZip(entries, beforeCentralDir = Buffer.alloc(0)) {
6
+ const locals = [];
7
+ const centrals = [];
8
+ let offset = 0;
9
+ for (const e of entries) {
10
+ const content = e.deflate ? deflateRawSync(e.data) : e.data;
11
+ const method = e.deflate ? 8 : 0;
12
+ const name = Buffer.from(e.name, "utf8");
13
+ const lfh = Buffer.alloc(30);
14
+ lfh.writeUInt32LE(0x04034b50, 0);
15
+ lfh.writeUInt16LE(20, 4);
16
+ lfh.writeUInt16LE(method, 8);
17
+ lfh.writeUInt32LE(content.length, 18);
18
+ lfh.writeUInt32LE(e.data.length, 22);
19
+ lfh.writeUInt16LE(name.length, 26);
20
+ const cdh = Buffer.alloc(46);
21
+ cdh.writeUInt32LE(0x02014b50, 0);
22
+ cdh.writeUInt16LE(20, 4);
23
+ cdh.writeUInt16LE(20, 6);
24
+ cdh.writeUInt16LE(method, 10);
25
+ cdh.writeUInt32LE(content.length, 20);
26
+ cdh.writeUInt32LE(e.data.length, 24);
27
+ cdh.writeUInt16LE(name.length, 28);
28
+ cdh.writeUInt32LE(offset, 42);
29
+ locals.push(lfh, name, content);
30
+ centrals.push(cdh, name);
31
+ offset += 30 + name.length + content.length;
32
+ }
33
+ const cdOffset = offset + beforeCentralDir.length;
34
+ const cd = Buffer.concat(centrals);
35
+ const eocd = Buffer.alloc(22);
36
+ eocd.writeUInt32LE(0x06054b50, 0);
37
+ eocd.writeUInt16LE(entries.length, 8);
38
+ eocd.writeUInt16LE(entries.length, 10);
39
+ eocd.writeUInt32LE(cd.length, 12);
40
+ eocd.writeUInt32LE(cdOffset, 16);
41
+ return Buffer.concat([...locals, beforeCentralDir, cd, eocd]);
42
+ }
43
+ /** Enough of an APK Signing Block for detection: the magic sits in the 16 bytes before the central directory. */
44
+ export function apkSigningBlock() {
45
+ return Buffer.concat([Buffer.alloc(32), Buffer.from("APK Sig Block 42", "latin1")]);
46
+ }
47
+ export function buildAxml(elements) {
48
+ const strings = [];
49
+ const intern = (s) => {
50
+ let i = strings.indexOf(s);
51
+ if (i === -1)
52
+ i = strings.push(s) - 1;
53
+ return i;
54
+ };
55
+ // Attribute names with resource ids must come first so the resource map indexes line up.
56
+ const withIds = elements.flatMap((e) => e.attrs).filter((a) => a.resourceId !== undefined);
57
+ const ids = [];
58
+ for (const a of withIds) {
59
+ if (!strings.includes(a.name)) {
60
+ intern(a.name);
61
+ ids.push(a.resourceId);
62
+ }
63
+ }
64
+ for (const e of elements) {
65
+ intern(e.name);
66
+ for (const a of e.attrs) {
67
+ intern(a.name);
68
+ if (a.string !== undefined)
69
+ intern(a.string);
70
+ }
71
+ }
72
+ // UTF-16 string pool
73
+ const data = Buffer.concat(strings.map((s) => {
74
+ const b = Buffer.alloc(2 + s.length * 2 + 2);
75
+ b.writeUInt16LE(s.length, 0);
76
+ b.write(s, 2, "utf16le");
77
+ return b;
78
+ }));
79
+ const padded = Buffer.concat([data, Buffer.alloc((4 - (data.length % 4)) % 4)]);
80
+ const offsets = Buffer.alloc(strings.length * 4);
81
+ let o = 0;
82
+ strings.forEach((s, i) => {
83
+ offsets.writeUInt32LE(o, i * 4);
84
+ o += 2 + s.length * 2 + 2;
85
+ });
86
+ const spHeader = Buffer.alloc(28);
87
+ spHeader.writeUInt16LE(0x0001, 0);
88
+ spHeader.writeUInt16LE(28, 2);
89
+ spHeader.writeUInt32LE(28 + offsets.length + padded.length, 4);
90
+ spHeader.writeUInt32LE(strings.length, 8);
91
+ spHeader.writeUInt32LE(0, 16);
92
+ spHeader.writeUInt32LE(28 + offsets.length, 20);
93
+ const pool = Buffer.concat([spHeader, offsets, padded]);
94
+ const resMap = Buffer.alloc(8 + ids.length * 4);
95
+ resMap.writeUInt16LE(0x0180, 0);
96
+ resMap.writeUInt16LE(8, 2);
97
+ resMap.writeUInt32LE(resMap.length, 4);
98
+ ids.forEach((id, i) => resMap.writeUInt32LE(id, 8 + i * 4));
99
+ const chunks = elements.map((e) => {
100
+ const attrs = Buffer.alloc(e.attrs.length * 20);
101
+ e.attrs.forEach((a, i) => {
102
+ const p = i * 20;
103
+ attrs.writeUInt32LE(0xffffffff, p);
104
+ attrs.writeUInt32LE(strings.indexOf(a.name), p + 4);
105
+ attrs.writeUInt16LE(8, p + 12);
106
+ if (a.bool !== undefined) {
107
+ attrs.writeUInt32LE(0xffffffff, p + 8);
108
+ attrs[p + 15] = 0x12;
109
+ attrs.writeUInt32LE(a.bool ? 0xffffffff : 0, p + 16);
110
+ }
111
+ else {
112
+ const idx = strings.indexOf(a.string ?? "");
113
+ attrs.writeUInt32LE(idx, p + 8);
114
+ attrs[p + 15] = 0x03;
115
+ attrs.writeUInt32LE(idx, p + 16);
116
+ }
117
+ });
118
+ const head = Buffer.alloc(16 + 20);
119
+ head.writeUInt16LE(0x0102, 0);
120
+ head.writeUInt16LE(16, 2);
121
+ head.writeUInt32LE(36 + attrs.length, 4);
122
+ head.writeUInt32LE(0xffffffff, 16);
123
+ head.writeUInt32LE(strings.indexOf(e.name), 20);
124
+ head.writeUInt16LE(20, 24);
125
+ head.writeUInt16LE(20, 26);
126
+ head.writeUInt16LE(e.attrs.length, 28);
127
+ return Buffer.concat([head, attrs]);
128
+ });
129
+ const body = Buffer.concat([pool, resMap, ...chunks]);
130
+ const header = Buffer.alloc(8);
131
+ header.writeUInt16LE(0x0003, 0);
132
+ header.writeUInt16LE(8, 2);
133
+ header.writeUInt32LE(8 + body.length, 4);
134
+ return Buffer.concat([header, body]);
135
+ }
136
+ // ── DEX ─────────────────────────────────────────────────────────────────────
137
+ export function buildDex(descriptors) {
138
+ const headerSize = 0x70;
139
+ const n = descriptors.length;
140
+ const stringIdsOff = headerSize;
141
+ const typeIdsOff = stringIdsOff + n * 4;
142
+ let dataOff = typeIdsOff + n * 4;
143
+ const stringIds = Buffer.alloc(n * 4);
144
+ const typeIds = Buffer.alloc(n * 4);
145
+ const data = [];
146
+ descriptors.forEach((d, i) => {
147
+ stringIds.writeUInt32LE(dataOff, i * 4);
148
+ typeIds.writeUInt32LE(i, i * 4);
149
+ const bytes = Buffer.from(d, "utf8");
150
+ const entry = Buffer.concat([Buffer.from([d.length]), bytes, Buffer.from([0])]);
151
+ data.push(entry);
152
+ dataOff += entry.length;
153
+ });
154
+ const header = Buffer.alloc(headerSize);
155
+ header.write("dex\n035\0", 0, "latin1");
156
+ header.writeUInt32LE(n, 0x38);
157
+ header.writeUInt32LE(stringIdsOff, 0x3c);
158
+ header.writeUInt32LE(n, 0x40);
159
+ header.writeUInt32LE(typeIdsOff, 0x44);
160
+ return Buffer.concat([header, stringIds, typeIds, ...data]);
161
+ }
162
+ // ── ASAR / Electron ─────────────────────────────────────────────────────────
163
+ export function buildAsar(files) {
164
+ const index = { files: {} };
165
+ const contents = [];
166
+ let offset = 0;
167
+ for (const [path, text] of Object.entries(files)) {
168
+ const parts = path.split("/");
169
+ let node = index;
170
+ for (const dir of parts.slice(0, -1)) {
171
+ node.files[dir] ??= { files: {} };
172
+ node = node.files[dir];
173
+ }
174
+ const buf = Buffer.from(text, "utf8");
175
+ node.files[parts[parts.length - 1]] = { size: buf.length, offset: String(offset) };
176
+ contents.push(buf);
177
+ offset += buf.length;
178
+ }
179
+ const json = Buffer.from(JSON.stringify(index), "utf8");
180
+ const jsonPadded = Buffer.concat([json, Buffer.alloc((4 - (json.length % 4)) % 4)]);
181
+ const headerPickle = Buffer.alloc(8);
182
+ headerPickle.writeUInt32LE(4 + jsonPadded.length, 0);
183
+ headerPickle.writeUInt32LE(json.length, 4);
184
+ const sizePickle = Buffer.alloc(8);
185
+ sizePickle.writeUInt32LE(4, 0);
186
+ sizePickle.writeUInt32LE(8 + jsonPadded.length, 4);
187
+ return Buffer.concat([sizePickle, headerPickle, jsonPadded, ...contents]);
188
+ }
189
+ /** A stand-in Electron binary: padding, the fuse sentinel, version 1, then the fuse states. */
190
+ export function buildFuseBinary(states, padding = 4096) {
191
+ return Buffer.concat([Buffer.alloc(padding, 0x90), FUSE_SENTINEL, Buffer.from([1, states.length]), Buffer.from(states, "latin1"), Buffer.alloc(64)]);
192
+ }
193
+ export function buildElf64(spec) {
194
+ const names = ["", ".shstrtab", ...spec.sections.map((s) => s.name)];
195
+ const shstrtab = Buffer.from(names.join("\0") + "\0", "latin1");
196
+ const phdrs = [];
197
+ if (spec.type !== "shared")
198
+ phdrs.push({ type: 3, flags: 4 });
199
+ if (spec.stackFlags !== null)
200
+ phdrs.push({ type: 0x6474e551, flags: spec.stackFlags ?? 6 });
201
+ if (spec.relro !== false)
202
+ phdrs.push({ type: 0x6474e552, flags: 4 });
203
+ const phoff = 64;
204
+ const extra = Buffer.from(spec.extra ?? "", "latin1");
205
+ const strOff = phoff + phdrs.length * 56;
206
+ const extraOff = strOff + shstrtab.length;
207
+ const shoff = Math.ceil((extraOff + extra.length) / 8) * 8;
208
+ const shnum = names.length;
209
+ const buf = Buffer.alloc(shoff + shnum * 64);
210
+ buf[0] = 0x7f;
211
+ buf.write("ELF", 1, "latin1");
212
+ buf[4] = 2;
213
+ buf[5] = 1;
214
+ buf[6] = 1;
215
+ buf.writeUInt16LE(spec.type === "exec" ? 2 : 3, 16);
216
+ buf.writeUInt16LE(0x3e, 18);
217
+ buf.writeBigUInt64LE(BigInt(phoff), 32);
218
+ buf.writeBigUInt64LE(BigInt(shoff), 40);
219
+ buf.writeUInt16LE(56, 54);
220
+ buf.writeUInt16LE(phdrs.length, 56);
221
+ buf.writeUInt16LE(64, 58);
222
+ buf.writeUInt16LE(shnum, 60);
223
+ buf.writeUInt16LE(1, 62);
224
+ phdrs.forEach((p, i) => {
225
+ buf.writeUInt32LE(p.type, phoff + i * 56);
226
+ buf.writeUInt32LE(p.flags, phoff + i * 56 + 4);
227
+ });
228
+ shstrtab.copy(buf, strOff);
229
+ extra.copy(buf, extraOff);
230
+ let nameOff = 1;
231
+ const sections = [{ name: ".shstrtab", type: 3, size: shstrtab.length, entsize: 0, offset: strOff }, ...spec.sections.map((s) => ({ ...s, offset: 0 }))];
232
+ sections.forEach((s, i) => {
233
+ const o = shoff + (i + 1) * 64;
234
+ buf.writeUInt32LE(nameOff, o);
235
+ buf.writeUInt32LE(s.type ?? 1, o + 4);
236
+ buf.writeBigUInt64LE(BigInt(s.offset), o + 24);
237
+ buf.writeBigUInt64LE(BigInt(s.size ?? 0), o + 32);
238
+ buf.writeBigUInt64LE(BigInt(s.entsize ?? 0), o + 56);
239
+ nameOff += s.name.length + 1;
240
+ });
241
+ return buf;
242
+ }
243
+ export function buildMachO64(spec) {
244
+ const cmds = [];
245
+ const symbols = spec.symbols ?? [];
246
+ const headerSize = 32;
247
+ const symtabCmd = Buffer.alloc(24);
248
+ const sigCmd = Buffer.alloc(16);
249
+ const cmdsSize = (symbols.length > 0 ? 24 : 0) + (spec.signature ? 16 : 0);
250
+ let tail = headerSize + cmdsSize;
251
+ const symOff = tail;
252
+ const nlist = Buffer.alloc(symbols.length * 16);
253
+ symbols.forEach((t, i) => {
254
+ nlist.writeUInt32LE(1, i * 16);
255
+ nlist[i * 16 + 4] = t;
256
+ });
257
+ const strtab = Buffer.from("\0_sym\0", "latin1");
258
+ tail += nlist.length;
259
+ const strOff = tail;
260
+ tail += strtab.length;
261
+ if (symbols.length > 0) {
262
+ symtabCmd.writeUInt32LE(0x2, 0);
263
+ symtabCmd.writeUInt32LE(24, 4);
264
+ symtabCmd.writeUInt32LE(symOff, 8);
265
+ symtabCmd.writeUInt32LE(symbols.length, 12);
266
+ symtabCmd.writeUInt32LE(strOff, 16);
267
+ symtabCmd.writeUInt32LE(strtab.length, 20);
268
+ cmds.push(symtabCmd);
269
+ }
270
+ let sigBlob = Buffer.alloc(0);
271
+ if (spec.signature) {
272
+ const cd = Buffer.alloc(44);
273
+ cd.writeUInt32BE(0xfade0c02, 0);
274
+ cd.writeUInt32BE(44, 4);
275
+ cd.writeUInt32BE(0x20400, 8);
276
+ cd.writeUInt32BE(spec.signature.flags, 12);
277
+ cd[38] = spec.signature.platform ?? 0;
278
+ const blobs = [{ type: 0, data: cd }];
279
+ if (spec.signature.entitlements) {
280
+ const xml = Buffer.from(spec.signature.entitlements, "utf8");
281
+ const ent = Buffer.alloc(8);
282
+ ent.writeUInt32BE(0xfade7171, 0);
283
+ ent.writeUInt32BE(8 + xml.length, 4);
284
+ blobs.push({ type: 5, data: Buffer.concat([ent, xml]) });
285
+ }
286
+ const index = Buffer.alloc(12 + blobs.length * 8);
287
+ index.writeUInt32BE(0xfade0cc0, 0);
288
+ index.writeUInt32BE(blobs.length, 8);
289
+ let off = index.length;
290
+ blobs.forEach((b, i) => {
291
+ index.writeUInt32BE(b.type, 12 + i * 8);
292
+ index.writeUInt32BE(off, 12 + i * 8 + 4);
293
+ off += b.data.length;
294
+ });
295
+ sigBlob = Buffer.concat([index, ...blobs.map((b) => b.data)]);
296
+ sigBlob.writeUInt32BE(sigBlob.length, 4);
297
+ sigCmd.writeUInt32LE(0x1d, 0);
298
+ sigCmd.writeUInt32LE(16, 4);
299
+ sigCmd.writeUInt32LE(tail, 8);
300
+ sigCmd.writeUInt32LE(sigBlob.length, 12);
301
+ cmds.push(sigCmd);
302
+ }
303
+ const header = Buffer.alloc(headerSize);
304
+ header.writeUInt32LE(0xfeedfacf, 0);
305
+ header.writeUInt32LE(0x0100000c, 4);
306
+ header.writeUInt32LE(spec.filetype ?? 2, 12);
307
+ header.writeUInt32LE(cmds.length, 16);
308
+ header.writeUInt32LE(cmdsSize, 20);
309
+ header.writeUInt32LE(spec.pie === false ? 0 : 0x200000, 24);
310
+ return Buffer.concat([header, ...cmds, nlist, strtab, sigBlob]);
311
+ }
312
+ export function entitlementsPlist(keys) {
313
+ return `<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict>${keys.map((k) => `<key>${k}</key><true/>`).join("")}</dict></plist>`;
314
+ }
315
+ export function buildPe(spec) {
316
+ const fileAlign = 0x200;
317
+ const sectionVA = 0x1000;
318
+ const sectionRaw = 0x400;
319
+ // Section contents: debug directory, CodeView record, CLR header, metadata.
320
+ const section = [];
321
+ let cursor = 0;
322
+ const place = (b) => {
323
+ const at = cursor;
324
+ section.push(b);
325
+ cursor += b.length;
326
+ return at;
327
+ };
328
+ const debugEntries = [];
329
+ if (spec.pdbPath !== undefined) {
330
+ const cv = Buffer.concat([Buffer.from("RSDS", "latin1"), Buffer.alloc(20), Buffer.from(spec.pdbPath + "\0", "utf8")]);
331
+ debugEntries.push({ type: 2, data: cv });
332
+ }
333
+ if (spec.embeddedPdb)
334
+ debugEntries.push({ type: 17, data: Buffer.from("MPDB....", "latin1") });
335
+ const debugDirAt = place(Buffer.alloc(debugEntries.length * 28));
336
+ const dataAts = debugEntries.map((e) => place(e.data));
337
+ debugEntries.forEach((e, i) => {
338
+ const d = section[0];
339
+ d.writeUInt32LE(e.type, i * 28 + 12);
340
+ d.writeUInt32LE(e.data.length, i * 28 + 16);
341
+ d.writeUInt32LE(sectionVA + dataAts[i], i * 28 + 20);
342
+ d.writeUInt32LE(sectionRaw + dataAts[i], i * 28 + 24);
343
+ });
344
+ let clrAt = -1;
345
+ if (spec.dotnetNames) {
346
+ const strings = Buffer.from("\0" + spec.dotnetNames.join("\0") + "\0", "utf8");
347
+ const stringsPadded = Buffer.concat([strings, Buffer.alloc((4 - (strings.length % 4)) % 4)]);
348
+ const version = Buffer.from("v4.0.30319\0\0", "latin1");
349
+ const root = Buffer.alloc(16);
350
+ root.write("BSJB", 0, "latin1");
351
+ root.writeUInt32LE(version.length, 12);
352
+ const streamsHead = Buffer.alloc(4);
353
+ streamsHead.writeUInt16LE(1, 2);
354
+ const streamHdr = Buffer.concat([Buffer.alloc(8), Buffer.from("#Strings\0\0\0\0", "latin1")]);
355
+ const metaLen = root.length + version.length + streamsHead.length + streamHdr.length;
356
+ streamHdr.writeUInt32LE(metaLen, 0);
357
+ streamHdr.writeUInt32LE(stringsPadded.length, 4);
358
+ const meta = Buffer.concat([root, version, streamsHead, streamHdr, stringsPadded]);
359
+ const clr = Buffer.alloc(72);
360
+ clrAt = place(clr);
361
+ const metaAt = place(meta);
362
+ clr.writeUInt32LE(72, 0);
363
+ clr.writeUInt32LE(sectionVA + metaAt, 8);
364
+ clr.writeUInt32LE(meta.length, 12);
365
+ }
366
+ const sectionData = Buffer.concat(section);
367
+ const sectionSize = Math.ceil(Math.max(sectionData.length, 1) / fileAlign) * fileAlign;
368
+ const certAt = sectionRaw + sectionSize;
369
+ const cert = spec.signed ? Buffer.alloc(16, 1) : Buffer.alloc(0);
370
+ const buf = Buffer.alloc(certAt + cert.length);
371
+ buf.write("MZ", 0, "latin1");
372
+ const peOff = 0x80;
373
+ buf.writeUInt32LE(peOff, 0x3c);
374
+ buf.write("PE\0\0", peOff, "latin1");
375
+ const coff = peOff + 4;
376
+ buf.writeUInt16LE(0x8664, coff);
377
+ buf.writeUInt16LE(1, coff + 2);
378
+ buf.writeUInt16LE(240, coff + 16);
379
+ buf.writeUInt16LE(0x0022 | (spec.dll ? 0x2000 : 0), coff + 18);
380
+ const opt = coff + 20;
381
+ buf.writeUInt16LE(0x20b, opt);
382
+ buf.writeUInt16LE(spec.dllCharacteristics ?? 0x8160, opt + 70);
383
+ buf.writeUInt32LE(16, opt + 108);
384
+ const dirs = opt + 112;
385
+ if (spec.signed) {
386
+ buf.writeUInt32LE(certAt, dirs + 4 * 8);
387
+ buf.writeUInt32LE(cert.length, dirs + 4 * 8 + 4);
388
+ }
389
+ if (debugEntries.length > 0) {
390
+ buf.writeUInt32LE(sectionVA + debugDirAt, dirs + 6 * 8);
391
+ buf.writeUInt32LE(debugEntries.length * 28, dirs + 6 * 8 + 4);
392
+ }
393
+ if (clrAt >= 0) {
394
+ buf.writeUInt32LE(sectionVA + clrAt, dirs + 14 * 8);
395
+ buf.writeUInt32LE(72, dirs + 14 * 8 + 4);
396
+ }
397
+ const sec = opt + 240;
398
+ buf.write(".text", sec, "latin1");
399
+ buf.writeUInt32LE(sectionSize, sec + 8);
400
+ buf.writeUInt32LE(sectionVA, sec + 12);
401
+ buf.writeUInt32LE(sectionSize, sec + 16);
402
+ buf.writeUInt32LE(sectionRaw, sec + 20);
403
+ sectionData.copy(buf, sectionRaw);
404
+ cert.copy(buf, certAt);
405
+ return buf;
406
+ }
407
+ /** Plain, descriptive identifiers like an unobfuscated assembly's metadata. */
408
+ export const READABLE_DOTNET_NAMES = [
409
+ "LicenseValidator", "ValidateLicenseKey", "ComputeChecksum", "SubscriptionManager", "UpgradeToPremium", "CancelSubscription",
410
+ "FeatureFlags", "EnableExperimentalScanner", "MaximumConcurrentScans", "Program", "Main", "Object", "String", "Console",
411
+ "WriteLine", "StartsWith", "IsNullOrEmpty", "get_CurrentPlan", "set_CurrentPlan", "CurrentPlan", "paymentToken", "key",
412
+ "args", "value", "validator", "manager", "DebuggableAttribute", "CompilationRelaxationsAttribute", "RuntimeCompatibilityAttribute",
413
+ "TargetFrameworkAttribute", "AssemblyCompanyAttribute", "AssemblyProductAttribute", "AssemblyTitleAttribute", "LicenseApp",
414
+ "System.Runtime", "System.Console", "<Module>", "<CurrentPlan>k__BackingField",
415
+ ];
416
+ //# sourceMappingURL=testFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testFixtures.js","sourceRoot":"","sources":["../../src/__tests__/testFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=web.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/web.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { analyzeJavaScript, analyzeWebFiles, collapseRepeats, looksUnminified, parseSourceMap, sourceMappingUrl } from "../web.js";
3
+ const ids = (fs) => fs.map((f) => f.patternId).sort();
4
+ function unminifiedSource(lines = 80) {
5
+ const out = ["export class LicenseValidator {"];
6
+ for (let i = 0; i < lines; i++)
7
+ out.push(` validateLicenseKey${i}(key) {`, " return key.startsWith('GB-');", " }");
8
+ out.push("}");
9
+ return out.join("\n");
10
+ }
11
+ function minifiedSource() {
12
+ return Array.from({ length: 300 }, (_, i) => `function a${i}(b){return b+${i}}`).join(";") + "\n";
13
+ }
14
+ const file = (key, text) => ({ key, display: `dist/${key}`, size: Buffer.byteLength(text), read: () => Buffer.from(text) });
15
+ describe("parseSourceMap", () => {
16
+ it("counts sources and embedded sourcesContent, preferring app paths for the sample", () => {
17
+ const info = parseSourceMap(JSON.stringify({
18
+ version: 3,
19
+ mappings: "AAAA",
20
+ sources: ["webpack://app/node_modules/react/index.js", "webpack://app/src/billing/LicenseValidator.ts"],
21
+ sourcesContent: ["module.exports = 1", "export class LicenseValidator {}"],
22
+ }));
23
+ expect(info).toEqual({ sources: 2, embedded: 2, samplePaths: ["webpack://app/src/billing/LicenseValidator.ts"] });
24
+ });
25
+ it("rejects JSON that is not a source map", () => {
26
+ expect(parseSourceMap('{"name":"pkg"}')).toBeNull();
27
+ expect(parseSourceMap("not json")).toBeNull();
28
+ });
29
+ });
30
+ describe("analyzeJavaScript", () => {
31
+ it("flags an inline source map that embeds the original source as critical", () => {
32
+ const map = Buffer.from(JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/app.ts"], sourcesContent: ["const secretSauce = 1"] })).toString("base64");
33
+ const findings = analyzeJavaScript(`${minifiedSource()}//# sourceMappingURL=data:application/json;base64,${map}`, "app.js");
34
+ expect(findings).toHaveLength(1);
35
+ expect(findings[0]).toMatchObject({ patternId: "sourcemap_embeds_source", severity: "critical" });
36
+ expect(findings[0].match).toContain("src/app.ts");
37
+ });
38
+ it("finds an inline map much longer than the file's tail", () => {
39
+ const source = "x".repeat(200_000);
40
+ const map = Buffer.from(JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/big.ts"], sourcesContent: [source] })).toString("base64");
41
+ expect(ids(analyzeJavaScript(`${minifiedSource()}//# sourceMappingURL=data:application/json;base64,${map}\n`, "big.js"))).toEqual(["sourcemap_embeds_source"]);
42
+ });
43
+ it("uses the last mapping comment and ignores the key inside code or strings", () => {
44
+ expect(sourceMappingUrl('var s="//# sourceMappingURL=fake.map";\n//# sourceMappingURL=real.js.map\n')).toBe("real.js.map");
45
+ expect(sourceMappingUrl('x.sourceMappingURL=y;')).toBeNull();
46
+ expect(sourceMappingUrl("//@ sourceMappingURL=old.map \r\n")).toBe("old.map");
47
+ });
48
+ it("stays linear on adversarial input", () => {
49
+ const hostile = "//#sourceMappingURL=".repeat(50_000) + "x y";
50
+ const t = Date.now();
51
+ expect(sourceMappingUrl(hostile)).toBeNull();
52
+ expect(Date.now() - t).toBeLessThan(500);
53
+ });
54
+ it("flags an inline map without sources as sourcemap_inline", () => {
55
+ const map = Buffer.from(JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/app.ts"] })).toString("base64");
56
+ expect(ids(analyzeJavaScript(`x()\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${map}`, "app.js"))).toEqual(["sourcemap_inline"]);
57
+ });
58
+ it("reports an external sourceMappingURL as a low-severity reference", () => {
59
+ const [f] = analyzeJavaScript(`${minifiedSource()}//# sourceMappingURL=app.js.map\n`, "app.js");
60
+ expect(f).toMatchObject({ patternId: "sourcemap_reference", severity: "low", match: "//# sourceMappingURL=app.js.map" });
61
+ });
62
+ it("detects webpack eval-devtool bundles and does not also call them unminified", () => {
63
+ const text = `${unminifiedSource()}\neval("const a = 1;\\n\\n//# sourceURL=webpack://app/./src/index.js?");`;
64
+ expect(ids(analyzeJavaScript(text, "main.js"))).toEqual(["eval_devtool_bundle"]);
65
+ });
66
+ it("separates unminified from minified output", () => {
67
+ expect(looksUnminified(unminifiedSource()).unminified).toBe(true);
68
+ expect(looksUnminified(minifiedSource()).unminified).toBe(false);
69
+ expect(ids(analyzeJavaScript(unminifiedSource(), "app.js"))).toEqual(["unminified_bundle"]);
70
+ expect(analyzeJavaScript(minifiedSource(), "app.js")).toEqual([]);
71
+ });
72
+ it("skips the minification check for small files", () => {
73
+ expect(analyzeJavaScript(unminifiedSource(5), "small.js")).toEqual([]);
74
+ });
75
+ it("detects framework development builds", () => {
76
+ const [f] = analyzeJavaScript('var x=1;/** @license React\n * react-dom.development.js */', "vendor.js");
77
+ expect(f).toMatchObject({ patternId: "dev_build_framework" });
78
+ expect(f.match).toMatch(/^React:/);
79
+ });
80
+ it("finds fixed-format credentials and masks them", () => {
81
+ const [f] = analyzeJavaScript('const s3={accessKeyId:"AKIAQ7XKZP3LMNB2RTUV"};', "app.js");
82
+ expect(f).toMatchObject({ patternId: "bundle_secret", severity: "critical" });
83
+ expect(f.match).not.toContain("AKIAQ7XKZP3LMNB2RTUV");
84
+ expect(f.match).toContain("AKIA…");
85
+ });
86
+ it("ignores a PEM header that a crypto library keeps as a string constant", () => {
87
+ const text = 'const H="-----BEGIN RSA PRIVATE KEY-----",F="-----END RSA PRIVATE KEY-----";function p(t){return t.indexOf(H)}';
88
+ expect(analyzeJavaScript(text, "crypto.js")).toEqual([]);
89
+ });
90
+ it("flags a private key whose base64 body follows the header, also inside an escaped string", () => {
91
+ const body = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJTUt9Us8cKjMzEfYyjiWA4R4";
92
+ expect(ids(analyzeJavaScript(`const k="-----BEGIN RSA PRIVATE KEY-----\\n${body}\\n-----END RSA PRIVATE KEY-----";`, "a.js"))).toEqual(["bundle_secret"]);
93
+ expect(ids(analyzeJavaScript(`const k=\`-----BEGIN PRIVATE KEY-----\n${body}\n-----END PRIVATE KEY-----\`;`, "b.js"))).toEqual(["bundle_secret"]);
94
+ });
95
+ it("skips connection-string placeholders shown in UI hints, in any language", () => {
96
+ const text = 'const t={en:"postgresql://user:password@host:5432/mydb",tr:"postgresql://kullanici:sifre@host:5432/veritabani",m:"mongodb://admin:***@db.example.net/app"}';
97
+ expect(analyzeJavaScript(text, "i18n.js")).toEqual([]);
98
+ });
99
+ it("still flags a connection string with a real-looking password and host", () => {
100
+ // Assembled at runtime so the repository's own secretlint hook does not read it as a leak.
101
+ const url = ["postgresql://shop", "Zx81kqL2vT@db-prod.shop-internal.net:5432/orders"].join(":");
102
+ const [f] = analyzeJavaScript(`const db="${url}";`, "app.js");
103
+ expect(f).toMatchObject({ patternId: "bundle_secret", severity: "critical" });
104
+ });
105
+ it("skips documented example keys", () => {
106
+ expect(analyzeJavaScript('const k="AKIAIOSFODNN7EXAMPLE";', "docs.js")).toEqual([]);
107
+ });
108
+ it("lists internal and non-production hosts but not look-alike public ones", () => {
109
+ const text = 'fetch("http://localhost:3000/api");fetch("https://api.staging.example.com");fetch("http://10.0.4.12:8080");fetch("https://developer.mozilla.org/docs");fetch("https://devtools.example.com")';
110
+ const [f] = analyzeJavaScript(text, "app.js");
111
+ expect(f.patternId).toBe("internal_endpoint");
112
+ expect(f.match).toBe("http://localhost:3000, https://api.staging.example.com, http://10.0.4.12:8080");
113
+ });
114
+ it("returns nothing for a clean production bundle", () => {
115
+ expect(analyzeJavaScript(minifiedSource(), "app.js")).toEqual([]);
116
+ });
117
+ });
118
+ describe("analyzeWebFiles", () => {
119
+ it("reports a shipped map once, through the map file, instead of also as a reference", () => {
120
+ const map = JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/a.ts"], sourcesContent: ["x"] });
121
+ const findings = analyzeWebFiles([
122
+ file("assets/app.js", `${minifiedSource()}//# sourceMappingURL=app.js.map`),
123
+ file("assets/app.js.map", map),
124
+ ]);
125
+ expect(ids(findings)).toEqual(["sourcemap_embeds_source"]);
126
+ expect(findings[0].file).toBe("dist/assets/app.js.map");
127
+ });
128
+ it("resolves ../ references when matching maps", () => {
129
+ const map = JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/a.ts"] });
130
+ const findings = analyzeWebFiles([file("js/app.js", `${minifiedSource()}//# sourceMappingURL=../maps/app.js.map`), file("maps/app.js.map", map)]);
131
+ expect(ids(findings)).toEqual(["sourcemap_shipped"]);
132
+ });
133
+ it("keeps the reference when the map is not part of the artifact", () => {
134
+ expect(ids(analyzeWebFiles([file("app.js", `${minifiedSource()}//# sourceMappingURL=app.js.map`)]))).toEqual(["sourcemap_reference"]);
135
+ });
136
+ });
137
+ describe("collapseRepeats", () => {
138
+ it("reports one finding per distinct secret and says how far it spreads", () => {
139
+ const chunk = 'const k="AKIAQ7XKZP3LMNB2RTUV";';
140
+ const findings = analyzeWebFiles([file("a.js", chunk), file("b.js", chunk), file("c.js", chunk)]);
141
+ expect(findings).toHaveLength(1);
142
+ expect(findings[0].match).toContain("also in 2 other file(s)");
143
+ });
144
+ it("merges internal hosts across files and collapses long lists of unminified files", () => {
145
+ const files = Array.from({ length: 7 }, (_, i) => file(`chunk${i}.js`, `${unminifiedSource()}\nfetch("http://localhost:${3000 + i}")`));
146
+ const findings = analyzeWebFiles(files);
147
+ expect(ids(findings)).toEqual(["internal_endpoint", "unminified_bundle"]);
148
+ expect(findings.find((f) => f.patternId === "unminified_bundle").match).toBe("7 files, e.g. chunk0.js, chunk1.js, chunk2.js");
149
+ expect(findings.find((f) => f.patternId === "internal_endpoint").match).toContain("— in 7 files");
150
+ });
151
+ it("leaves short lists alone", () => {
152
+ const one = analyzeJavaScript(unminifiedSource(), "x.js");
153
+ expect(collapseRepeats([...one, ...one])).toHaveLength(2);
154
+ });
155
+ });
156
+ //# sourceMappingURL=web.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../src/__tests__/web.test.ts"],"names":[],"mappings":"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"}