@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.
Files changed (87) hide show
  1. package/dist/api/android.d.ts +41 -0
  2. package/dist/api/android.js +1 -0
  3. package/dist/bridges.d.ts +4 -0
  4. package/dist/bridges.js +8 -0
  5. package/dist/cmodule/scan_adrp.d.ts +9 -0
  6. package/{src/cmodule/scan_adrp.ts → dist/cmodule/scan_adrp.js} +19 -30
  7. package/dist/config.d.ts +26 -0
  8. package/dist/config.js +27 -0
  9. package/dist/consts.d.ts +18 -0
  10. package/dist/consts.js +23 -0
  11. package/dist/elf/insn.d.ts +10 -0
  12. package/dist/elf/insn.js +43 -0
  13. package/dist/elf/module.d.ts +95 -0
  14. package/dist/elf/module.js +632 -0
  15. package/dist/elf/struct.d.ts +235 -0
  16. package/{src/elf/struct.ts → dist/elf/struct.js} +63 -149
  17. package/dist/elf/tools.d.ts +6 -0
  18. package/dist/elf/tools.js +25 -0
  19. package/dist/elf/verifier.d.ts +11 -0
  20. package/dist/elf/verifier.js +57 -0
  21. package/dist/elf/xref.d.ts +32 -0
  22. package/dist/elf/xref.js +271 -0
  23. package/dist/func.d.ts +7 -0
  24. package/dist/func.js +23 -0
  25. package/dist/helper.d.ts +130 -0
  26. package/dist/helper.js +527 -0
  27. package/{src/index.ts → dist/index.d.ts} +0 -1
  28. package/dist/index.js +9 -0
  29. package/dist/jni/env.d.ts +821 -0
  30. package/dist/jni/env.js +1054 -0
  31. package/{src/jni/struct.ts → dist/jni/struct.d.ts} +8 -54
  32. package/dist/jni/struct.js +173 -0
  33. package/dist/lib/libc.d.ts +68 -0
  34. package/dist/lib/libc.js +125 -0
  35. package/dist/lib/libssl.d.ts +23 -0
  36. package/dist/lib/libssl.js +60 -0
  37. package/dist/message.d.ts +18 -0
  38. package/dist/message.js +21 -0
  39. package/dist/net/ssl.d.ts +29 -0
  40. package/dist/net/ssl.js +249 -0
  41. package/dist/net/struct.d.ts +34 -0
  42. package/{src/net/struct.ts → dist/net/struct.js} +4 -18
  43. package/dist/net/tools.js +1 -0
  44. package/dist/process.d.ts +43 -0
  45. package/dist/process.js +77 -0
  46. package/dist/rpc.d.ts +1 -0
  47. package/dist/rpc.js +248 -0
  48. package/dist/utils/array_pointer.d.ts +21 -0
  49. package/dist/utils/array_pointer.js +81 -0
  50. package/dist/utils/queue.d.ts +19 -0
  51. package/dist/utils/queue.js +89 -0
  52. package/dist/utils/scan.d.ts +35 -0
  53. package/dist/utils/scan.js +72 -0
  54. package/dist/utils/std.d.ts +40 -0
  55. package/dist/utils/std.js +128 -0
  56. package/dist/utils/text_endec.d.ts +8 -0
  57. package/dist/utils/text_endec.js +29 -0
  58. package/dist/utils/utils.d.ts +28 -0
  59. package/dist/utils/utils.js +66 -0
  60. package/package.json +18 -5
  61. package/src/api/android.ts +0 -80
  62. package/src/bridges.ts +0 -18
  63. package/src/cmodule/scan_adrp.c +0 -81
  64. package/src/config.ts +0 -56
  65. package/src/consts.ts +0 -31
  66. package/src/elf/insn.ts +0 -61
  67. package/src/elf/module.ts +0 -751
  68. package/src/elf/tools.ts +0 -33
  69. package/src/elf/verifier.ts +0 -74
  70. package/src/elf/xref.ts +0 -360
  71. package/src/func.ts +0 -32
  72. package/src/helper.ts +0 -685
  73. package/src/jni/env.ts +0 -1439
  74. package/src/lib/libc.ts +0 -161
  75. package/src/lib/libssl.ts +0 -95
  76. package/src/message.ts +0 -26
  77. package/src/net/ssl.ts +0 -360
  78. package/src/process.ts +0 -137
  79. package/src/rpc.ts +0 -268
  80. package/src/runtime-globals.d.ts +0 -11
  81. package/src/utils/array_pointer.ts +0 -102
  82. package/src/utils/queue.ts +0 -102
  83. package/src/utils/scan.ts +0 -103
  84. package/src/utils/std.ts +0 -165
  85. package/src/utils/text_endec.ts +0 -35
  86. package/src/utils/utils.ts +0 -111
  87. /package/{src/net/tools.ts → dist/net/tools.d.ts} +0 -0
