bla-agents 1.1.0 → 1.6.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/.agents/skills/blind-llm-agents/SKILL.md +20 -14
- package/DISCLAIMER.md +15 -7
- package/README.md +153 -198
- package/dist/bundler/index.d.ts +19 -2
- package/dist/bundler/index.d.ts.map +1 -1
- package/dist/bundler/index.js +47 -4
- package/dist/bundler/index.js.map +1 -1
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +123 -18
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +160 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/coverage-contract.d.ts +97 -0
- package/dist/core/coverage-contract.d.ts.map +1 -0
- package/dist/core/coverage-contract.js +164 -0
- package/dist/core/coverage-contract.js.map +1 -0
- package/dist/core/debug-posture.d.ts +40 -0
- package/dist/core/debug-posture.d.ts.map +1 -0
- package/dist/core/debug-posture.js +197 -0
- package/dist/core/debug-posture.js.map +1 -0
- package/dist/core/detector.d.ts.map +1 -1
- package/dist/core/detector.js +58 -6
- package/dist/core/detector.js.map +1 -1
- package/dist/core/identifiers.d.ts +32 -0
- package/dist/core/identifiers.d.ts.map +1 -0
- package/dist/core/identifiers.js +263 -0
- package/dist/core/identifiers.js.map +1 -0
- package/dist/core/llm-directives.d.ts +12 -0
- package/dist/core/llm-directives.d.ts.map +1 -0
- package/dist/core/llm-directives.js +23 -0
- package/dist/core/llm-directives.js.map +1 -0
- package/dist/core/prng.d.ts +10 -1
- package/dist/core/prng.d.ts.map +1 -1
- package/dist/core/prng.js +27 -2
- package/dist/core/prng.js.map +1 -1
- package/dist/core/release-exposure.d.ts.map +1 -1
- package/dist/core/release-exposure.js +13 -2
- package/dist/core/release-exposure.js.map +1 -1
- package/dist/core/release-plan.d.ts +68 -0
- package/dist/core/release-plan.d.ts.map +1 -0
- package/dist/core/release-plan.js +244 -0
- package/dist/core/release-plan.js.map +1 -0
- package/dist/core/sarif.d.ts +53 -0
- package/dist/core/sarif.d.ts.map +1 -0
- package/dist/core/sarif.js +95 -0
- package/dist/core/sarif.js.map +1 -0
- package/dist/core/sqlite-runtime.d.ts +13 -0
- package/dist/core/sqlite-runtime.d.ts.map +1 -1
- package/dist/core/sqlite-runtime.js +38 -8
- package/dist/core/sqlite-runtime.js.map +1 -1
- package/dist/core/types.d.ts +7 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/engine/auditor.d.ts.map +1 -1
- package/dist/engine/auditor.js +380 -19
- package/dist/engine/auditor.js.map +1 -1
- package/dist/engine/benchmark.d.ts +1 -1
- package/dist/engine/benchmark.d.ts.map +1 -1
- package/dist/engine/benchmark.js +121 -41
- package/dist/engine/benchmark.js.map +1 -1
- package/dist/engine/defender.d.ts +1 -0
- package/dist/engine/defender.d.ts.map +1 -1
- package/dist/engine/defender.js +7 -1
- package/dist/engine/defender.js.map +1 -1
- package/dist/engine/harden.d.ts +61 -0
- package/dist/engine/harden.d.ts.map +1 -0
- package/dist/engine/harden.js +294 -0
- package/dist/engine/harden.js.map +1 -0
- package/dist/engine/protector.d.ts.map +1 -1
- package/dist/engine/protector.js +242 -26
- package/dist/engine/protector.js.map +1 -1
- package/dist/identity.d.ts +112 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +112 -2
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +26 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +59 -152
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +466 -50
- package/dist/mcp/server.js.map +1 -1
- package/dist/setup/clients.d.ts +49 -1
- package/dist/setup/clients.d.ts.map +1 -1
- package/dist/setup/clients.js +1193 -20
- package/dist/setup/clients.js.map +1 -1
- package/dist/setup/doctor.d.ts +58 -14
- package/dist/setup/doctor.d.ts.map +1 -1
- package/dist/setup/doctor.js +316 -22
- package/dist/setup/doctor.js.map +1 -1
- package/dist/setup/setup.d.ts +77 -7
- package/dist/setup/setup.d.ts.map +1 -1
- package/dist/setup/setup.js +591 -62
- package/dist/setup/setup.js.map +1 -1
- package/dist/shields/chaff/chaff-generator.d.ts.map +1 -1
- package/dist/shields/chaff/chaff-generator.js +12 -3
- package/dist/shields/chaff/chaff-generator.js.map +1 -1
- package/dist/shields/deception/architecture-mirage.js +1 -1
- package/dist/shields/deception/architecture-mirage.js.map +1 -1
- package/dist/shields/deception/canary-honeypot.d.ts +33 -0
- package/dist/shields/deception/canary-honeypot.d.ts.map +1 -0
- package/dist/shields/deception/canary-honeypot.js +95 -0
- package/dist/shields/deception/canary-honeypot.js.map +1 -0
- package/dist/shields/deception/cognitive-armor-trigger.d.ts +43 -0
- package/dist/shields/deception/cognitive-armor-trigger.d.ts.map +1 -0
- package/dist/shields/deception/cognitive-armor-trigger.js +204 -0
- package/dist/shields/deception/cognitive-armor-trigger.js.map +1 -0
- package/dist/shields/deception/crash-trace-decoy.js +1 -1
- package/dist/shields/deception/crash-trace-decoy.js.map +1 -1
- package/dist/shields/deception/decompiler-illusion.js +1 -1
- package/dist/shields/deception/decompiler-illusion.js.map +1 -1
- package/dist/shields/deception/diff-noise-injector.js +1 -1
- package/dist/shields/deception/diff-noise-injector.js.map +1 -1
- package/dist/shields/deception/evidence-contract-poison.js +5 -5
- package/dist/shields/deception/evidence-contract-poison.js.map +1 -1
- package/dist/shields/deception/format-payloads.d.ts +21 -0
- package/dist/shields/deception/format-payloads.d.ts.map +1 -0
- package/dist/shields/deception/format-payloads.js +24 -0
- package/dist/shields/deception/format-payloads.js.map +1 -0
- package/dist/shields/deception/index.d.ts +10 -2
- package/dist/shields/deception/index.d.ts.map +1 -1
- package/dist/shields/deception/index.js +20 -3
- package/dist/shields/deception/index.js.map +1 -1
- package/dist/shields/deception/prompt-completion-poison.d.ts +3 -2
- package/dist/shields/deception/prompt-completion-poison.d.ts.map +1 -1
- package/dist/shields/deception/prompt-completion-poison.js +6 -3
- package/dist/shields/deception/prompt-completion-poison.js.map +1 -1
- package/dist/shields/deception/shadow-business-logic.js +4 -4
- package/dist/shields/deception/shadow-business-logic.js.map +1 -1
- package/dist/shields/deception/system-diagnostic-decoy.d.ts +36 -0
- package/dist/shields/deception/system-diagnostic-decoy.d.ts.map +1 -0
- package/dist/shields/deception/system-diagnostic-decoy.js +101 -0
- package/dist/shields/deception/system-diagnostic-decoy.js.map +1 -0
- package/dist/shields/exhaustion/asar-header-amplifier.d.ts +12 -3
- package/dist/shields/exhaustion/asar-header-amplifier.d.ts.map +1 -1
- package/dist/shields/exhaustion/asar-header-amplifier.js +30 -8
- package/dist/shields/exhaustion/asar-header-amplifier.js.map +1 -1
- package/dist/shields/exhaustion/bpe-token-amplifier.js +2 -2
- package/dist/shields/exhaustion/bpe-token-amplifier.js.map +1 -1
- package/dist/shields/exhaustion/callgraph-labyrinth.js +2 -2
- package/dist/shields/exhaustion/callgraph-labyrinth.js.map +1 -1
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.js +1 -1
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.js.map +1 -1
- package/dist/shields/exhaustion/frida-capture-saturation.d.ts +10 -5
- package/dist/shields/exhaustion/frida-capture-saturation.d.ts.map +1 -1
- package/dist/shields/exhaustion/frida-capture-saturation.js +21 -8
- package/dist/shields/exhaustion/frida-capture-saturation.js.map +1 -1
- package/dist/shields/exhaustion/index.d.ts +2 -2
- package/dist/shields/exhaustion/index.d.ts.map +1 -1
- package/dist/shields/exhaustion/index.js +2 -2
- package/dist/shields/exhaustion/index.js.map +1 -1
- package/dist/shields/exhaustion/obligation-flooder.d.ts +23 -6
- package/dist/shields/exhaustion/obligation-flooder.d.ts.map +1 -1
- package/dist/shields/exhaustion/obligation-flooder.js +29 -12
- package/dist/shields/exhaustion/obligation-flooder.js.map +1 -1
- package/dist/shields/exhaustion/rea-budget-matrix.d.ts +8 -2
- package/dist/shields/exhaustion/rea-budget-matrix.d.ts.map +1 -1
- package/dist/shields/exhaustion/rea-budget-matrix.js +139 -16
- package/dist/shields/exhaustion/rea-budget-matrix.js.map +1 -1
- package/dist/shields/exhaustion/regex-worker-tarpit.d.ts.map +1 -1
- package/dist/shields/exhaustion/regex-worker-tarpit.js +2 -1
- package/dist/shields/exhaustion/regex-worker-tarpit.js.map +1 -1
- package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts +7 -4
- package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts.map +1 -1
- package/dist/shields/exhaustion/wasm-interface-exhaustion.js +16 -7
- package/dist/shields/exhaustion/wasm-interface-exhaustion.js.map +1 -1
- package/dist/shields/formats/android-dex-xref.d.ts +19 -0
- package/dist/shields/formats/android-dex-xref.d.ts.map +1 -0
- package/dist/shields/formats/android-dex-xref.js +427 -0
- package/dist/shields/formats/android-dex-xref.js.map +1 -0
- package/dist/shields/formats/android-manifest.d.ts +44 -0
- package/dist/shields/formats/android-manifest.d.ts.map +1 -0
- package/dist/shields/formats/android-manifest.js +240 -0
- package/dist/shields/formats/android-manifest.js.map +1 -0
- package/dist/shields/formats/android-r8.d.ts +44 -0
- package/dist/shields/formats/android-r8.d.ts.map +1 -0
- package/dist/shields/formats/android-r8.js +246 -0
- package/dist/shields/formats/android-r8.js.map +1 -0
- package/dist/shields/formats/apple-plist.d.ts +15 -0
- package/dist/shields/formats/apple-plist.d.ts.map +1 -1
- package/dist/shields/formats/apple-plist.js +59 -1
- package/dist/shields/formats/apple-plist.js.map +1 -1
- package/dist/shields/formats/archive.d.ts +27 -6
- package/dist/shields/formats/archive.d.ts.map +1 -1
- package/dist/shields/formats/archive.js +247 -45
- package/dist/shields/formats/archive.js.map +1 -1
- package/dist/shields/formats/asar.d.ts +50 -10
- package/dist/shields/formats/asar.d.ts.map +1 -1
- package/dist/shields/formats/asar.js +265 -39
- package/dist/shields/formats/asar.js.map +1 -1
- package/dist/shields/formats/bun-standalone.d.ts +78 -0
- package/dist/shields/formats/bun-standalone.d.ts.map +1 -0
- package/dist/shields/formats/bun-standalone.js +272 -0
- package/dist/shields/formats/bun-standalone.js.map +1 -0
- package/dist/shields/formats/dotnet-managed.d.ts +9 -0
- package/dist/shields/formats/dotnet-managed.d.ts.map +1 -1
- package/dist/shields/formats/dotnet-managed.js +26 -1
- package/dist/shields/formats/dotnet-managed.js.map +1 -1
- package/dist/shields/formats/electron-fuses.d.ts +63 -8
- package/dist/shields/formats/electron-fuses.d.ts.map +1 -1
- package/dist/shields/formats/electron-fuses.js +297 -65
- package/dist/shields/formats/electron-fuses.js.map +1 -1
- package/dist/shields/formats/erlang-beam.d.ts +34 -0
- package/dist/shields/formats/erlang-beam.d.ts.map +1 -0
- package/dist/shields/formats/erlang-beam.js +319 -0
- package/dist/shields/formats/erlang-beam.js.map +1 -0
- package/dist/shields/formats/evm-bytecode.d.ts +28 -0
- package/dist/shields/formats/evm-bytecode.d.ts.map +1 -0
- package/dist/shields/formats/evm-bytecode.js +124 -0
- package/dist/shields/formats/evm-bytecode.js.map +1 -0
- package/dist/shields/formats/go-flutter-exhaustion.d.ts +55 -0
- package/dist/shields/formats/go-flutter-exhaustion.d.ts.map +1 -0
- package/dist/shields/formats/go-flutter-exhaustion.js +346 -0
- package/dist/shields/formats/go-flutter-exhaustion.js.map +1 -0
- package/dist/shields/formats/gpu-ptx.d.ts +40 -0
- package/dist/shields/formats/gpu-ptx.d.ts.map +1 -0
- package/dist/shields/formats/gpu-ptx.js +62 -0
- package/dist/shields/formats/gpu-ptx.js.map +1 -0
- package/dist/shields/formats/headers.d.ts.map +1 -1
- package/dist/shields/formats/headers.js +54 -14
- package/dist/shields/formats/headers.js.map +1 -1
- package/dist/shields/formats/jvm-bytecode.d.ts +20 -0
- package/dist/shields/formats/jvm-bytecode.d.ts.map +1 -0
- package/dist/shields/formats/jvm-bytecode.js +134 -0
- package/dist/shields/formats/jvm-bytecode.js.map +1 -0
- package/dist/shields/formats/mobile-game.d.ts +4 -0
- package/dist/shields/formats/mobile-game.d.ts.map +1 -1
- package/dist/shields/formats/mobile-game.js +16 -0
- package/dist/shields/formats/mobile-game.js.map +1 -1
- package/dist/shields/formats/model.d.ts +22 -8
- package/dist/shields/formats/model.d.ts.map +1 -1
- package/dist/shields/formats/model.js +231 -59
- package/dist/shields/formats/model.js.map +1 -1
- package/dist/shields/formats/native.d.ts +74 -11
- package/dist/shields/formats/native.d.ts.map +1 -1
- package/dist/shields/formats/native.js +557 -109
- package/dist/shields/formats/native.js.map +1 -1
- package/dist/shields/formats/pcap-capture.d.ts +27 -0
- package/dist/shields/formats/pcap-capture.d.ts.map +1 -0
- package/dist/shields/formats/pcap-capture.js +201 -0
- package/dist/shields/formats/pcap-capture.js.map +1 -0
- package/dist/shields/formats/python.d.ts +22 -1
- package/dist/shields/formats/python.d.ts.map +1 -1
- package/dist/shields/formats/python.js +568 -27
- package/dist/shields/formats/python.js.map +1 -1
- package/dist/shields/formats/sourcemap.d.ts.map +1 -1
- package/dist/shields/formats/sourcemap.js +2 -0
- package/dist/shields/formats/sourcemap.js.map +1 -1
- package/dist/shields/formats/sqlite.d.ts +87 -15
- package/dist/shields/formats/sqlite.d.ts.map +1 -1
- package/dist/shields/formats/sqlite.js +377 -42
- package/dist/shields/formats/sqlite.js.map +1 -1
- package/dist/shields/formats/wasm.d.ts +6 -0
- package/dist/shields/formats/wasm.d.ts.map +1 -1
- package/dist/shields/formats/wasm.js +118 -3
- package/dist/shields/formats/wasm.js.map +1 -1
- package/dist/shields/javascript/ast-shield.d.ts +26 -5
- package/dist/shields/javascript/ast-shield.d.ts.map +1 -1
- package/dist/shields/javascript/ast-shield.js +748 -104
- package/dist/shields/javascript/ast-shield.js.map +1 -1
- package/dist/shields/runtime/memory-diff-shield.d.ts +56 -0
- package/dist/shields/runtime/memory-diff-shield.d.ts.map +1 -0
- package/dist/shields/runtime/memory-diff-shield.js +170 -0
- package/dist/shields/runtime/memory-diff-shield.js.map +1 -0
- package/dist/shields/runtime/runtime-shield.d.ts +12 -16
- package/dist/shields/runtime/runtime-shield.d.ts.map +1 -1
- package/dist/shields/runtime/runtime-shield.js +30 -24
- package/dist/shields/runtime/runtime-shield.js.map +1 -1
- package/dist/shields/tarpit/opaque-predicates.d.ts.map +1 -1
- package/dist/shields/tarpit/opaque-predicates.js +3 -3
- package/dist/shields/tarpit/opaque-predicates.js.map +1 -1
- package/dist/shields/tarpit/tarpit-generator.d.ts +9 -4
- package/dist/shields/tarpit/tarpit-generator.d.ts.map +1 -1
- package/dist/shields/tarpit/tarpit-generator.js +30 -23
- package/dist/shields/tarpit/tarpit-generator.js.map +1 -1
- package/package.json +13 -6
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counter REA #8154 — `feat(android): trace callers of external DEX methods`.
|
|
3
|
+
*
|
|
4
|
+
* REA's JADX bridge (`ReaJadxBridge.java`) walks every method body for
|
|
5
|
+
* `INVOKE_*` opcodes targeting an exact external class/method, then budgets
|
|
6
|
+
* the resulting prototype + caller inventories against
|
|
7
|
+
* `MAX_EXTERNAL_XREF_BYTES = (8 MiB - 1 KiB) / 8` (≈ 1_048_448 bytes).
|
|
8
|
+
*
|
|
9
|
+
* This module emits a standalone, byte-valid Dalvik Executable (`dex\n035\0`)
|
|
10
|
+
* whose only purpose is to saturate that budget:
|
|
11
|
+
* - One external target: `android.util.Log.d(String, String)` (no class_def).
|
|
12
|
+
* - N decoy caller classes, each with a static `bait()` that contains a real
|
|
13
|
+
* `invoke-static` to that target — so JADX's instruction visitor sees them.
|
|
14
|
+
*
|
|
15
|
+
* The developer's own `classes.dex` is NEVER rewritten by this generator; the
|
|
16
|
+
* decoy is planted as an additional `classesN.dex` multidex member (see
|
|
17
|
+
* `archive.ts`). Header checksum / signature / file_size are recomputed so
|
|
18
|
+
* any tool that validates the DEX container still accepts it.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from "node:crypto";
|
|
21
|
+
import { REA_INTERNAL_LIMITS } from "../../identity.js";
|
|
22
|
+
import { buildCanaryAndDiagnosticPayloads } from "../deception/format-payloads.js";
|
|
23
|
+
function encodeUleb128(value) {
|
|
24
|
+
const bytes = [];
|
|
25
|
+
let v = value >>> 0;
|
|
26
|
+
do {
|
|
27
|
+
let byte = v & 0x7f;
|
|
28
|
+
v >>>= 7;
|
|
29
|
+
if (v !== 0)
|
|
30
|
+
byte |= 0x80;
|
|
31
|
+
bytes.push(byte);
|
|
32
|
+
} while (v !== 0);
|
|
33
|
+
return Buffer.from(bytes);
|
|
34
|
+
}
|
|
35
|
+
function align4(n) {
|
|
36
|
+
return (n + 3) & ~3;
|
|
37
|
+
}
|
|
38
|
+
function intensityCallerCount(intensity) {
|
|
39
|
+
// Escaped JSON per caller row is hundreds of bytes under InvokeBudget's
|
|
40
|
+
// 12× character bound. Aim past ANDROID_EXTERNAL_XREF_BYTES at maximum /
|
|
41
|
+
// bankrupt; keep stealth/balanced smaller but still meaningful.
|
|
42
|
+
switch (intensity) {
|
|
43
|
+
case "stealth":
|
|
44
|
+
return 96;
|
|
45
|
+
case "balanced":
|
|
46
|
+
return 384;
|
|
47
|
+
case "maximum":
|
|
48
|
+
return 2_048;
|
|
49
|
+
case "bankrupt":
|
|
50
|
+
return 6_144;
|
|
51
|
+
default:
|
|
52
|
+
return 384;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build a minimal but structurally valid DEX 035 containing `callerCount`
|
|
57
|
+
* static caller classes that each `invoke-static` `Landroid/util/Log;->d`.
|
|
58
|
+
*/
|
|
59
|
+
function buildExternalInvokeDex(prng, callerCount, extraStrings) {
|
|
60
|
+
const marker = "BLA-DEX-XREF-V1";
|
|
61
|
+
// ----- string pool (order matters; indices are referenced below) -----
|
|
62
|
+
const strings = [];
|
|
63
|
+
const strIndex = new Map();
|
|
64
|
+
const addStr = (s) => {
|
|
65
|
+
const existing = strIndex.get(s);
|
|
66
|
+
if (existing !== undefined)
|
|
67
|
+
return existing;
|
|
68
|
+
const idx = strings.length;
|
|
69
|
+
strings.push(s);
|
|
70
|
+
strIndex.set(s, idx);
|
|
71
|
+
return idx;
|
|
72
|
+
};
|
|
73
|
+
// Fixed descriptor / name strings used by the external target + callers.
|
|
74
|
+
const sVoid = addStr("V");
|
|
75
|
+
const sObject = addStr("Ljava/lang/Object;");
|
|
76
|
+
const sString = addStr("Ljava/lang/String;");
|
|
77
|
+
const sLog = addStr("Landroid/util/Log;");
|
|
78
|
+
const sShortyLogD = addStr("VLL"); // return V, two reference args
|
|
79
|
+
const sShortyVoid = addStr("V");
|
|
80
|
+
const sMethodD = addStr("d");
|
|
81
|
+
const sMethodBait = addStr("bait");
|
|
82
|
+
const sMarker = addStr(marker);
|
|
83
|
+
const sSource = addStr("BlaDexXref.java");
|
|
84
|
+
const callerTypeStrIdx = [];
|
|
85
|
+
for (let i = 0; i < callerCount; i++) {
|
|
86
|
+
const hex = prng.hex(6);
|
|
87
|
+
callerTypeStrIdx.push(addStr(`Lcom/enclave/xref/ExternalInvokeCaller_${hex}_${i};`));
|
|
88
|
+
}
|
|
89
|
+
for (const extra of extraStrings) {
|
|
90
|
+
// DEX MUTF-8 string_data cannot contain U+0000; keep payloads clean.
|
|
91
|
+
addStr(extra.replace(/\0/g, " ").slice(0, 200));
|
|
92
|
+
}
|
|
93
|
+
// ----- type_ids (index into string_ids) -----
|
|
94
|
+
const types = [];
|
|
95
|
+
const typeIndex = new Map(); // stringIdx -> typeIdx
|
|
96
|
+
const addType = (stringIdx) => {
|
|
97
|
+
const existing = typeIndex.get(stringIdx);
|
|
98
|
+
if (existing !== undefined)
|
|
99
|
+
return existing;
|
|
100
|
+
const idx = types.length;
|
|
101
|
+
types.push(stringIdx);
|
|
102
|
+
typeIndex.set(stringIdx, idx);
|
|
103
|
+
return idx;
|
|
104
|
+
};
|
|
105
|
+
const tVoid = addType(sVoid);
|
|
106
|
+
const tObject = addType(sObject);
|
|
107
|
+
const tString = addType(sString);
|
|
108
|
+
const tLog = addType(sLog);
|
|
109
|
+
const callerTypeIdx = callerTypeStrIdx.map((si) => addType(si));
|
|
110
|
+
void tVoid; // referenced via proto return; kept for clarity
|
|
111
|
+
const protos = [
|
|
112
|
+
{ shortyIdx: sShortyLogD, returnTypeIdx: tVoid, paramTypeIdxs: [tString, tString] },
|
|
113
|
+
{ shortyIdx: sShortyVoid, returnTypeIdx: tVoid, paramTypeIdxs: [] },
|
|
114
|
+
];
|
|
115
|
+
const methods = [
|
|
116
|
+
{ classIdx: tLog, protoIdx: 0, nameIdx: sMethodD },
|
|
117
|
+
];
|
|
118
|
+
for (let i = 0; i < callerCount; i++) {
|
|
119
|
+
methods.push({
|
|
120
|
+
classIdx: callerTypeIdx[i],
|
|
121
|
+
protoIdx: 1,
|
|
122
|
+
nameIdx: sMethodBait,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// ----- Lay out the data section -----
|
|
126
|
+
// We'll assemble: string_data → type_list(s) → code_item(s) → class_data →
|
|
127
|
+
// map_list. Offsets are relative to start of file; header + id tables come
|
|
128
|
+
// first so we compute their size up front.
|
|
129
|
+
const headerSize = 0x70;
|
|
130
|
+
const stringIdsSize = strings.length * 4;
|
|
131
|
+
const typeIdsSize = types.length * 4;
|
|
132
|
+
const protoIdsSize = protos.length * 12;
|
|
133
|
+
const fieldIdsSize = 0;
|
|
134
|
+
const methodIdsSize = methods.length * 8;
|
|
135
|
+
const classDefsSize = callerCount * 32;
|
|
136
|
+
const idsEnd = headerSize +
|
|
137
|
+
stringIdsSize +
|
|
138
|
+
typeIdsSize +
|
|
139
|
+
protoIdsSize +
|
|
140
|
+
fieldIdsSize +
|
|
141
|
+
methodIdsSize +
|
|
142
|
+
classDefsSize;
|
|
143
|
+
let dataCursor = idsEnd;
|
|
144
|
+
const dataChunks = [];
|
|
145
|
+
const place = (buf, align = false) => {
|
|
146
|
+
if (align) {
|
|
147
|
+
const padded = align4(dataCursor) - dataCursor;
|
|
148
|
+
if (padded > 0) {
|
|
149
|
+
dataChunks.push({ offset: dataCursor, buf: Buffer.alloc(padded, 0) });
|
|
150
|
+
dataCursor += padded;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const off = dataCursor;
|
|
154
|
+
dataChunks.push({ offset: off, buf });
|
|
155
|
+
dataCursor += buf.length;
|
|
156
|
+
return off;
|
|
157
|
+
};
|
|
158
|
+
// string_data_item[] — MUTF-8 with uleb128 utf16_size prefix + NUL
|
|
159
|
+
const stringDataOffs = [];
|
|
160
|
+
for (const s of strings) {
|
|
161
|
+
const utf8 = Buffer.from(s, "utf8");
|
|
162
|
+
// Approximate utf16 length as utf8 length for ASCII-heavy payloads (our
|
|
163
|
+
// strings are ASCII). Canary payloads may contain non-BMP rarely; DEX
|
|
164
|
+
// requires modified UTF-8 — for BMP-only JS strings, utf16_size === code units.
|
|
165
|
+
let utf16Size = 0;
|
|
166
|
+
for (const ch of s) {
|
|
167
|
+
const cp = ch.codePointAt(0);
|
|
168
|
+
utf16Size += cp > 0xffff ? 2 : 1;
|
|
169
|
+
}
|
|
170
|
+
const item = Buffer.concat([encodeUleb128(utf16Size), utf8, Buffer.from([0])]);
|
|
171
|
+
stringDataOffs.push(place(item));
|
|
172
|
+
}
|
|
173
|
+
// type_list for Log.d params (String, String) — size uint32 + type_idx[] uint16, align 4
|
|
174
|
+
let logParamListOff = 0;
|
|
175
|
+
{
|
|
176
|
+
const paramBuf = Buffer.alloc(4 + 2 * 2);
|
|
177
|
+
paramBuf.writeUInt32LE(2, 0);
|
|
178
|
+
paramBuf.writeUInt16LE(tString, 4);
|
|
179
|
+
paramBuf.writeUInt16LE(tString, 6);
|
|
180
|
+
logParamListOff = place(paramBuf, true);
|
|
181
|
+
}
|
|
182
|
+
const protoParamOffs = [logParamListOff, 0];
|
|
183
|
+
// code_item for bait(): invoke-static {v0,v1}, Log.d ; return-void
|
|
184
|
+
// Format 35c invoke-static: op=0x71, A=2 args, method_idx=0, regs C=0 D=1
|
|
185
|
+
const insnBytes = Buffer.from([
|
|
186
|
+
0x71, 0x20, 0x00, 0x00, 0x10, 0x00, // invoke-static {v0, v1}, method@0 (Log.d)
|
|
187
|
+
0x0e, 0x00, // return-void
|
|
188
|
+
]);
|
|
189
|
+
const codeItemSize = 16 + insnBytes.length; // header 16 + 8 insn bytes
|
|
190
|
+
const codeItemTemplate = Buffer.alloc(codeItemSize);
|
|
191
|
+
codeItemTemplate.writeUInt16LE(2, 0); // registers_size
|
|
192
|
+
codeItemTemplate.writeUInt16LE(0, 2); // ins_size
|
|
193
|
+
codeItemTemplate.writeUInt16LE(2, 4); // outs_size
|
|
194
|
+
codeItemTemplate.writeUInt16LE(0, 6); // tries_size
|
|
195
|
+
codeItemTemplate.writeUInt32LE(0, 8); // debug_info_off
|
|
196
|
+
codeItemTemplate.writeUInt32LE(insnBytes.length / 2, 12); // insns_size (code units)
|
|
197
|
+
insnBytes.copy(codeItemTemplate, 16);
|
|
198
|
+
// Each caller gets its own code_item (identical body; unique off required by class_data)
|
|
199
|
+
const codeOffs = [];
|
|
200
|
+
for (let i = 0; i < callerCount; i++) {
|
|
201
|
+
codeOffs.push(place(Buffer.from(codeItemTemplate), true));
|
|
202
|
+
}
|
|
203
|
+
// class_data_item per caller: 0 static fields, 0 instance, 1 direct method, 0 virtual
|
|
204
|
+
const classDataOffs = [];
|
|
205
|
+
for (let i = 0; i < callerCount; i++) {
|
|
206
|
+
// method_idx_diff: methods[0] is Log.d; Caller_i.bait is methods[1+i]
|
|
207
|
+
// First direct method diff = (1+i) - 0 = 1+i
|
|
208
|
+
const methodIdxDiff = 1 + i;
|
|
209
|
+
const accessFlags = 0x0009; // public static
|
|
210
|
+
const parts = Buffer.concat([
|
|
211
|
+
encodeUleb128(0), // static_fields_size
|
|
212
|
+
encodeUleb128(0), // instance_fields_size
|
|
213
|
+
encodeUleb128(1), // direct_methods_size
|
|
214
|
+
encodeUleb128(0), // virtual_methods_size
|
|
215
|
+
encodeUleb128(methodIdxDiff),
|
|
216
|
+
encodeUleb128(accessFlags),
|
|
217
|
+
encodeUleb128(codeOffs[i]),
|
|
218
|
+
]);
|
|
219
|
+
classDataOffs.push(place(parts));
|
|
220
|
+
}
|
|
221
|
+
// map_list — required; list every section
|
|
222
|
+
// We'll finalize map after we know map's own offset.
|
|
223
|
+
const mapStart = align4(dataCursor);
|
|
224
|
+
if (mapStart !== dataCursor) {
|
|
225
|
+
place(Buffer.alloc(mapStart - dataCursor, 0));
|
|
226
|
+
}
|
|
227
|
+
// map entries (type, unused, size, offset) — 12 bytes each, plus uint32 size header
|
|
228
|
+
// Types from dalvik docs:
|
|
229
|
+
const TYPE_HEADER_ITEM = 0x0000;
|
|
230
|
+
const TYPE_STRING_ID_ITEM = 0x0001;
|
|
231
|
+
const TYPE_TYPE_ID_ITEM = 0x0002;
|
|
232
|
+
const TYPE_PROTO_ID_ITEM = 0x0003;
|
|
233
|
+
const TYPE_METHOD_ID_ITEM = 0x0005;
|
|
234
|
+
const TYPE_CLASS_DEF_ITEM = 0x0006;
|
|
235
|
+
const TYPE_CODE_ITEM = 0x2001;
|
|
236
|
+
const TYPE_STRING_DATA_ITEM = 0x2002;
|
|
237
|
+
const TYPE_TYPE_LIST = 0x1001;
|
|
238
|
+
const TYPE_CLASS_DATA_ITEM = 0x2000;
|
|
239
|
+
const TYPE_MAP_LIST = 0x1000;
|
|
240
|
+
const mapEntries = [
|
|
241
|
+
{ type: TYPE_HEADER_ITEM, size: 1, offset: 0 },
|
|
242
|
+
{ type: TYPE_STRING_ID_ITEM, size: strings.length, offset: headerSize },
|
|
243
|
+
{
|
|
244
|
+
type: TYPE_TYPE_ID_ITEM,
|
|
245
|
+
size: types.length,
|
|
246
|
+
offset: headerSize + stringIdsSize,
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
type: TYPE_PROTO_ID_ITEM,
|
|
250
|
+
size: protos.length,
|
|
251
|
+
offset: headerSize + stringIdsSize + typeIdsSize,
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: TYPE_METHOD_ID_ITEM,
|
|
255
|
+
size: methods.length,
|
|
256
|
+
offset: headerSize + stringIdsSize + typeIdsSize + protoIdsSize + fieldIdsSize,
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
type: TYPE_CLASS_DEF_ITEM,
|
|
260
|
+
size: callerCount,
|
|
261
|
+
offset: headerSize +
|
|
262
|
+
stringIdsSize +
|
|
263
|
+
typeIdsSize +
|
|
264
|
+
protoIdsSize +
|
|
265
|
+
fieldIdsSize +
|
|
266
|
+
methodIdsSize,
|
|
267
|
+
},
|
|
268
|
+
{ type: TYPE_TYPE_LIST, size: 1, offset: logParamListOff },
|
|
269
|
+
{
|
|
270
|
+
type: TYPE_CODE_ITEM,
|
|
271
|
+
size: callerCount,
|
|
272
|
+
offset: codeOffs[0],
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
type: TYPE_STRING_DATA_ITEM,
|
|
276
|
+
size: strings.length,
|
|
277
|
+
offset: stringDataOffs[0],
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
type: TYPE_CLASS_DATA_ITEM,
|
|
281
|
+
size: callerCount,
|
|
282
|
+
offset: classDataOffs[0],
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
const mapListSize = 4 + (mapEntries.length + 1) * 12; // +1 for MAP_LIST itself
|
|
286
|
+
const mapOff = dataCursor;
|
|
287
|
+
const mapBuf = Buffer.alloc(mapListSize);
|
|
288
|
+
mapBuf.writeUInt32LE(mapEntries.length + 1, 0);
|
|
289
|
+
let mapAt = 4;
|
|
290
|
+
for (const e of mapEntries) {
|
|
291
|
+
mapBuf.writeUInt16LE(e.type, mapAt);
|
|
292
|
+
mapBuf.writeUInt16LE(0, mapAt + 2);
|
|
293
|
+
mapBuf.writeUInt32LE(e.size, mapAt + 4);
|
|
294
|
+
mapBuf.writeUInt32LE(e.offset, mapAt + 8);
|
|
295
|
+
mapAt += 12;
|
|
296
|
+
}
|
|
297
|
+
// Self entry
|
|
298
|
+
mapBuf.writeUInt16LE(TYPE_MAP_LIST, mapAt);
|
|
299
|
+
mapBuf.writeUInt16LE(0, mapAt + 2);
|
|
300
|
+
mapBuf.writeUInt32LE(1, mapAt + 4);
|
|
301
|
+
mapBuf.writeUInt32LE(mapOff, mapAt + 8);
|
|
302
|
+
place(mapBuf);
|
|
303
|
+
const fileSize = dataCursor;
|
|
304
|
+
// ----- Write the full file -----
|
|
305
|
+
const out = Buffer.alloc(fileSize, 0);
|
|
306
|
+
// header
|
|
307
|
+
out.write("dex\n035\0", 0, "ascii");
|
|
308
|
+
// checksum + signature filled later
|
|
309
|
+
out.writeUInt32LE(fileSize, 32);
|
|
310
|
+
out.writeUInt32LE(headerSize, 36);
|
|
311
|
+
out.writeUInt32LE(0x12345678, 40); // endian_tag
|
|
312
|
+
out.writeUInt32LE(0, 44); // link_size
|
|
313
|
+
out.writeUInt32LE(0, 48); // link_off
|
|
314
|
+
out.writeUInt32LE(mapOff, 52);
|
|
315
|
+
out.writeUInt32LE(strings.length, 56);
|
|
316
|
+
out.writeUInt32LE(headerSize, 60); // string_ids_off
|
|
317
|
+
out.writeUInt32LE(types.length, 64);
|
|
318
|
+
out.writeUInt32LE(headerSize + stringIdsSize, 68); // type_ids_off
|
|
319
|
+
out.writeUInt32LE(protos.length, 72);
|
|
320
|
+
out.writeUInt32LE(headerSize + stringIdsSize + typeIdsSize, 76); // proto_ids_off
|
|
321
|
+
out.writeUInt32LE(0, 80); // field_ids_size
|
|
322
|
+
out.writeUInt32LE(0, 84); // field_ids_off
|
|
323
|
+
out.writeUInt32LE(methods.length, 88);
|
|
324
|
+
out.writeUInt32LE(headerSize + stringIdsSize + typeIdsSize + protoIdsSize + fieldIdsSize, 92); // method_ids_off
|
|
325
|
+
out.writeUInt32LE(callerCount, 96);
|
|
326
|
+
out.writeUInt32LE(headerSize +
|
|
327
|
+
stringIdsSize +
|
|
328
|
+
typeIdsSize +
|
|
329
|
+
protoIdsSize +
|
|
330
|
+
fieldIdsSize +
|
|
331
|
+
methodIdsSize, 100); // class_defs_off
|
|
332
|
+
out.writeUInt32LE(fileSize - idsEnd, 104); // data_size
|
|
333
|
+
out.writeUInt32LE(idsEnd, 108); // data_off
|
|
334
|
+
// string_ids
|
|
335
|
+
let at = headerSize;
|
|
336
|
+
for (const off of stringDataOffs) {
|
|
337
|
+
out.writeUInt32LE(off, at);
|
|
338
|
+
at += 4;
|
|
339
|
+
}
|
|
340
|
+
// type_ids
|
|
341
|
+
for (const si of types) {
|
|
342
|
+
out.writeUInt32LE(si, at);
|
|
343
|
+
at += 4;
|
|
344
|
+
}
|
|
345
|
+
// proto_ids
|
|
346
|
+
for (let i = 0; i < protos.length; i++) {
|
|
347
|
+
const p = protos[i];
|
|
348
|
+
out.writeUInt32LE(p.shortyIdx, at);
|
|
349
|
+
out.writeUInt32LE(p.returnTypeIdx, at + 4);
|
|
350
|
+
out.writeUInt32LE(protoParamOffs[i], at + 8);
|
|
351
|
+
at += 12;
|
|
352
|
+
}
|
|
353
|
+
// method_ids
|
|
354
|
+
for (const m of methods) {
|
|
355
|
+
out.writeUInt16LE(m.classIdx, at);
|
|
356
|
+
out.writeUInt16LE(m.protoIdx, at + 2);
|
|
357
|
+
out.writeUInt32LE(m.nameIdx, at + 4);
|
|
358
|
+
at += 8;
|
|
359
|
+
}
|
|
360
|
+
// class_defs
|
|
361
|
+
for (let i = 0; i < callerCount; i++) {
|
|
362
|
+
out.writeUInt32LE(callerTypeIdx[i], at); // class_idx
|
|
363
|
+
out.writeUInt32LE(0x0001, at + 4); // ACC_PUBLIC
|
|
364
|
+
out.writeUInt32LE(tObject, at + 8); // superclass
|
|
365
|
+
out.writeUInt32LE(0, at + 12); // interfaces_off
|
|
366
|
+
out.writeUInt32LE(sSource, at + 16); // source_file_idx
|
|
367
|
+
out.writeUInt32LE(0, at + 20); // annotations_off
|
|
368
|
+
out.writeUInt32LE(classDataOffs[i], at + 24); // class_data_off
|
|
369
|
+
out.writeUInt32LE(0, at + 28); // static_values_off
|
|
370
|
+
at += 32;
|
|
371
|
+
}
|
|
372
|
+
// data chunks
|
|
373
|
+
for (const chunk of dataChunks) {
|
|
374
|
+
chunk.buf.copy(out, chunk.offset);
|
|
375
|
+
}
|
|
376
|
+
// Keep marker reachable for inspect
|
|
377
|
+
void sMarker;
|
|
378
|
+
// SHA-1 signature over bytes [32..end] → [12..32]
|
|
379
|
+
const sha1 = createHash("sha1").update(out.subarray(32)).digest();
|
|
380
|
+
sha1.copy(out, 12);
|
|
381
|
+
// Adler32 checksum over bytes [12..end] → [8..12]
|
|
382
|
+
let a = 1;
|
|
383
|
+
let b = 0;
|
|
384
|
+
for (let i = 12; i < out.length; i++) {
|
|
385
|
+
a = (a + out[i]) % 65521;
|
|
386
|
+
b = (b + a) % 65521;
|
|
387
|
+
}
|
|
388
|
+
out.writeUInt32LE(((b << 16) | a) >>> 0, 8);
|
|
389
|
+
return { buffer: out, callerCount };
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Generate a decoy DEX that saturates REA #8154's external-invoke caller
|
|
393
|
+
* inventory (`MAX_EXTERNAL_XREF_BYTES`).
|
|
394
|
+
*/
|
|
395
|
+
export function generateAndroidDexXrefCounter(prng, intensity = "balanced") {
|
|
396
|
+
const callerCount = intensityCallerCount(intensity);
|
|
397
|
+
const deception = buildCanaryAndDiagnosticPayloads(prng, intensity);
|
|
398
|
+
// Embed a handful of canary/diagnostic strings so string-pool scanners also
|
|
399
|
+
// surface honeypots; does not affect invoke budgets.
|
|
400
|
+
const extras = deception.textRecords.slice(0, 12);
|
|
401
|
+
const built = buildExternalInvokeDex(prng, callerCount, extras);
|
|
402
|
+
// Sanity: callers should exceed what a single ~1 MiB inventory comfortably holds
|
|
403
|
+
// at bankrupt/maximum. We don't assert the byte math here — unit tests do.
|
|
404
|
+
void REA_INTERNAL_LIMITS.ANDROID_EXTERNAL_XREF_BYTES;
|
|
405
|
+
return {
|
|
406
|
+
dexBuffer: built.buffer,
|
|
407
|
+
callerClassesEmitted: built.callerCount,
|
|
408
|
+
externalMethodRefs: 1,
|
|
409
|
+
marker: "BLA-DEX-XREF-V1",
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/** Next free `classesN.dex` name given existing ZIP entry names. */
|
|
413
|
+
export function nextMultidexName(existingNames) {
|
|
414
|
+
let max = 1; // classes.dex counts as 1
|
|
415
|
+
for (const name of existingNames) {
|
|
416
|
+
const base = name.split("/").pop() ?? name;
|
|
417
|
+
if (/^classes\.dex$/i.test(base)) {
|
|
418
|
+
max = Math.max(max, 1);
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
const m = /^classes(\d+)\.dex$/i.exec(base);
|
|
422
|
+
if (m)
|
|
423
|
+
max = Math.max(max, Number(m[1]));
|
|
424
|
+
}
|
|
425
|
+
return `classes${max + 1}.dex`;
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=android-dex-xref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-dex-xref.js","sourceRoot":"","sources":["../../../src/shields/formats/android-dex-xref.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SeededPrng } from "../../core/prng.js";
|
|
2
|
+
import type { ProtectionIntensity } from "../../core/types.js";
|
|
3
|
+
export interface AndroidManifestCounterResult {
|
|
4
|
+
/** Well-formed UTF-8 AndroidManifest.xml (never binary AXML). */
|
|
5
|
+
readonly manifestXml: string;
|
|
6
|
+
/** Named component declarations emitted (activities/services/…). */
|
|
7
|
+
readonly namedComponentsEmitted: number;
|
|
8
|
+
/** Declarations deliberately missing `android:name` (unnamed flood). */
|
|
9
|
+
readonly unnamedComponentsEmitted: number;
|
|
10
|
+
/** Names containing `@` / `?` / `${…}` unresolved tokens. */
|
|
11
|
+
readonly unresolvedTokenNames: number;
|
|
12
|
+
/** Nested `$` class names preserved for REA #7818 spelling retention. */
|
|
13
|
+
readonly nestedDollarNames: number;
|
|
14
|
+
/** Intent-filter children planted per high-intensity activity. */
|
|
15
|
+
readonly intentFiltersPerHeavy: number;
|
|
16
|
+
/** Provider authority segments planted on the flood provider. */
|
|
17
|
+
readonly authoritySegmentsEmitted: number;
|
|
18
|
+
readonly chaffPayloadsEmbedded: number;
|
|
19
|
+
readonly canaryTokensEmbedded: number;
|
|
20
|
+
readonly diagnosticsEmbedded: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generates a caller-tempting, well-formed decoy `AndroidManifest.xml` that
|
|
24
|
+
* counters REA's static component inventory (`parseAndroidManifestComponents`,
|
|
25
|
+
* REA #7379) and its spelling-preserving binary-XML decode path (#7818):
|
|
26
|
+
*
|
|
27
|
+
* - Named declarations past `ANDROID_MANIFEST_LIMITS.components` (512) force
|
|
28
|
+
* `capacityTruncated` → inventory `status: "partial"`.
|
|
29
|
+
* - Long package-relative names burn `resolvedNameBytes` (1 MiB) so later
|
|
30
|
+
* names keep their declared form (`unresolvedNames`).
|
|
31
|
+
* - Unnamed / `@string/` / `${placeholder}` declarations trigger the
|
|
32
|
+
* corresponding limitation strings REA itself publishes.
|
|
33
|
+
* - Nested `$` class names exercise #7818's "preserve component spelling".
|
|
34
|
+
* - Provider authority floods past `authorities: 64` and intent-filter floods
|
|
35
|
+
* past `intentFilters: 32` / `intentValues: 64` deepen the partial admission.
|
|
36
|
+
*
|
|
37
|
+
* Red-line safe: this is a NEW decoy XML artifact (sidecar under
|
|
38
|
+
* `assets/bla-shield/`). It never rewrites the developer's root
|
|
39
|
+
* `AndroidManifest.xml`, never changes the real export surface, and never
|
|
40
|
+
* emits binary AXML that could invalidate an APK signature check path we
|
|
41
|
+
* already refuse for signed APKs.
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateAndroidManifestCounter(prng: SeededPrng, intensity?: ProtectionIntensity): AndroidManifestCounterResult;
|
|
44
|
+
//# sourceMappingURL=android-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-manifest.d.ts","sourceRoot":"","sources":["../../../src/shields/formats/android-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK/D,MAAM,WAAW,4BAA4B;IAC3C,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,6DAA6D;IAC7D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,yEAAyE;IACzE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,iEAAiE;IACjE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAiED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,UAAU,EAChB,SAAS,GAAE,mBAAgC,GAC1C,4BAA4B,CA6N9B"}
|