@zsa233/frida-analykit-agent 2.0.0 → 2.0.1
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/dist/api/android.d.ts +41 -0
- package/dist/api/android.js +1 -0
- package/dist/bridges.d.ts +4 -0
- package/dist/bridges.js +8 -0
- package/dist/cmodule/scan_adrp.d.ts +9 -0
- package/{src/cmodule/scan_adrp.ts → dist/cmodule/scan_adrp.js} +19 -30
- package/dist/config.d.ts +26 -0
- package/dist/config.js +27 -0
- package/dist/consts.d.ts +18 -0
- package/dist/consts.js +23 -0
- package/dist/elf/insn.d.ts +10 -0
- package/dist/elf/insn.js +43 -0
- package/dist/elf/module.d.ts +95 -0
- package/dist/elf/module.js +632 -0
- package/dist/elf/struct.d.ts +235 -0
- package/{src/elf/struct.ts → dist/elf/struct.js} +63 -149
- package/dist/elf/tools.d.ts +6 -0
- package/dist/elf/tools.js +25 -0
- package/dist/elf/verifier.d.ts +11 -0
- package/dist/elf/verifier.js +57 -0
- package/dist/elf/xref.d.ts +32 -0
- package/dist/elf/xref.js +271 -0
- package/dist/func.d.ts +7 -0
- package/dist/func.js +23 -0
- package/dist/helper.d.ts +130 -0
- package/dist/helper.js +527 -0
- package/{src/index.ts → dist/index.d.ts} +0 -1
- package/dist/index.js +9 -0
- package/dist/jni/env.d.ts +821 -0
- package/dist/jni/env.js +1054 -0
- package/{src/jni/struct.ts → dist/jni/struct.d.ts} +8 -54
- package/dist/jni/struct.js +173 -0
- package/dist/lib/libc.d.ts +68 -0
- package/dist/lib/libc.js +125 -0
- package/dist/lib/libssl.d.ts +23 -0
- package/dist/lib/libssl.js +60 -0
- package/dist/message.d.ts +18 -0
- package/dist/message.js +21 -0
- package/dist/net/ssl.d.ts +29 -0
- package/dist/net/ssl.js +249 -0
- package/dist/net/struct.d.ts +34 -0
- package/{src/net/struct.ts → dist/net/struct.js} +4 -18
- package/dist/net/tools.js +1 -0
- package/dist/process.d.ts +43 -0
- package/dist/process.js +77 -0
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.js +248 -0
- package/dist/utils/array_pointer.d.ts +21 -0
- package/dist/utils/array_pointer.js +81 -0
- package/dist/utils/queue.d.ts +19 -0
- package/dist/utils/queue.js +89 -0
- package/dist/utils/scan.d.ts +35 -0
- package/dist/utils/scan.js +72 -0
- package/dist/utils/std.d.ts +40 -0
- package/dist/utils/std.js +128 -0
- package/dist/utils/text_endec.d.ts +8 -0
- package/dist/utils/text_endec.js +29 -0
- package/dist/utils/utils.d.ts +28 -0
- package/dist/utils/utils.js +66 -0
- package/package.json +18 -5
- package/src/api/android.ts +0 -80
- package/src/bridges.ts +0 -18
- package/src/cmodule/scan_adrp.c +0 -81
- package/src/config.ts +0 -56
- package/src/consts.ts +0 -31
- package/src/elf/insn.ts +0 -61
- package/src/elf/module.ts +0 -751
- package/src/elf/tools.ts +0 -33
- package/src/elf/verifier.ts +0 -74
- package/src/elf/xref.ts +0 -360
- package/src/func.ts +0 -32
- package/src/helper.ts +0 -685
- package/src/jni/env.ts +0 -1439
- package/src/lib/libc.ts +0 -161
- package/src/lib/libssl.ts +0 -95
- package/src/message.ts +0 -26
- package/src/net/ssl.ts +0 -360
- package/src/process.ts +0 -137
- package/src/rpc.ts +0 -268
- package/src/runtime-globals.d.ts +0 -11
- package/src/utils/array_pointer.ts +0 -102
- package/src/utils/queue.ts +0 -102
- package/src/utils/scan.ts +0 -103
- package/src/utils/std.ts +0 -165
- package/src/utils/text_endec.ts +0 -35
- package/src/utils/utils.ts +0 -111
- /package/{src/net/tools.ts → dist/net/tools.d.ts} +0 -0
package/dist/elf/xref.js
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { help } from "../helper.js";
|
|
2
|
+
import { ScanAdrpCMod } from "../cmodule/scan_adrp.js";
|
|
3
|
+
import { setGlobalProperties } from "../config.js";
|
|
4
|
+
import { InstructionSequence } from "./insn.js";
|
|
5
|
+
function countLeadingSignBits(input, width) {
|
|
6
|
+
if (width < 1 || width > 64) {
|
|
7
|
+
throw new RangeError('width must be between 1 and 64');
|
|
8
|
+
}
|
|
9
|
+
const mask = (1n << BigInt(width)) - 1n;
|
|
10
|
+
let value = BigInt(input) & mask;
|
|
11
|
+
const signBit = (value >> BigInt(width - 1)) & 1n;
|
|
12
|
+
let count = 0;
|
|
13
|
+
for (let i = width - 1; i >= 0; i--) {
|
|
14
|
+
const bit = (value >> BigInt(i)) & 1n;
|
|
15
|
+
if (bit === signBit) {
|
|
16
|
+
count++;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return count;
|
|
23
|
+
}
|
|
24
|
+
function choiceMatchPattern(p, byteNum) {
|
|
25
|
+
return p.toMatchPattern().split(/\s+/).slice(0, byteNum).join(' ');
|
|
26
|
+
}
|
|
27
|
+
function stripLeadingZeros(hexDump) {
|
|
28
|
+
const parts = hexDump.trim().split(/\s+/);
|
|
29
|
+
let count = 0;
|
|
30
|
+
for (const part of parts) {
|
|
31
|
+
if (part.toLowerCase() === '00') {
|
|
32
|
+
count++;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const strippedParts = parts.slice(count);
|
|
39
|
+
return {
|
|
40
|
+
count,
|
|
41
|
+
stripped: strippedParts.join(' ')
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export class AdrlXref {
|
|
45
|
+
constructor(target) {
|
|
46
|
+
this.target = target;
|
|
47
|
+
}
|
|
48
|
+
get targetPage() {
|
|
49
|
+
return this.target.and(ptr('0xfff').not());
|
|
50
|
+
}
|
|
51
|
+
get targetPageOffset() {
|
|
52
|
+
return this.target.and('0xfff');
|
|
53
|
+
}
|
|
54
|
+
scanAdrl(scanRange, maxGapToAdd = 16) {
|
|
55
|
+
const { base, size } = scanRange;
|
|
56
|
+
const targetPage = this.targetPage;
|
|
57
|
+
// adrp
|
|
58
|
+
const op = ptr(0b1);
|
|
59
|
+
const adrpMatches = [];
|
|
60
|
+
const pageMask = ptr(Process.pageSize - 1).not();
|
|
61
|
+
const adrpImmLenMask = ptr(0x1FFFFF);
|
|
62
|
+
help.memoryReadDo(base, size, (makeReadable, makeRecovery) => {
|
|
63
|
+
makeReadable();
|
|
64
|
+
const ranges = [];
|
|
65
|
+
if (this.target <= base) {
|
|
66
|
+
ranges.push({ base, size, high: true });
|
|
67
|
+
}
|
|
68
|
+
else if (this.target >= base.add(size)) {
|
|
69
|
+
ranges.push({ base, size, high: false });
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
ranges.push({ base, size: Number(this.target.sub(base)), high: false });
|
|
73
|
+
ranges.push({ base: this.target, size: size - Number(this.target.sub(base)), high: true });
|
|
74
|
+
}
|
|
75
|
+
for (let range of ranges) {
|
|
76
|
+
const minPage = range.base.and(pageMask);
|
|
77
|
+
const maxPage = range.base.add(range.size).and(pageMask);
|
|
78
|
+
const maxPageDelta = targetPage.sub(minPage).shr(12).and(adrpImmLenMask);
|
|
79
|
+
const minPageDelta = targetPage.sub(maxPage).shr(12).and(adrpImmLenMask);
|
|
80
|
+
let immVal;
|
|
81
|
+
let leadingCount;
|
|
82
|
+
if (range.high) {
|
|
83
|
+
leadingCount = countLeadingSignBits(BigInt(minPageDelta.toString()), 21);
|
|
84
|
+
immVal = adrpImmLenMask;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
leadingCount = countLeadingSignBits(BigInt(maxPageDelta.toString()), 21);
|
|
88
|
+
immVal = NULL;
|
|
89
|
+
}
|
|
90
|
+
const immMask = ptr((((1n << BigInt(leadingCount)) - 1n) << BigInt(21 - leadingCount)).toString());
|
|
91
|
+
const B = ptr(1);
|
|
92
|
+
const immloMask = immMask.and(0b11);
|
|
93
|
+
const immhiMask = immMask.shr(2);
|
|
94
|
+
const anyRdMask = NULL;
|
|
95
|
+
const adrpMask = choiceMatchPattern(NULL.or(B.shl(31))
|
|
96
|
+
.or(immloMask.shl(29))
|
|
97
|
+
.or(AdrlXref.ADRP_FIXED28_24_BITSET_MASK)
|
|
98
|
+
.or(immhiMask.shl(5))
|
|
99
|
+
.or(anyRdMask), 4);
|
|
100
|
+
const { stripped: adrpMaskStripped, count: alignOffset } = stripLeadingZeros(adrpMask);
|
|
101
|
+
const immlo = immVal.and(0b11);
|
|
102
|
+
const immhi = immVal.shr(2);
|
|
103
|
+
const anyRd = NULL;
|
|
104
|
+
const adrpSign = choiceMatchPattern(NULL.or(op.shl(31))
|
|
105
|
+
.or(immlo.shl(29))
|
|
106
|
+
.or(AdrlXref.ADRP_FIXED28_24_BITSET_MASK)
|
|
107
|
+
.or(immhi.shl(5))
|
|
108
|
+
.or(anyRd), 4);
|
|
109
|
+
const adrpSignStripped = adrpSign.split(/\s+/).slice(alignOffset).join(' ');
|
|
110
|
+
const scanPattern = `${adrpSignStripped} : ${adrpMaskStripped}`;
|
|
111
|
+
const scanRes = ScanAdrpCMod.scan(range, scanPattern, this.target, alignOffset);
|
|
112
|
+
if (scanRes.length) {
|
|
113
|
+
adrpMatches.push(...scanRes);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
makeRecovery();
|
|
117
|
+
});
|
|
118
|
+
const adrpInstructions = adrpMatches.reduce((acc, v) => {
|
|
119
|
+
const adrl = this.verify(v, maxGapToAdd);
|
|
120
|
+
if (adrl) {
|
|
121
|
+
acc.push(adrl);
|
|
122
|
+
}
|
|
123
|
+
return acc;
|
|
124
|
+
}, []);
|
|
125
|
+
return adrpInstructions;
|
|
126
|
+
}
|
|
127
|
+
// adrp + add
|
|
128
|
+
scanAdrlSlow(scanRange, maxGapToAdd = 16) {
|
|
129
|
+
const { base, size } = scanRange;
|
|
130
|
+
const targetPage = this.targetPage;
|
|
131
|
+
// adrp
|
|
132
|
+
const op = ptr(0b1);
|
|
133
|
+
const adrpPageMask = choiceMatchPattern(ptr(0x9fffffe0), 4);
|
|
134
|
+
const adrpMatches = [];
|
|
135
|
+
help.memoryReadPageDo(base, size, (page) => {
|
|
136
|
+
const { readable } = page;
|
|
137
|
+
const range = { base: page.base, size: page.size };
|
|
138
|
+
if (!range) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
else if (!readable) {
|
|
142
|
+
console.error(`[AdrlXref] scanAdrp base[${range.base} => ${range.base.add(range.size)}] is unreadable.`);
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
const pcPage = range.base;
|
|
146
|
+
const pageDelta = targetPage.sub(pcPage).shr(3 * 4).and(0x1FFFFF); // immhi:immlo = 21位
|
|
147
|
+
const immlo = pageDelta.and(0b11);
|
|
148
|
+
const immhi = pageDelta.shr(2);
|
|
149
|
+
const anyRd = NULL;
|
|
150
|
+
const adrpSign = choiceMatchPattern(NULL.or(op.shl(31))
|
|
151
|
+
.or(immlo.shl(29))
|
|
152
|
+
.or(AdrlXref.ADRP_FIXED28_24_BITSET_MASK)
|
|
153
|
+
.or(immhi.shl(5))
|
|
154
|
+
.or(anyRd), 4);
|
|
155
|
+
const scanPattern = `${adrpSign} : ${adrpPageMask}`;
|
|
156
|
+
const scanResults = Memory.scanSync(range.base, range.size, scanPattern).filter(v => {
|
|
157
|
+
return v.address.and(0x3).isNull();
|
|
158
|
+
});
|
|
159
|
+
adrpMatches.push(...scanResults);
|
|
160
|
+
return false;
|
|
161
|
+
});
|
|
162
|
+
const adrpInstructions = adrpMatches.reduce((acc, v) => {
|
|
163
|
+
const adrl = this.verify(v.address, maxGapToAdd);
|
|
164
|
+
if (adrl) {
|
|
165
|
+
acc.push(adrl);
|
|
166
|
+
}
|
|
167
|
+
return acc;
|
|
168
|
+
}, []);
|
|
169
|
+
return adrpInstructions;
|
|
170
|
+
}
|
|
171
|
+
verify(p, maxGapToAdd = 16) {
|
|
172
|
+
try {
|
|
173
|
+
const maybeAdrl = Adrl.loadFromPointer(p);
|
|
174
|
+
const adrpInsn = maybeAdrl.adrpInsn;
|
|
175
|
+
if (adrpInsn.mnemonic !== 'adrp') {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
if (maybeAdrl.getTarget(false, maxGapToAdd)?.equals(this.target)) {
|
|
179
|
+
return maybeAdrl;
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
scanAdr() {
|
|
188
|
+
// TODO:
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/* adr/adrp Xi, #{imm1}
|
|
193
|
+
------------------------------------------------------------------
|
|
194
|
+
| 31 | 30 ─ 29 | 28 27 26 25 24 | 23 ──────────────── 5 | 4 ─ 0 |
|
|
195
|
+
| op | immlo | 1 0 0 0 0 | immhi (19b) | Rd |
|
|
196
|
+
------------------------------------------------------------------
|
|
197
|
+
adr : op=0
|
|
198
|
+
adrp: op=1
|
|
199
|
+
*/
|
|
200
|
+
/* add Xm, Xn, #{imm2}
|
|
201
|
+
----------------------------------------------------------------------
|
|
202
|
+
| 31 | 30 | 29 | 28 27 26 25 24 | 23 ─ 22 | 21 ─ 10 | 9 ─ 5 | 4 ─ 0 |
|
|
203
|
+
| sf | op | S | 1 0 0 0 1 | sh | imm12 | Rn | Rd |
|
|
204
|
+
----------------------------------------------------------------------
|
|
205
|
+
*/
|
|
206
|
+
AdrlXref.ADRP_FIXED28_24_BITSET_MASK = ptr(0b10000).shl(24);
|
|
207
|
+
export class Adrl extends InstructionSequence {
|
|
208
|
+
constructor(adrp, add) {
|
|
209
|
+
super(adrp);
|
|
210
|
+
this.adrpInsn = adrp;
|
|
211
|
+
this.addInsn = add;
|
|
212
|
+
}
|
|
213
|
+
get instruction() {
|
|
214
|
+
return Instruction.parse(this.$handle);
|
|
215
|
+
}
|
|
216
|
+
scanBL(base, maxGap = 16) {
|
|
217
|
+
if (!base) {
|
|
218
|
+
base = this.$handle;
|
|
219
|
+
}
|
|
220
|
+
let inc = 0;
|
|
221
|
+
for (const insn of this) {
|
|
222
|
+
switch (insn.mnemonic) {
|
|
223
|
+
case 'bl':
|
|
224
|
+
return {
|
|
225
|
+
src: this,
|
|
226
|
+
insn: insn,
|
|
227
|
+
next: insn.next,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
inc++;
|
|
231
|
+
if (inc >= maxGap)
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
getTarget(mustFoundAdd = false, maxGapToAdd = 16) {
|
|
237
|
+
const [op1, op2] = this.adrpInsn.operands;
|
|
238
|
+
const target = ptr(op2.value.toString());
|
|
239
|
+
if (!this.addInsn) {
|
|
240
|
+
let inc = 0;
|
|
241
|
+
verifyLoop: for (const insn of this) {
|
|
242
|
+
switch (insn.mnemonic) {
|
|
243
|
+
case 'add':
|
|
244
|
+
if (insn.operands.length !== 3) {
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
const [addOp1, addOp2, addOp3] = insn.operands;
|
|
248
|
+
if (addOp1.value !== op1.value) {
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
if (addOp2.value !== addOp1.value) {
|
|
252
|
+
console.error(`[Adrl] findAdd [${insn}] op2,来源于另一个寄存器,无法预估目标地址。`);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
this.addInsn = insn;
|
|
256
|
+
break verifyLoop;
|
|
257
|
+
}
|
|
258
|
+
inc++;
|
|
259
|
+
if (inc >= maxGapToAdd)
|
|
260
|
+
return mustFoundAdd ? null : target;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (!this.addInsn) {
|
|
264
|
+
return target;
|
|
265
|
+
}
|
|
266
|
+
return target.add(this.addInsn.operands[2].value.toString());
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
setGlobalProperties({
|
|
270
|
+
AdrlXref,
|
|
271
|
+
});
|
package/dist/func.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class FuncHelper {
|
|
2
|
+
static list: any[];
|
|
3
|
+
static $nativeWrapper<RetType extends NativeFunctionReturnType>(retType: RetType, argTypes: any[]): (f: NativePointer, wrapFunc: AnyFunction) => NativeCallback<RetType, any[]>;
|
|
4
|
+
static atexit: (f: NativePointer, wrapFunc: AnyFunction) => NativeCallback<"void", any[]>;
|
|
5
|
+
static pthread_start_routine: (f: NativePointer, wrapFunc: AnyFunction) => NativeCallback<"pointer", any[]>;
|
|
6
|
+
static SSL_CTX_keylog_callback: (f: NativePointer, wrapFunc: AnyFunction) => NativeCallback<"void", any[]>;
|
|
7
|
+
}
|
package/dist/func.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { nativeFunctionOptions } from "./consts.js";
|
|
3
|
+
export class FuncHelper {
|
|
4
|
+
static $nativeWrapper(retType, argTypes) {
|
|
5
|
+
return function (f, wrapFunc) {
|
|
6
|
+
const impl = f.isNull() ? NULL : new NativeFunction(f, retType, argTypes, nativeFunctionOptions);
|
|
7
|
+
const wrapper = function () {
|
|
8
|
+
return wrapFunc(impl, ...Array.from(arguments));
|
|
9
|
+
};
|
|
10
|
+
const cb = new NativeCallback(wrapper, retType, argTypes);
|
|
11
|
+
_a.list.push(cb);
|
|
12
|
+
return cb;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
_a = FuncHelper;
|
|
17
|
+
FuncHelper.list = [];
|
|
18
|
+
// int __cxa_atexit(void (*f)(void *), void *objptr, void *dso);
|
|
19
|
+
FuncHelper.atexit = _a.$nativeWrapper('void', ['pointer']);
|
|
20
|
+
// int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
|
|
21
|
+
FuncHelper.pthread_start_routine = _a.$nativeWrapper('pointer', ['pointer']);
|
|
22
|
+
// void (*keylog_callback)(const SSL *ssl, const char *line)
|
|
23
|
+
FuncHelper.SSL_CTX_keylog_callback = _a.$nativeWrapper('void', ['pointer', 'pointer']);
|
package/dist/helper.d.ts
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Libc } from './lib/libc.js';
|
|
2
|
+
import { RPCMsgType } from './message.js';
|
|
3
|
+
import { LogLevel } from './config.js';
|
|
4
|
+
export declare class NativePointerObject {
|
|
5
|
+
protected readonly _handle: NativePointer;
|
|
6
|
+
constructor(handle: NativePointer);
|
|
7
|
+
get $handle(): NativePointer;
|
|
8
|
+
$isNull(): boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function downAlign(value: number, alignTo: number): number;
|
|
11
|
+
export declare function upAlign(value: number, alignTo: number): number;
|
|
12
|
+
export declare function page_start(value: number): number;
|
|
13
|
+
export declare function page_end(value: number): number;
|
|
14
|
+
export declare class LoggerState {
|
|
15
|
+
private msgs;
|
|
16
|
+
private base_msgs;
|
|
17
|
+
private match_offset;
|
|
18
|
+
private depth;
|
|
19
|
+
private counter;
|
|
20
|
+
private index;
|
|
21
|
+
constructor(depth?: number);
|
|
22
|
+
onLog(msg: string): string[];
|
|
23
|
+
}
|
|
24
|
+
export declare class FileHelper extends NativePointerObject {
|
|
25
|
+
private _isClosed;
|
|
26
|
+
private readonly _weakRefId;
|
|
27
|
+
constructor(pathname: string, mode: string);
|
|
28
|
+
close(): number;
|
|
29
|
+
writeLine(data: string, append?: string): number;
|
|
30
|
+
flush(): number;
|
|
31
|
+
}
|
|
32
|
+
export type MemoryProtect = {
|
|
33
|
+
originProts: string;
|
|
34
|
+
newProts: string;
|
|
35
|
+
range: RangeDetails | null;
|
|
36
|
+
protectResult?: boolean;
|
|
37
|
+
recoverResult?: boolean;
|
|
38
|
+
readable: boolean;
|
|
39
|
+
};
|
|
40
|
+
export type MemoryPage = {
|
|
41
|
+
base: NativePointer;
|
|
42
|
+
size: number;
|
|
43
|
+
} & MemoryProtect;
|
|
44
|
+
export declare class BatchSender {
|
|
45
|
+
private _source;
|
|
46
|
+
private _batch_list;
|
|
47
|
+
constructor(source: string);
|
|
48
|
+
send(message: any, data?: ArrayBuffer | null): void;
|
|
49
|
+
rpcResponse(): (ArrayBuffer | {
|
|
50
|
+
type: RPCMsgType;
|
|
51
|
+
source: string;
|
|
52
|
+
data: {
|
|
53
|
+
message_list: any[];
|
|
54
|
+
data_sizes: number[];
|
|
55
|
+
};
|
|
56
|
+
})[];
|
|
57
|
+
clear(): void;
|
|
58
|
+
flush(): void;
|
|
59
|
+
}
|
|
60
|
+
export declare class ProgressNotify {
|
|
61
|
+
private readonly ID;
|
|
62
|
+
readonly tag: string;
|
|
63
|
+
private step;
|
|
64
|
+
private startTime;
|
|
65
|
+
constructor(tag: string);
|
|
66
|
+
notify(extra?: {
|
|
67
|
+
[key: string]: any;
|
|
68
|
+
}, err?: Error): void;
|
|
69
|
+
log(name: any, extra: any, lines?: string[]): void;
|
|
70
|
+
}
|
|
71
|
+
declare class Helper {
|
|
72
|
+
static libc: Libc;
|
|
73
|
+
private static _logStates;
|
|
74
|
+
private static _android_api_level?;
|
|
75
|
+
private static _dataDir;
|
|
76
|
+
private static _logfiles;
|
|
77
|
+
static get dataDir(): string;
|
|
78
|
+
static setOutputDir(dir: string): void;
|
|
79
|
+
static get outputDir(): string;
|
|
80
|
+
private static _loggerPrefix;
|
|
81
|
+
private static _prelog;
|
|
82
|
+
static assert(cond: any): void;
|
|
83
|
+
static $log(level: LogLevel, logger: (...args: any[]) => void, ...args: any): void;
|
|
84
|
+
static $debug(...args: any): void;
|
|
85
|
+
static $info(...args: any): void;
|
|
86
|
+
static $warn(...args: any): void;
|
|
87
|
+
static $error(...args: any): void;
|
|
88
|
+
static walkDir(path: string, fn: AnyFunction): null | undefined;
|
|
89
|
+
static getFdLinked(fd: number): string | null;
|
|
90
|
+
static getFileStreamLinked(stream: any): string | null;
|
|
91
|
+
static readProcMaps(pid?: number | string): string;
|
|
92
|
+
static readCmdline(pid?: number | string): string;
|
|
93
|
+
static readFile(path: string): ArrayBuffer;
|
|
94
|
+
static openFile(pathname: string, mode: string): FileHelper;
|
|
95
|
+
static isFilePath(str: string): boolean;
|
|
96
|
+
static joinPath(dir: string, file: string): string;
|
|
97
|
+
static readTextFile(path: string): string;
|
|
98
|
+
static dumpProcMaps(tag: string, pid?: number | string): void;
|
|
99
|
+
static dumpTextFile(tag: string, srcPath: string): void;
|
|
100
|
+
static backtrace({ context, addrHandler, backtracer }?: {
|
|
101
|
+
context?: undefined | CpuContext;
|
|
102
|
+
addrHandler?: (addr: any) => any;
|
|
103
|
+
backtracer?: Backtracer;
|
|
104
|
+
}): void;
|
|
105
|
+
static saveFile(tag: string, bs: string | ArrayBuffer | null, mode: string, source: string): false | undefined;
|
|
106
|
+
static androidGetApiLevel(): number;
|
|
107
|
+
static memoryReadDo(address: NativePointer, size: number, doFunc: (makeReadable: () => MemoryProtect[], makeRecovery: () => MemoryProtect[]) => void): void;
|
|
108
|
+
static memoryReadPageDo(base: NativePointer, size: number, doFunc: (page: MemoryPage) => boolean): MemoryPage[];
|
|
109
|
+
static newBatchSender(source: string): BatchSender;
|
|
110
|
+
static getLogfile(tag: string, mode: string): FileHelper;
|
|
111
|
+
static $send(message: any, data?: ArrayBuffer | number[] | null): void;
|
|
112
|
+
static scanMemory(scanRange: {
|
|
113
|
+
base: NativePointer;
|
|
114
|
+
size: number;
|
|
115
|
+
}, pattern: string, { limit, maxMatchNum, onMatch }: {
|
|
116
|
+
limit?: number;
|
|
117
|
+
maxMatchNum?: number;
|
|
118
|
+
onMatch?: (match: MemoryScanMatch) => boolean;
|
|
119
|
+
}): MemoryScanMatch[];
|
|
120
|
+
}
|
|
121
|
+
export { Helper as help };
|
|
122
|
+
declare global {
|
|
123
|
+
const help: Helper;
|
|
124
|
+
}
|
|
125
|
+
export declare const print: (...args: any[]) => void;
|
|
126
|
+
export declare const printErr: (...args: any[]) => void;
|
|
127
|
+
declare global {
|
|
128
|
+
function print(...args: any): void;
|
|
129
|
+
function printErr(...args: any): void;
|
|
130
|
+
}
|