package/dist/helper.js ADDED
@@ -0,0 +1,527 @@
1
+ import { Libc } from './lib/libc.js';
2
+ import { FixedQueue } from './utils/queue.js';
3
+ import { RPCMsgType, saveFileSource } from './message.js';
4
+ import { Config, LogLevel, setGlobalProperties } from './config.js';
5
+ import { TextEncoder } from './utils/text_endec.js';
6
+ export class NativePointerObject {
7
+ constructor(handle) {
8
+ this._handle = handle;
9
+ }
10
+ get $handle() {
11
+ return this._handle;
12
+ }
13
+ $isNull() {
14
+ return this.$handle.isNull();
15
+ }
16
+ }
17
+ export function downAlign(value, alignTo) { return Math.floor(value / alignTo) * alignTo; }
18
+ export function upAlign(value, alignTo) { return Math.ceil(value / alignTo) * alignTo; }
19
+ export function page_start(value) { return downAlign(value, Process.pageSize); }
20
+ export function page_end(value) { return upAlign(value, Process.pageSize); }
21
+ export class LoggerState {
22
+ constructor(depth = 1) {
23
+ this.match_offset = 0;
24
+ this.depth = 1;
25
+ this.counter = 1;
26
+ this.index = 0;
27
+ this.depth = depth;
28
+ this.index = 0;
29
+ this.msgs = new FixedQueue(depth);
30
+ this.base_msgs = new FixedQueue(depth);
31
+ }
32
+ onLog(msg) {
33
+ this.index++;
34
+ const earliest_msg = this.msgs.push(msg);
35
+ if (earliest_msg === undefined) {
36
+ this.base_msgs.push(msg);
37
+ return [msg];
38
+ }
39
+ else {
40
+ let outMsgs = [];
41
+ if (this.base_msgs.index(this.match_offset) === msg) {
42
+ this.match_offset++;
43
+ if (this.match_offset === this.depth) {
44
+ this.counter++;
45
+ this.match_offset = 0;
46
+ }
47
+ }
48
+ else {
49
+ if (this.counter > 1) {
50
+ outMsgs = this.base_msgs.list.map(v => `#${this.counter}# | ${v}`);
51
+ outMsgs.push(msg);
52
+ this.base_msgs.clear();
53
+ }
54
+ else {
55
+ outMsgs = [msg];
56
+ }
57
+ this.base_msgs.push(msg);
58
+ this.match_offset = 0;
59
+ this.counter = 1;
60
+ }
61
+ return outMsgs;
62
+ }
63
+ }
64
+ }
65
+ const AID_USER_OFFSET = 100000;
66
+ function multiuser_get_user_id(uid) {
67
+ return Math.floor(uid / AID_USER_OFFSET);
68
+ }
69
+ export class FileHelper extends NativePointerObject {
70
+ constructor(pathname, mode) {
71
+ const handle = Helper.libc.fopen(pathname, mode);
72
+ if (handle.isNull()) {
73
+ throw new Error(`can't open file[${pathname}], mode[${mode}]`);
74
+ }
75
+ super(handle);
76
+ this._isClosed = false;
77
+ const weakRef = ptr(handle.toString());
78
+ this._weakRefId = Script.bindWeak(this.$handle, () => {
79
+ return Helper.libc.fclose(weakRef);
80
+ });
81
+ }
82
+ close() {
83
+ return this._isClosed ? 0 : (this._isClosed = true, Script.unbindWeak(this._weakRefId), Helper.libc.fclose(this.$handle));
84
+ }
85
+ writeLine(data, append = '\n') {
86
+ return Helper.libc.fputs(data + append, this.$handle);
87
+ }
88
+ flush() {
89
+ return Helper.libc.fflush(this.$handle);
90
+ }
91
+ }
92
+ export class BatchSender {
93
+ constructor(source) {
94
+ this._batch_list = [];
95
+ this._source = source;
96
+ }
97
+ send(message, data) {
98
+ this._batch_list.push({
99
+ message: message,
100
+ data: data,
101
+ });
102
+ }
103
+ rpcResponse() {
104
+ if (!this._batch_list.length) {
105
+ return [];
106
+ }
107
+ let totalBuffLen = this._batch_list.reduce((acc, cur) => acc + (cur.data?.byteLength || 0), 0);
108
+ const batchBuff = new Uint8Array(totalBuffLen);
109
+ const buffSizeList = [];
110
+ const messageList = [];
111
+ let buffIndex = 0;
112
+ for (let i = 0; i < this._batch_list.length; i++) {
113
+ const data = this._batch_list[i];
114
+ messageList.push(data.message);
115
+ const buffSize = data.data?.byteLength || 0;
116
+ buffSizeList.push(buffSize);
117
+ if (data.data && buffSize > 0) {
118
+ batchBuff.set(new Uint8Array(data.data), buffIndex);
119
+ buffIndex += buffSize;
120
+ }
121
+ }
122
+ return [{
123
+ type: RPCMsgType.BATCH,
124
+ source: this._source,
125
+ data: {
126
+ message_list: messageList,
127
+ data_sizes: buffSizeList,
128
+ }
129
+ }, batchBuff.buffer];
130
+ }
131
+ clear() {
132
+ this._batch_list = [];
133
+ }
134
+ flush() {
135
+ const [message, buff] = this.rpcResponse();
136
+ if (!message && !buff) {
137
+ return;
138
+ }
139
+ Helper.$send(message, buff);
140
+ this.clear();
141
+ }
142
+ }
143
+ let PROGRESS_INC = 0;
144
+ export class ProgressNotify {
145
+ constructor(tag) {
146
+ this.step = 0;
147
+ PROGRESS_INC++;
148
+ this.ID = PROGRESS_INC;
149
+ this.tag = tag;
150
+ this.startTime = new Date();
151
+ }
152
+ notify(extra = {}, err) {
153
+ sendProgressMsg(this.tag, this.ID, this.step, extra, err);
154
+ this.step++;
155
+ }
156
+ log(name, extra, lines) {
157
+ const now = new Date();
158
+ console.error(`[+] | ${this.tag} | <${name}> - ${extra} (${now.getTime() - this.startTime.getTime()} ms)`);
159
+ if (lines?.length) {
160
+ console.error('[>] ' + lines.map(v => `${v}`).join('\n'));
161
+ }
162
+ this.startTime = now;
163
+ }
164
+ }
165
+ function sendProgressMsg(tag, id, step, extra = {}, err) {
166
+ Helper.$send({
167
+ type: RPCMsgType.PROGRESSING,
168
+ data: {
169
+ tag: tag,
170
+ id: id,
171
+ step: step,
172
+ time: new Date().getTime(),
173
+ extra: extra,
174
+ error: err ? {
175
+ message: err?.message,
176
+ stack: err?.stack
177
+ } : null,
178
+ }
179
+ });
180
+ }
181
+ function getScanPatternSize(pattern) {
182
+ if (pattern.startsWith('/') && pattern.endsWith('/')) {
183
+ throw new Error("Regular expression patterns are not allowed");
184
+ }
185
+ const bytesPart = pattern.split(':', 1)[0].trim();
186
+ if (bytesPart === '') {
187
+ return 0;
188
+ }
189
+ const bytes = bytesPart.split(/\s+/);
190
+ return bytes.length;
191
+ }
192
+ class Helper {
193
+ static get dataDir() {
194
+ if (!Helper._dataDir) {
195
+ const cmdline = this.readCmdline(Process.id);
196
+ const uid = this.libc.getuid();
197
+ const dataDir = `/data/user/${multiuser_get_user_id(uid)}/${cmdline}`;
198
+ Helper._dataDir = dataDir;
199
+ }
200
+ return Helper._dataDir;
201
+ }
202
+ static setOutputDir(dir) {
203
+ Config.OutputDir = dir;
204
+ }
205
+ static get outputDir() {
206
+ return Config.OutputDir ? Config.OutputDir : this.dataDir;
207
+ }
208
+ static _loggerPrefix() {
209
+ return String(Process.getCurrentThreadId());
210
+ }
211
+ static _prelog(states, prefix, ...args) {
212
+ let state = states[prefix];
213
+ const msg = Array.from(args).map(v => String(v)).join(' ');
214
+ if (!state) {
215
+ state = new LoggerState(6);
216
+ states[prefix] = state;
217
+ }
218
+ return state.onLog(msg);
219
+ }
220
+ static assert(cond) {
221
+ if (!cond) {
222
+ throw new Error(`assert false`);
223
+ }
224
+ }
225
+ static $log(level, logger, ...args) {
226
+ if (level < Config.LogLevel) {
227
+ return;
228
+ }
229
+ const prefix = this._loggerPrefix();
230
+ if (Config.LogCollapse) {
231
+ const msgs = this._prelog(this._logStates, prefix, ...args);
232
+ for (let v of msgs) {
233
+ logger(`${prefix}|`, v);
234
+ }
235
+ }
236
+ else {
237
+ logger(`${prefix}|`, ...args);
238
+ }
239
+ }
240
+ static $debug(...args) {
241
+ this.$log(LogLevel.DEBUG, console.log, ...args);
242
+ }
243
+ static $info(...args) {
244
+ this.$log(LogLevel.INFO, console.log, ...args);
245
+ }
246
+ static $warn(...args) {
247
+ this.$log(LogLevel.WARN, console.log, ...args);
248
+ }
249
+ static $error(...args) {
250
+ this.$log(LogLevel.WARN, console.error, ...args);
251
+ }
252
+ static walkDir(path, fn) {
253
+ const libc = this.libc;
254
+ const dir = libc.opendir(path);
255
+ if (dir.isNull()) {
256
+ console.error(`[walkDir] path[${path}] 打开失败.`);
257
+ return null;
258
+ }
259
+ const nameOffset = Process.pointerSize * 2 + 2 + 1;
260
+ let dirent;
261
+ while (!(dirent = libc.readdir(dir)).isNull()) {
262
+ const name = dirent.add(nameOffset).readCString();
263
+ const fp = `${path}/${name}`;
264
+ const link = libc.readlink(fp);
265
+ if (!fn(name, link)) {
266
+ break;
267
+ }
268
+ }
269
+ libc.closedir(dir);
270
+ }
271
+ static getFdLinked(fd) {
272
+ return this.libc.readlink(`/proc/self/fd/${fd}`);
273
+ }
274
+ static getFileStreamLinked(stream) {
275
+ const libc = this.libc;
276
+ const fd = libc.fileno(stream);
277
+ let link = null;
278
+ if (fd >= 0) {
279
+ link = libc.readlink(`/proc/self/fd/${fd}`);
280
+ }
281
+ return link;
282
+ }
283
+ static readProcMaps(pid = 'self') {
284
+ return this.readTextFile(`/proc/${pid}/maps`);
285
+ }
286
+ static readCmdline(pid = 'self') {
287
+ const cmdline = this.readFile(`/proc/${pid}/cmdline`);
288
+ const sepList = [];
289
+ let lastIdx = 0;
290
+ const u8bs = new Uint8Array(cmdline);
291
+ for (let i = 0; i < u8bs.byteLength; i++) {
292
+ const b = u8bs[i];
293
+ if (b === 0) {
294
+ if (lastIdx < i - 1) {
295
+ let result = '';
296
+ const view = u8bs.slice(lastIdx, i);
297
+ for (let i = 0; i < view.length; i++) {
298
+ result += String.fromCharCode(view[i]);
299
+ }
300
+ if (result.length > 0)
301
+ sepList.push(result);
302
+ }
303
+ lastIdx = i;
304
+ }
305
+ }
306
+ return sepList.join(' ');
307
+ }
308
+ static readFile(path) {
309
+ return File.readAllBytes(path);
310
+ }
311
+ static openFile(pathname, mode) {
312
+ return new FileHelper(pathname, mode);
313
+ }
314
+ static isFilePath(str) {
315
+ if (!str.length) {
316
+ return false;
317
+ }
318
+ return str[0] === '/' && str[str.length - 1] !== '/';
319
+ }
320
+ static joinPath(dir, file) {
321
+ if (!dir.length) {
322
+ return dir;
323
+ }
324
+ return dir.replace(/\/+$/, '') + '/' + file.replace(/^\/+/, '');
325
+ }
326
+ static readTextFile(path) {
327
+ return File.readAllText(path);
328
+ }
329
+ static dumpProcMaps(tag, pid = 'self') {
330
+ const prog = new ProgressNotify('Helper.dumpProcMaps');
331
+ const sm = this.readProcMaps(pid);
332
+ this.saveFile(tag, sm, 'w', saveFileSource.procMaps);
333
+ prog.log(pid, `[${sm.length}]${tag}`);
334
+ }
335
+ static dumpTextFile(tag, srcPath) {
336
+ const prog = new ProgressNotify('Helper.dumpTextFile');
337
+ const sm = File.readAllText(srcPath);
338
+ this.saveFile(tag, sm, 'w', saveFileSource.textFile);
339
+ prog.log(srcPath, `[${sm.length}](${tag})`);
340
+ }
341
+ static backtrace({ context = undefined, addrHandler = DebugSymbol.fromAddress, backtracer = Backtracer.ACCURATE } = {}) {
342
+ const prog = new ProgressNotify('Helper.backtrace');
343
+ const stacks = Thread.backtrace(context, backtracer).map(addr => {
344
+ return `${addrHandler(addr)}`;
345
+ });
346
+ prog.log(Process.getCurrentThreadId(), '', stacks);
347
+ }
348
+ static saveFile(tag, bs, mode, source) {
349
+ if (bs === null || bs === undefined) {
350
+ return false;
351
+ }
352
+ if (Config.OnRPC) {
353
+ let buff;
354
+ if (bs instanceof String) {
355
+ const enc = new TextEncoder();
356
+ const view = enc.encode(bs);
357
+ buff = view.buffer;
358
+ }
359
+ else {
360
+ buff = bs;
361
+ }
362
+ Helper.$send({
363
+ type: RPCMsgType.SAVE_FILE,
364
+ data: {
365
+ source,
366
+ filepath: Helper.joinPath(this.outputDir, tag),
367
+ mode,
368
+ }
369
+ }, buff);
370
+ }
371
+ else {
372
+ const savedFile = new File(tag, mode);
373
+ savedFile.write(bs);
374
+ savedFile.close();
375
+ }
376
+ }
377
+ static androidGetApiLevel() {
378
+ if (this._android_api_level === undefined) {
379
+ this._android_api_level = parseInt(this.libc.__system_property_get('ro.build.version.sdk'));
380
+ }
381
+ return this._android_api_level;
382
+ }
383
+ static memoryReadDo(address, size, doFunc) {
384
+ const page_infos = [];
385
+ const makeReadable = () => {
386
+ let cur = address;
387
+ const end = address.add(size);
388
+ while (cur < end) {
389
+ const range = Process.findRangeByAddress(cur);
390
+ let originProts = '';
391
+ let newProts = '';
392
+ let readable = false;
393
+ if (range !== null) {
394
+ cur = range.base.add(range.size);
395
+ originProts = range.protection;
396
+ if (range.protection[0] !== 'r') {
397
+ newProts = 'r' + originProts.slice(1);
398
+ }
399
+ else {
400
+ readable = true;
401
+ }
402
+ }
403
+ page_infos.push({
404
+ readable,
405
+ originProts,
406
+ newProts,
407
+ range,
408
+ });
409
+ }
410
+ for (let v of page_infos) {
411
+ if (v.range && v.newProts !== '') {
412
+ v.protectResult = Memory.protect(v.range.base, v.range.size, v.newProts);
413
+ if (v.protectResult) {
414
+ v.readable = true;
415
+ }
416
+ }
417
+ }
418
+ return page_infos;
419
+ };
420
+ const makeRecovery = () => {
421
+ for (let v of page_infos) {
422
+ if (v.range && v.newProts !== '' && v.protectResult) {
423
+ v.recoverResult = Memory.protect(v.range.base, v.range.size, v.originProts);
424
+ }
425
+ }
426
+ return page_infos;
427
+ };
428
+ doFunc(makeReadable, makeRecovery);
429
+ }
430
+ static memoryReadPageDo(base, size, doFunc) {
431
+ const page_infos = [];
432
+ let cur = base;
433
+ const end = base.add(size);
434
+ let isAbort = false;
435
+ while (!isAbort && cur < end) {
436
+ const range = Process.findRangeByAddress(cur);
437
+ let mp = {
438
+ base: cur.and(ptr(Process.pageSize - 1).not()),
439
+ size: Process.pageSize,
440
+ protectResult: false,
441
+ originProts: '',
442
+ newProts: '',
443
+ readable: false,
444
+ range,
445
+ };
446
+ if (range !== null) {
447
+ mp.originProts = range.protection;
448
+ if (range.protection[0] !== 'r') {
449
+ mp.newProts = 'r' + mp.originProts.slice(1);
450
+ mp.protectResult = Memory.protect(mp.base, mp.size, mp.newProts);
451
+ if (mp.protectResult) {
452
+ mp.readable = true;
453
+ }
454
+ }
455
+ else {
456
+ mp.readable = true;
457
+ }
458
+ isAbort = doFunc(mp);
459
+ if (mp.protectResult) {
460
+ mp.recoverResult = Memory.protect(mp.base, mp.size, mp.originProts);
461
+ }
462
+ }
463
+ page_infos.push(mp);
464
+ cur = mp.base.add(mp.size);
465
+ }
466
+ return page_infos;
467
+ }
468
+ static newBatchSender(source) {
469
+ return new BatchSender(source);
470
+ }
471
+ static getLogfile(tag, mode) {
472
+ const filepath = Helper.isFilePath(tag) ? tag : Helper.joinPath(Helper.outputDir, tag);
473
+ let fp = Helper._logfiles[filepath];
474
+ if (!fp) {
475
+ fp = Helper.openFile(filepath, mode);
476
+ Helper._logfiles[filepath] = fp;
477
+ }
478
+ return fp;
479
+ }
480
+ static $send(message, data) {
481
+ send(message, data);
482
+ }
483
+ static scanMemory(scanRange, pattern, { limit = Process.pageSize, maxMatchNum = -1, onMatch }) {
484
+ const patternSize = getScanPatternSize(pattern);
485
+ const { base, size } = scanRange;
486
+ const end = base.add(size);
487
+ let cursor = base;
488
+ const scanResults = [];
489
+ this.memoryReadDo(base, size, (makeReadable, makeRecovery) => {
490
+ makeReadable();
491
+ while (cursor < end) {
492
+ const nextCur = cursor.add(Math.min(Number(end.sub(cursor)), limit));
493
+ const cur = Number(cursor.sub(base)) > patternSize ? cursor.sub(patternSize) : cursor;
494
+ let results;
495
+ try {
496
+ results = Memory.scanSync(cur, Number(nextCur.sub(cur)), pattern);
497
+ if (onMatch) {
498
+ results = results.filter(v => onMatch(v));
499
+ }
500
+ scanResults.push(...results);
501
+ }
502
+ catch (e) {
503
+ // TODO: Error: access violation accessing 0xxxxxx
504
+ console.error(`[scanMemory] e[${e}]`);
505
+ }
506
+ finally {
507
+ if (maxMatchNum > 0 && scanResults.length >= maxMatchNum) {
508
+ break;
509
+ }
510
+ cursor = nextCur;
511
+ }
512
+ }
513
+ makeRecovery();
514
+ });
515
+ return scanResults;
516
+ }
517
+ }
518
+ Helper.libc = new Libc();
519
+ Helper._logStates = {};
520
+ export { Helper as help };
521
+ export const print = Helper.$log.bind(Helper, LogLevel._MUST_LOG, console.log);
522
+ export const printErr = Helper.$log.bind(Helper, LogLevel._MUST_LOG, console.error);
523
+ setGlobalProperties({
524
+ 'help': Helper,
525
+ 'print': print,
526
+ 'printErr': printErr,
527
+ });
@@ -1,5 +1,4 @@
1
1
  import "./bridges.js";
2
-
3
2
  export { Java, ObjC, Swift } from "./bridges.js";
4
3
  export { Config, LogLevel, setGlobalProperties } from "./config.js";
5
4
  export { help, NativePointerObject, BatchSender, ProgressNotify, LoggerState, FileHelper } from "./helper.js";
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ import "./bridges.js";
2
+ export { Java, ObjC, Swift } from "./bridges.js";
3
+ export { Config, LogLevel, setGlobalProperties } from "./config.js";
4
+ export { help, NativePointerObject, BatchSender, ProgressNotify, LoggerState, FileHelper } from "./helper.js";
5
+ export { proc } from "./process.js";
6
+ export { JNIEnv } from "./jni/env.js";
7
+ export { SSLTools } from "./net/ssl.js";
8
+ export { ElfTools } from "./elf/tools.js";
9
+ export { Libssl } from "./lib/libssl.js";