@zsa233/frida-analykit-agent 2.0.0 → 2.0.2
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
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare enum RPCMsgType {
|
|
2
|
+
BATCH = "BATCH",
|
|
3
|
+
SCOPE_CALL = "SCOPE_CALL",
|
|
4
|
+
SCOPE_EVAL = "SCOPE_EVAL",
|
|
5
|
+
SCOPE_GET = "SCOPE_GET",
|
|
6
|
+
ENUMERATE_OBJ_PROPS = "ENUMERATE_OBJ_PROPS",
|
|
7
|
+
INIT_CONFIG = "INIT_CONFIG",
|
|
8
|
+
SAVE_FILE = "SAVE_FILE",
|
|
9
|
+
SSL_SECRET = "SSL_SECRET",
|
|
10
|
+
PROGRESSING = "PROGRESSING"
|
|
11
|
+
}
|
|
12
|
+
export declare enum batchSendSource {
|
|
13
|
+
}
|
|
14
|
+
export declare enum saveFileSource {
|
|
15
|
+
procMaps = "procMaps",
|
|
16
|
+
textFile = "textFile",
|
|
17
|
+
elfModule = "elfModule"
|
|
18
|
+
}
|
package/dist/message.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export var RPCMsgType;
|
|
2
|
+
(function (RPCMsgType) {
|
|
3
|
+
RPCMsgType["BATCH"] = "BATCH";
|
|
4
|
+
RPCMsgType["SCOPE_CALL"] = "SCOPE_CALL";
|
|
5
|
+
RPCMsgType["SCOPE_EVAL"] = "SCOPE_EVAL";
|
|
6
|
+
RPCMsgType["SCOPE_GET"] = "SCOPE_GET";
|
|
7
|
+
RPCMsgType["ENUMERATE_OBJ_PROPS"] = "ENUMERATE_OBJ_PROPS";
|
|
8
|
+
RPCMsgType["INIT_CONFIG"] = "INIT_CONFIG";
|
|
9
|
+
RPCMsgType["SAVE_FILE"] = "SAVE_FILE";
|
|
10
|
+
RPCMsgType["SSL_SECRET"] = "SSL_SECRET";
|
|
11
|
+
RPCMsgType["PROGRESSING"] = "PROGRESSING";
|
|
12
|
+
})(RPCMsgType || (RPCMsgType = {}));
|
|
13
|
+
export var batchSendSource;
|
|
14
|
+
(function (batchSendSource) {
|
|
15
|
+
})(batchSendSource || (batchSendSource = {}));
|
|
16
|
+
export var saveFileSource;
|
|
17
|
+
(function (saveFileSource) {
|
|
18
|
+
saveFileSource["procMaps"] = "procMaps";
|
|
19
|
+
saveFileSource["textFile"] = "textFile";
|
|
20
|
+
saveFileSource["elfModule"] = "elfModule";
|
|
21
|
+
})(saveFileSource || (saveFileSource = {}));
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { NativePointerObject } from "../helper.js";
|
|
2
|
+
import { ElfModuleX } from "../elf/module.js";
|
|
3
|
+
export type SSLSecretLog = {
|
|
4
|
+
label: string;
|
|
5
|
+
client_random: string;
|
|
6
|
+
secret: string;
|
|
7
|
+
};
|
|
8
|
+
export declare class BoringSSL {
|
|
9
|
+
private mod;
|
|
10
|
+
constructor(mod: ElfModuleX | Module);
|
|
11
|
+
static loadFromModule(mod: ElfModuleX | Module): BoringSSL;
|
|
12
|
+
scanKeylogFunc(fullScan?: boolean, verifier?: (p: NativePointer) => NativePointer | null): NativePointer[];
|
|
13
|
+
verifyKeylogFunc(p: NativePointer): NativePointer | null;
|
|
14
|
+
}
|
|
15
|
+
declare class SSLTools extends NativePointerObject {
|
|
16
|
+
private static _libssl_hook;
|
|
17
|
+
static newConsumer(tag?: string): SSLSecretCallbackConsumer;
|
|
18
|
+
static attachLibsslKeylogFunc(tag?: string): boolean;
|
|
19
|
+
static attachBoringsslKeylogFunc(options: {
|
|
20
|
+
mod?: ElfModuleX | Module;
|
|
21
|
+
libname?: string;
|
|
22
|
+
}): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class SSLSecretCallbackConsumer {
|
|
25
|
+
private tag;
|
|
26
|
+
constructor(tag: string);
|
|
27
|
+
Handler(): ScriptInvocationListenerCallbacks;
|
|
28
|
+
}
|
|
29
|
+
export { SSLTools };
|
package/dist/net/ssl.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { Config, setGlobalProperties } from "../config.js";
|
|
2
|
+
import { RPCMsgType } from "../message.js";
|
|
3
|
+
import { arrayBuffer2Hex, unwrapArgs } from "../utils/utils.js";
|
|
4
|
+
import { ssl_st_structOf, SSL3_RANDOM_SIZE } from "./struct.js";
|
|
5
|
+
import { help, NativePointerObject, ProgressNotify } from "../helper.js";
|
|
6
|
+
import { Libssl } from "../lib/libssl.js";
|
|
7
|
+
import { FuncHelper } from "../func.js";
|
|
8
|
+
import { ElfModuleX } from "../elf/module.js";
|
|
9
|
+
import { AdrlXref } from "../elf/xref.js";
|
|
10
|
+
import { TextEncoder } from "../utils/text_endec.js";
|
|
11
|
+
import { Subroutine } from "../elf/verifier.js";
|
|
12
|
+
const HEX_TABLE = '0123456789abcdef';
|
|
13
|
+
class SSL extends NativePointerObject {
|
|
14
|
+
constructor(handle) {
|
|
15
|
+
super(handle);
|
|
16
|
+
for (let [field, offseter] of Object.entries(Process.pointerSize === 8 ? ssl_st_structOf.B64 : {})) {
|
|
17
|
+
Object.defineProperty(this, field, {
|
|
18
|
+
value: offseter(this.$handle),
|
|
19
|
+
writable: false,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
static cbb_hex(bytes, in_len) {
|
|
25
|
+
const bs = new Uint8Array(bytes);
|
|
26
|
+
const hex_list = [];
|
|
27
|
+
for (let i = 0; i < in_len; i++) {
|
|
28
|
+
hex_list.push(HEX_TABLE[bs[i] >> 4] + HEX_TABLE[bs[i] & 0xf]);
|
|
29
|
+
}
|
|
30
|
+
return hex_list.join('');
|
|
31
|
+
}
|
|
32
|
+
secretlog(label, secret, secret_len) {
|
|
33
|
+
return {
|
|
34
|
+
label,
|
|
35
|
+
client_random: SSL.cbb_hex(this.s3.client_random, SSL3_RANDOM_SIZE),
|
|
36
|
+
secret: SSL.cbb_hex(secret, secret_len),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function sendSSLSecret(tag, data) {
|
|
41
|
+
if (Config.OnRPC) {
|
|
42
|
+
help.$send({
|
|
43
|
+
type: RPCMsgType.SSL_SECRET,
|
|
44
|
+
data: {
|
|
45
|
+
tag: tag,
|
|
46
|
+
...data
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const file = help.getLogfile(tag, 'a');
|
|
52
|
+
file.writeLine(`${data.label} ${data.client_random} ${data.secret}`);
|
|
53
|
+
file.flush();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class BoringSSL {
|
|
57
|
+
constructor(mod) {
|
|
58
|
+
this.mod = mod;
|
|
59
|
+
}
|
|
60
|
+
static loadFromModule(mod) {
|
|
61
|
+
return new BoringSSL(mod);
|
|
62
|
+
}
|
|
63
|
+
scanKeylogFunc(fullScan = false, verifier = this.verifyKeylogFunc) {
|
|
64
|
+
const prog = new ProgressNotify('BoringSSL::scanKeylogFunc');
|
|
65
|
+
const mod = this.mod;
|
|
66
|
+
const tryGetSegment = (name) => {
|
|
67
|
+
if (mod instanceof ElfModuleX) {
|
|
68
|
+
return mod.getSegment(name);
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
};
|
|
72
|
+
const targetString = 'CLIENT_RANDOM';
|
|
73
|
+
const enc = new TextEncoder();
|
|
74
|
+
const strBuff = enc.encode(targetString).buffer;
|
|
75
|
+
const scanPattern = arrayBuffer2Hex(strBuff) + " 00";
|
|
76
|
+
const targetScanRange = fullScan ? mod : (tryGetSegment('.rodata') || mod);
|
|
77
|
+
prog.notify({
|
|
78
|
+
intro: `开始扫描特征[${targetString}]`,
|
|
79
|
+
modx_name: mod.name,
|
|
80
|
+
modx_base: mod.base,
|
|
81
|
+
modx_size: mod.size,
|
|
82
|
+
scan_base: (targetScanRange ? targetScanRange : mod).base,
|
|
83
|
+
scan_size: (targetScanRange ? targetScanRange : mod).size,
|
|
84
|
+
scan_string: targetString,
|
|
85
|
+
scan_pattern: scanPattern,
|
|
86
|
+
next: 'help.scanMemory'
|
|
87
|
+
});
|
|
88
|
+
// 特征string 扫描
|
|
89
|
+
const stringTargets = help.scanMemory(targetScanRange ? targetScanRange : mod, scanPattern, { limit: 0x10000 });
|
|
90
|
+
prog.notify({
|
|
91
|
+
intro: `捕获目标数[${stringTargets.length}]`,
|
|
92
|
+
targets: stringTargets.map(v => v.address),
|
|
93
|
+
});
|
|
94
|
+
if (!stringTargets.length) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
prog.notify({
|
|
98
|
+
targets: stringTargets.map(v => v.address),
|
|
99
|
+
});
|
|
100
|
+
const guessBLs = [];
|
|
101
|
+
for (const target of stringTargets) {
|
|
102
|
+
const adrlScanRange = fullScan ? mod : (tryGetSegment('.text') || mod);
|
|
103
|
+
prog.notify({
|
|
104
|
+
target: target.address,
|
|
105
|
+
scan_base: adrlScanRange.base,
|
|
106
|
+
scan_size: adrlScanRange.size,
|
|
107
|
+
next: 'AdrlXref::scanAdrl'
|
|
108
|
+
});
|
|
109
|
+
// adrl 目标引用扫描
|
|
110
|
+
const xref = new AdrlXref(target.address);
|
|
111
|
+
const adrlResults = xref.scanAdrl(adrlScanRange);
|
|
112
|
+
prog.notify({
|
|
113
|
+
intro: `特征[${target.address.sub(mod.base)}]引用关联数[${adrlResults.length}]`,
|
|
114
|
+
results: adrlResults,
|
|
115
|
+
});
|
|
116
|
+
for (const adrl of adrlResults) {
|
|
117
|
+
const bls = [];
|
|
118
|
+
// bl 函数调用(只考虑第一次bl
|
|
119
|
+
const bl = adrl.scanBL();
|
|
120
|
+
if (bl) {
|
|
121
|
+
guessBLs.push(bl);
|
|
122
|
+
bls.push(bl);
|
|
123
|
+
}
|
|
124
|
+
prog.notify({
|
|
125
|
+
adrl: adrl,
|
|
126
|
+
bls: bls,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const guessFuncs = [];
|
|
131
|
+
for (const target of guessBLs) {
|
|
132
|
+
const funcPtr = ptr(target.insn.operands[0].value.toString());
|
|
133
|
+
guessFuncs.push(funcPtr);
|
|
134
|
+
prog.notify({
|
|
135
|
+
intro: `从[${target.src.$handle.sub(mod.base)}]猜测目标函数[${funcPtr.sub(mod.base)}]`,
|
|
136
|
+
bl: target,
|
|
137
|
+
func_ptr: funcPtr,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// 进一步验证目标函数
|
|
141
|
+
return guessFuncs.reduce((acc, v) => {
|
|
142
|
+
const p = verifier(v);
|
|
143
|
+
if (p) {
|
|
144
|
+
acc.push(p);
|
|
145
|
+
}
|
|
146
|
+
return acc;
|
|
147
|
+
}, []);
|
|
148
|
+
}
|
|
149
|
+
verifyKeylogFunc(p) {
|
|
150
|
+
const subroutine = Subroutine.loadFromPointer(p);
|
|
151
|
+
// thunk/tail call
|
|
152
|
+
const verifyResult = subroutine.scoreThunk();
|
|
153
|
+
if (verifyResult.score > 50 && verifyResult.eoi) {
|
|
154
|
+
const bInstr = verifyResult.eoi;
|
|
155
|
+
switch (bInstr.mnemonic) {
|
|
156
|
+
case 'b':
|
|
157
|
+
const target = bInstr.operands[0];
|
|
158
|
+
return ptr(target.value.toString());
|
|
159
|
+
case 'br':
|
|
160
|
+
// TODO:
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return p;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
class SSLTools extends NativePointerObject {
|
|
168
|
+
static newConsumer(tag = 'sslkey.log') {
|
|
169
|
+
return new SSLSecretCallbackConsumer(tag);
|
|
170
|
+
}
|
|
171
|
+
static attachLibsslKeylogFunc(tag = 'sslkey.log') {
|
|
172
|
+
if (this._libssl_hook) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
const handle = Libssl.SSL_new.$handle;
|
|
176
|
+
if (!handle || handle.isNull()) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
this._libssl_hook = true;
|
|
180
|
+
Interceptor.attach(handle, {
|
|
181
|
+
onEnter(args) {
|
|
182
|
+
const [ctx] = unwrapArgs(args, 1);
|
|
183
|
+
this.ssl_ctx = ctx;
|
|
184
|
+
},
|
|
185
|
+
onLeave(retval) {
|
|
186
|
+
const ctx = this.ssl_ctx;
|
|
187
|
+
Libssl.SSL_CTX_set_keylog_callback(ctx, FuncHelper.SSL_CTX_keylog_callback(Libssl.SSL_CTX_get_keylog_callback(ctx), (impl, ssl, line) => {
|
|
188
|
+
const str = line.readCString();
|
|
189
|
+
if (str !== null) {
|
|
190
|
+
const sep_list = str.split(' ');
|
|
191
|
+
if (sep_list.length !== 3) {
|
|
192
|
+
printErr(`[attachLogSecret] error to parse secret_log[${str}]`);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const [label, client_random, secret] = sep_list;
|
|
196
|
+
sendSSLSecret(tag, { label, client_random, secret });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!impl.isNull()) {
|
|
200
|
+
impl(ssl, line);
|
|
201
|
+
}
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
static attachBoringsslKeylogFunc(options) {
|
|
208
|
+
let { mod, libname } = options;
|
|
209
|
+
if (!mod && !libname) {
|
|
210
|
+
throw new Error(`[attachBoringssl] mod和libname必须要指定一个`);
|
|
211
|
+
}
|
|
212
|
+
const prog = new ProgressNotify('SSLTools::attachBoringsslKeylogFunc');
|
|
213
|
+
if (!mod) {
|
|
214
|
+
mod = Process.getModuleByName(libname);
|
|
215
|
+
}
|
|
216
|
+
const bor = new BoringSSL(mod);
|
|
217
|
+
const guessList = bor.scanKeylogFunc();
|
|
218
|
+
if (guessList.length != 1) {
|
|
219
|
+
throw new Error(`[attachBoringssl] 扫到的目标不存在或多个[${guessList.length}], 不执行attach。`);
|
|
220
|
+
}
|
|
221
|
+
Interceptor.attach(guessList[0], SSLTools.newConsumer('sslkey.log').Handler());
|
|
222
|
+
prog.log(mod.name, `ssl_log_secret: ${guessList[0].sub(mod.base)}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
SSLTools._libssl_hook = false;
|
|
226
|
+
export class SSLSecretCallbackConsumer {
|
|
227
|
+
constructor(tag) {
|
|
228
|
+
this.tag = tag;
|
|
229
|
+
}
|
|
230
|
+
Handler() {
|
|
231
|
+
const that = this;
|
|
232
|
+
return {
|
|
233
|
+
onEnter(args) {
|
|
234
|
+
const [ssl, label, secret, secret_len] = unwrapArgs(args, 4);
|
|
235
|
+
const handle = new SSL(ssl);
|
|
236
|
+
const len = secret_len.toUInt32();
|
|
237
|
+
const data = handle.secretlog(label.readCString(), secret.readByteArray(len), len);
|
|
238
|
+
sendSSLSecret(that.tag, data);
|
|
239
|
+
},
|
|
240
|
+
onLeave(retval) {
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
export { SSLTools };
|
|
246
|
+
setGlobalProperties({
|
|
247
|
+
'SSLTools': SSLTools,
|
|
248
|
+
'BoringSSL': BoringSSL,
|
|
249
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const SSL3_RANDOM_SIZE = 32;
|
|
2
|
+
export declare const bssl_SSL3_STATE_structOf: {
|
|
3
|
+
B64: {
|
|
4
|
+
read_sequence: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => ArrayBuffer;
|
|
5
|
+
cwrite_sequence: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => ArrayBuffer;
|
|
6
|
+
server_random: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => ArrayBuffer;
|
|
7
|
+
client_random: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => ArrayBuffer;
|
|
8
|
+
};
|
|
9
|
+
B32: {};
|
|
10
|
+
};
|
|
11
|
+
export declare const ssl_st_structOf: {
|
|
12
|
+
B64: {
|
|
13
|
+
method: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
14
|
+
config: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
15
|
+
version: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => number;
|
|
16
|
+
max_send_fragment: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => number;
|
|
17
|
+
rbio: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
18
|
+
wbio: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
19
|
+
do_handshake: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
20
|
+
s3: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => {
|
|
21
|
+
[key: string]: any;
|
|
22
|
+
};
|
|
23
|
+
d1: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
24
|
+
msg_callback: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
25
|
+
msg_callback_arg: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
26
|
+
initial_timeout_duration_ms: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => number;
|
|
27
|
+
session: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
28
|
+
info_callback: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
29
|
+
ctx: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
30
|
+
session_ctx: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
31
|
+
ex_data: (base: NativePointer | import("../utils/array_pointer.js").ArrayPointer) => NativePointer;
|
|
32
|
+
};
|
|
33
|
+
B32: {};
|
|
34
|
+
};
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
readByteArray, binaryReadPointer,
|
|
5
|
-
binaryPointer, binaryReadPointerStruct,
|
|
6
|
-
binaryReadU8, binaryReadU16,
|
|
7
|
-
binaryReadU32, binaryReadS32,
|
|
8
|
-
binaryReadU64, binaryReadS64,
|
|
9
|
-
} from "../utils/utils.js"
|
|
10
|
-
|
|
11
|
-
export const SSL3_RANDOM_SIZE = 32
|
|
12
|
-
|
|
1
|
+
import { readByteArray, binaryReadPointer, binaryReadPointerStruct, binaryReadU16, binaryReadU32, } from "../utils/utils.js";
|
|
2
|
+
export const SSL3_RANDOM_SIZE = 32;
|
|
13
3
|
export const bssl_SSL3_STATE_structOf = {
|
|
14
4
|
B64: {
|
|
15
5
|
read_sequence: readByteArray(0, 8),
|
|
@@ -20,9 +10,7 @@ export const bssl_SSL3_STATE_structOf = {
|
|
|
20
10
|
},
|
|
21
11
|
// B32
|
|
22
12
|
B32: {}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
};
|
|
26
14
|
export const ssl_st_structOf = {
|
|
27
15
|
B64: {
|
|
28
16
|
method: binaryReadPointer(0),
|
|
@@ -46,6 +34,4 @@ export const ssl_st_structOf = {
|
|
|
46
34
|
},
|
|
47
35
|
// B32
|
|
48
36
|
B32: {}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
37
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
interface RangeDetails {
|
|
2
|
+
/**
|
|
3
|
+
* Base address.
|
|
4
|
+
*/
|
|
5
|
+
base: NativePointer;
|
|
6
|
+
/**
|
|
7
|
+
* Size in bytes.
|
|
8
|
+
*/
|
|
9
|
+
size: number;
|
|
10
|
+
/**
|
|
11
|
+
* Protection.
|
|
12
|
+
*/
|
|
13
|
+
protection: PageProtection;
|
|
14
|
+
/**
|
|
15
|
+
* File mapping details, if available.
|
|
16
|
+
*/
|
|
17
|
+
file?: FileMapping | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare class ProcMapItem {
|
|
20
|
+
start_page: NativePointer;
|
|
21
|
+
end_page: NativePointer;
|
|
22
|
+
prots: string;
|
|
23
|
+
offset: number;
|
|
24
|
+
main_dev: string;
|
|
25
|
+
slave_dev: string;
|
|
26
|
+
inode: number;
|
|
27
|
+
pathname: string;
|
|
28
|
+
constructor(start_page: string, end_page: string, prots: string, offset: string, main_dev: string, slave_dev: string, inode: string, pathname: string);
|
|
29
|
+
toString(): string;
|
|
30
|
+
}
|
|
31
|
+
export declare class ProcMap {
|
|
32
|
+
text: string;
|
|
33
|
+
items: ProcMapItem[];
|
|
34
|
+
constructor(text: string);
|
|
35
|
+
static parseLine(line: string): string[] | null;
|
|
36
|
+
find(start_addr: NativePointer, end_addr: NativePointer): ProcMapItem[];
|
|
37
|
+
}
|
|
38
|
+
declare class Proc {
|
|
39
|
+
private static _mapCache;
|
|
40
|
+
static findMapCache(addr: NativePointer): RangeDetails | null;
|
|
41
|
+
static loadProcMap(pid?: number | string): ProcMap;
|
|
42
|
+
}
|
|
43
|
+
export { Proc as proc };
|
package/dist/process.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { help } from "./helper.js";
|
|
2
|
+
export class ProcMapItem {
|
|
3
|
+
constructor(start_page, end_page, prots, offset, main_dev, slave_dev, inode, pathname) {
|
|
4
|
+
this.start_page = ptr(parseInt(start_page, 16));
|
|
5
|
+
this.end_page = ptr(parseInt(end_page, 16));
|
|
6
|
+
this.prots = prots;
|
|
7
|
+
this.offset = parseInt(offset, 16);
|
|
8
|
+
this.main_dev = main_dev;
|
|
9
|
+
this.slave_dev = slave_dev;
|
|
10
|
+
this.inode = parseInt(inode);
|
|
11
|
+
this.pathname = pathname.trim();
|
|
12
|
+
}
|
|
13
|
+
toString() {
|
|
14
|
+
return `${this.start_page.toString(16)}-${this.end_page.toString(16)} ${this.prots} ${this.offset.toString(16)} ${this.main_dev}:${this.slave_dev} ${this.inode} ${this.pathname}`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const REGEXP_PROC_MAPS_LINE = /^([a-fA-F0-9]+)-([a-fA-F0-9]+)\s+([rwx\-p]+)\s+(\w+)\s+(\w+):(\d+)\s+(\d+)\s+(.*)$/;
|
|
18
|
+
export class ProcMap {
|
|
19
|
+
constructor(text) {
|
|
20
|
+
this.text = text;
|
|
21
|
+
this.items = [];
|
|
22
|
+
const lines = text.split('\n');
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
if (!line.trim())
|
|
25
|
+
continue;
|
|
26
|
+
const result = ProcMap.parseLine(line);
|
|
27
|
+
if (!result || result.length !== 8)
|
|
28
|
+
continue;
|
|
29
|
+
const item = new ProcMapItem(...result);
|
|
30
|
+
this.items.push(item);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
static parseLine(line) {
|
|
34
|
+
const m = REGEXP_PROC_MAPS_LINE.exec(line);
|
|
35
|
+
if (!m)
|
|
36
|
+
return null;
|
|
37
|
+
return m.slice(1);
|
|
38
|
+
}
|
|
39
|
+
find(start_addr, end_addr) {
|
|
40
|
+
return this.items.filter(item => {
|
|
41
|
+
return !(item.start_page >= end_addr || item.end_page <= start_addr);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
class Proc {
|
|
46
|
+
static findMapCache(addr) {
|
|
47
|
+
const result = this._mapCache.find((v, i) => {
|
|
48
|
+
return addr >= v.base && addr < v.base.add(v.size);
|
|
49
|
+
});
|
|
50
|
+
if (result) {
|
|
51
|
+
return result || null;
|
|
52
|
+
}
|
|
53
|
+
const range = Process.findRangeByAddress(addr);
|
|
54
|
+
if (!range) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
let hitIndex = -1;
|
|
58
|
+
const hit = this._mapCache.find((v, i) => {
|
|
59
|
+
const ok = v.base == range.base;
|
|
60
|
+
if (ok)
|
|
61
|
+
hitIndex = i;
|
|
62
|
+
return ok;
|
|
63
|
+
});
|
|
64
|
+
if (hitIndex !== -1) {
|
|
65
|
+
this._mapCache[hitIndex] = range;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this._mapCache.push(range);
|
|
69
|
+
}
|
|
70
|
+
return range;
|
|
71
|
+
}
|
|
72
|
+
static loadProcMap(pid = 'self') {
|
|
73
|
+
return new ProcMap(help.readProcMaps(pid));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
Proc._mapCache = [];
|
|
77
|
+
export { Proc as proc };
|
package/dist/rpc.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|