@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.
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
@@ -0,0 +1,41 @@
1
+ export type NP = NativePointer;
2
+ export interface EnvJvmti {
3
+ handle: NP;
4
+ vm: NP;
5
+ vtable: NP;
6
+ }
7
+ export interface VMApi {
8
+ vm: NP;
9
+ module: Module;
10
+ flavor: 'art' | 'dalvik';
11
+ addLocalRefrence: null;
12
+ find(name: string): NativePointer;
13
+ artRuntime: NativePointer;
14
+ artClassLinker: {
15
+ address: NativePointer;
16
+ quickResolutionTrampoline: NativePointer;
17
+ quickImtConflictTrampoline: NativePointer;
18
+ quickGenericJniTrampoline: NativePointer;
19
+ quickToInterpreterBridgeTrampoline: NativePointer;
20
+ };
21
+ jvmti: EnvJvmti;
22
+ $new(size: number): NativePointer;
23
+ $delete(pointer: NativePointer): void;
24
+ JNI_GetCreateJavaVMs(vmBuf: NP, bufLen: number, nVMs: NP): number;
25
+ ['art::JavaVMExt::AddGlobalRef']: (vm: NP, self: NP, obj: NP) => NP;
26
+ ['art::ReaderWriterMutex::ExclusiveLock']: (lock: NP, self: NP) => void;
27
+ ['art::IndirectReferenceTable::Add']: (table: NP, previous_state: NP, obj: number, error_msg: NP) => NP;
28
+ ['art::JavaVMExt::DecodeGlobal']: (vm: NP, thread: NP, ref: NP) => NP;
29
+ ['art::Thread::DecodeJObject']: (thread: NP, obj: NP) => NP;
30
+ }
31
+ declare global {
32
+ namespace Java {
33
+ const api: VMApi, Env: {
34
+ handle: NativePointer;
35
+ vm: Java.VM & {
36
+ handle: NativePointer;
37
+ };
38
+ throwIfExceptionPending(): Error;
39
+ };
40
+ }
41
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import JavaBridge from "frida-java-bridge";
2
+ export declare const Java: typeof globalThis.Java & typeof JavaBridge;
3
+ export declare const ObjC: typeof globalThis.ObjC;
4
+ export declare const Swift: unknown;
@@ -0,0 +1,8 @@
1
+ import JavaBridge from "frida-java-bridge";
2
+ const globals = globalThis;
3
+ export const Java = globals.Java ?? JavaBridge;
4
+ export const ObjC = globals.ObjC;
5
+ export const Swift = globals.Swift;
6
+ if (!("Java" in globals)) {
7
+ globals.Java = Java;
8
+ }
@@ -0,0 +1,9 @@
1
+ export declare class ScanAdrpCMod {
2
+ static readonly cm: CModule;
3
+ static readonly $scan: NativeFunction<NativePointer, [NativePointerValue, number | UInt64, NativePointerValue, NativePointerValue]>;
4
+ static scan(scanRange: {
5
+ base: NativePointer;
6
+ size: number;
7
+ }, pattern: string, targetAddr: NativePointer, alignOffset: number): NativePointer[];
8
+ static readonly $dispose: NativeFunction<void, [NativePointerValue]>;
9
+ }
@@ -1,8 +1,6 @@
1
-
2
- import { nativeFunctionOptions } from "../consts.js"
3
- import { CMemoryScanRes } from "../utils/scan.js"
4
-
5
-
1
+ var _a;
2
+ import { nativeFunctionOptions } from "../consts.js";
3
+ import { CMemoryScanRes } from "../utils/scan.js";
6
4
  const CM = new CModule(`
7
5
  #include <glib.h>
8
6
  #include <gum/gummemory.h>
@@ -86,33 +84,24 @@ gpointer scan(const GumAddress base_address,
86
84
  return scan_res->results;
87
85
  }
88
86
 
89
- `)
90
-
91
-
87
+ `);
92
88
  export class ScanAdrpCMod {
93
- static readonly cm: CModule = CM
94
-
95
- static readonly $scan = new NativeFunction(this.cm.scan, 'pointer', ['pointer', 'size_t', 'pointer', 'pointer'], nativeFunctionOptions)
96
-
97
- static scan(scanRange: { base: NativePointer, size: number }, pattern: string, targetAddr: NativePointer, alignOffset: number) {
98
- let matcheResults: NativePointer[] = []
99
-
100
- const userData = Memory.alloc(8 + 4)
101
- userData.writePointer(targetAddr)
102
- userData.add(8).writeU32(alignOffset)
103
-
104
- const scanRes = new CMemoryScanRes(userData)
105
- const { base, size } = scanRange
106
- this.$scan(
107
- base, size, Memory.allocUtf8String(pattern), scanRes.$handle,
108
- )
89
+ static scan(scanRange, pattern, targetAddr, alignOffset) {
90
+ let matcheResults = [];
91
+ const userData = Memory.alloc(8 + 4);
92
+ userData.writePointer(targetAddr);
93
+ userData.add(8).writeU32(alignOffset);
94
+ const scanRes = new CMemoryScanRes(userData);
95
+ const { base, size } = scanRange;
96
+ this.$scan(base, size, Memory.allocUtf8String(pattern), scanRes.$handle);
109
97
  if (scanRes.data.length > 0) {
110
- matcheResults = scanRes.data.toArray().map(v => v.readPointer())
98
+ matcheResults = scanRes.data.toArray().map(v => v.readPointer());
111
99
  }
112
- this.$dispose(scanRes.$handle)
113
- return matcheResults
100
+ this.$dispose(scanRes.$handle);
101
+ return matcheResults;
114
102
  }
115
-
116
- static readonly $dispose = new NativeFunction(this.cm._dispose, 'void', ['pointer'], nativeFunctionOptions)
117
103
  }
118
-
104
+ _a = ScanAdrpCMod;
105
+ ScanAdrpCMod.cm = CM;
106
+ ScanAdrpCMod.$scan = new NativeFunction(_a.cm.scan, 'pointer', ['pointer', 'size_t', 'pointer', 'pointer'], nativeFunctionOptions);
107
+ ScanAdrpCMod.$dispose = new NativeFunction(_a.cm._dispose, 'void', ['pointer'], nativeFunctionOptions);
@@ -0,0 +1,26 @@
1
+ export declare function setGlobalProperties(keyValues: {
2
+ [key: string]: any;
3
+ }): void;
4
+ export declare const LogLevel: {
5
+ readonly DEBUG: 0;
6
+ readonly INFO: 1;
7
+ readonly WARN: 2;
8
+ readonly ERROR: 3;
9
+ readonly _MUST_LOG: 9999999;
10
+ };
11
+ export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];
12
+ declare global {
13
+ const LogLevel: {
14
+ DEBUG: number;
15
+ INFO: number;
16
+ WARN: number;
17
+ ERROR: number;
18
+ _MUST_LOG: number;
19
+ };
20
+ }
21
+ export declare class Config {
22
+ static OnRPC: boolean;
23
+ static OutputDir?: string;
24
+ static LogLevel: number;
25
+ static LogCollapse: boolean;
26
+ }
package/dist/config.js ADDED
@@ -0,0 +1,27 @@
1
+ const injectedConfig = (globalThis.__FRIDA_ANALYKIT_CONFIG__) || {};
2
+ export function setGlobalProperties(keyValues) {
3
+ for (let [k, v] of Object.entries(keyValues)) {
4
+ if (k in globalThis) {
5
+ throw new Error(`global property[${k}] exists already`);
6
+ }
7
+ ;
8
+ globalThis[k] = v;
9
+ }
10
+ }
11
+ export const LogLevel = {
12
+ DEBUG: 0,
13
+ INFO: 1,
14
+ WARN: 2,
15
+ ERROR: 3,
16
+ _MUST_LOG: 9999999,
17
+ };
18
+ export class Config {
19
+ }
20
+ Config.OnRPC = injectedConfig.OnRPC ?? false;
21
+ Config.OutputDir = injectedConfig.OutputDir;
22
+ Config.LogLevel = injectedConfig.LogLevel ?? LogLevel.INFO;
23
+ Config.LogCollapse = injectedConfig.LogCollapse ?? true;
24
+ setGlobalProperties({
25
+ 'Config': Config,
26
+ 'LogLevel': LogLevel,
27
+ });
@@ -0,0 +1,18 @@
1
+ export declare const nativeFunctionOptions: NativeABI | NativeFunctionOptions;
2
+ export declare enum SYM_INFO_BIND {
3
+ STB_LOCAL = 0,
4
+ STB_GLOBAL = 1,
5
+ STB_WEAK = 2,
6
+ STB_GNU_UNIQUE = 3
7
+ }
8
+ export declare enum SYM_INFO_TYPE {
9
+ STT_NOTYPE = 0,
10
+ STT_OBJECT = 1,
11
+ STT_FUNC = 2,
12
+ STT_SECTION = 3,
13
+ STT_FILE = 4
14
+ }
15
+ export declare enum SYM_SHNDX {
16
+ SHN_UNDEF = 0,
17
+ SHN_ABS = 65521
18
+ }
package/dist/consts.js ADDED
@@ -0,0 +1,23 @@
1
+ export const nativeFunctionOptions = {
2
+ exceptions: 'propagate',
3
+ };
4
+ export var SYM_INFO_BIND;
5
+ (function (SYM_INFO_BIND) {
6
+ SYM_INFO_BIND[SYM_INFO_BIND["STB_LOCAL"] = 0] = "STB_LOCAL";
7
+ SYM_INFO_BIND[SYM_INFO_BIND["STB_GLOBAL"] = 1] = "STB_GLOBAL";
8
+ SYM_INFO_BIND[SYM_INFO_BIND["STB_WEAK"] = 2] = "STB_WEAK";
9
+ SYM_INFO_BIND[SYM_INFO_BIND["STB_GNU_UNIQUE"] = 3] = "STB_GNU_UNIQUE";
10
+ })(SYM_INFO_BIND || (SYM_INFO_BIND = {}));
11
+ export var SYM_INFO_TYPE;
12
+ (function (SYM_INFO_TYPE) {
13
+ SYM_INFO_TYPE[SYM_INFO_TYPE["STT_NOTYPE"] = 0] = "STT_NOTYPE";
14
+ SYM_INFO_TYPE[SYM_INFO_TYPE["STT_OBJECT"] = 1] = "STT_OBJECT";
15
+ SYM_INFO_TYPE[SYM_INFO_TYPE["STT_FUNC"] = 2] = "STT_FUNC";
16
+ SYM_INFO_TYPE[SYM_INFO_TYPE["STT_SECTION"] = 3] = "STT_SECTION";
17
+ SYM_INFO_TYPE[SYM_INFO_TYPE["STT_FILE"] = 4] = "STT_FILE";
18
+ })(SYM_INFO_TYPE || (SYM_INFO_TYPE = {}));
19
+ export var SYM_SHNDX;
20
+ (function (SYM_SHNDX) {
21
+ SYM_SHNDX[SYM_SHNDX["SHN_UNDEF"] = 0] = "SHN_UNDEF";
22
+ SYM_SHNDX[SYM_SHNDX["SHN_ABS"] = 65521] = "SHN_ABS";
23
+ })(SYM_SHNDX || (SYM_SHNDX = {}));
@@ -0,0 +1,10 @@
1
+ import { NativePointerObject } from "../helper.js";
2
+ export declare class InstructionSequence extends NativePointerObject {
3
+ protected readonly entryInsn: Arm64Instruction;
4
+ protected readonly insns: Arm64Instruction[];
5
+ protected eoi?: Arm64Instruction;
6
+ constructor(entry: Arm64Instruction);
7
+ static loadFromPointer<T extends InstructionSequence>(this: new (insn: Arm64Instruction) => T, handle: NativePointer): T;
8
+ [Symbol.iterator](): Generator<Arm64Instruction, void, unknown>;
9
+ clearCache(): void;
10
+ }
@@ -0,0 +1,43 @@
1
+ import { setGlobalProperties } from "../config.js";
2
+ import { NativePointerObject } from "../helper.js";
3
+ export class InstructionSequence extends NativePointerObject {
4
+ constructor(entry) {
5
+ const handle = entry.address;
6
+ super(handle);
7
+ this.insns = [];
8
+ this.entryInsn = entry;
9
+ this.insns = [entry];
10
+ }
11
+ static loadFromPointer(handle) {
12
+ const insn = Instruction.parse(handle);
13
+ return new this(insn);
14
+ }
15
+ *[Symbol.iterator]() {
16
+ let insns = this.insns;
17
+ let insn = this.entryInsn;
18
+ let inc = 0;
19
+ const that = this;
20
+ let value;
21
+ while (true) {
22
+ value = insns[inc];
23
+ if (value === undefined && that.eoi === undefined) {
24
+ try {
25
+ insn = Instruction.parse(insns[inc - 1].next);
26
+ insns.push(insn);
27
+ }
28
+ catch (error) {
29
+ that.eoi = insn;
30
+ break;
31
+ }
32
+ }
33
+ inc++;
34
+ yield insn;
35
+ }
36
+ }
37
+ clearCache() {
38
+ this.insns.length = 0;
39
+ }
40
+ }
41
+ setGlobalProperties({
42
+ InstructionSequence,
43
+ });
@@ -0,0 +1,95 @@
1
+ import { Ehdr, Phdr, Dyn, Shdr, Soinfo, Sym, Rela } from './struct.js';
2
+ import { ArrayPointer } from '../utils/array_pointer.js';
3
+ interface ElfModuleX extends BaseModule {
4
+ }
5
+ declare global {
6
+ interface BaseModule {
7
+ name: string;
8
+ base: NativePointer;
9
+ size: number;
10
+ }
11
+ }
12
+ export interface ElfModuleFixer {
13
+ fixShdrs(modx: ElfModuleX): boolean;
14
+ }
15
+ declare class ElfModuleX {
16
+ module: BaseModule;
17
+ ehdr: Ehdr;
18
+ phdrs: Phdr[];
19
+ dyntabs: Dyn[] | null;
20
+ shdrs: Shdr[] | null;
21
+ soinfo: Soinfo | null;
22
+ dynSymbols: Sym[] | null;
23
+ rela: Rela[] | null;
24
+ plt_rela: Rela[] | null;
25
+ symtab: Sym[] | null;
26
+ strtab: {
27
+ [key: number]: string;
28
+ } | null;
29
+ private _keepNativeCb;
30
+ constructor(module: BaseModule, fixers?: ElfModuleFixer[], { symbolScanLimit }?: {
31
+ symbolScanLimit?: number;
32
+ });
33
+ static loadFromModule(mod: Module): ElfModuleX;
34
+ readEhdr(): {
35
+ ei_class: number;
36
+ e_type: number;
37
+ e_phoff: number;
38
+ e_shoff: number;
39
+ e_phnum: number;
40
+ e_shnum: number;
41
+ e_shstrndx: number;
42
+ };
43
+ readPhdrs(): Phdr[];
44
+ readDyntabs(): Dyn[] | null;
45
+ load_bias(value: number | NativePointer): NativePointer;
46
+ prelink_image(): Soinfo | null;
47
+ link_image(): void;
48
+ off2addr(offset: number): number | null;
49
+ readShdrs(): Shdr[] | null;
50
+ getSymString(index: number): string | null;
51
+ scanSymbols(cursor: number, limit: number): Sym[] | null;
52
+ readRela(): Rela[] | null;
53
+ readPltRela(): Rela[] | null;
54
+ attachSymbol<RetType extends NativeFunctionReturnType, ArgTypes extends any[]>(symName: string, fn: AnyFunction, retType: RetType, argTypes: ArgTypes, abi?: undefined): boolean;
55
+ findSymbol(symName: string): Sym | undefined;
56
+ fromAddress(addr: NativePointer): string | NativePointer | null;
57
+ isMyAddr(addr: NativePointer): boolean;
58
+ getSegment(seg: string): Shdr | null;
59
+ dump(tag: string): void;
60
+ }
61
+ export { ElfModuleX };
62
+ export declare class ElfFileFixer implements ElfModuleFixer {
63
+ path: string;
64
+ private modx?;
65
+ private fileBytes?;
66
+ private ehdr?;
67
+ private phdrs?;
68
+ private shdrs?;
69
+ private strtab?;
70
+ private shstrtabShdr?;
71
+ constructor(path: string);
72
+ getFilePtr(): ArrayPointer;
73
+ ensureEhdr(): void;
74
+ ensurePhdrs(): void;
75
+ ensureShdrs(): void;
76
+ ensureStrtab(): void;
77
+ readEhdr(): {
78
+ ei_class: number;
79
+ e_type: number;
80
+ e_phoff: number;
81
+ e_shoff: number;
82
+ e_phnum: number;
83
+ e_shnum: number;
84
+ e_shstrndx: number;
85
+ };
86
+ readPhdrs(): Phdr[];
87
+ readShdrs(): Shdr[];
88
+ readStrtab(): {
89
+ [key: number]: string;
90
+ } | undefined;
91
+ getShstrtabString(nameOff: number): string;
92
+ getSymString(nameIDX: number): string;
93
+ readSymtab(): Sym[] | null;
94
+ fixShdrs(modx: ElfModuleX): boolean;
95
+ }