@efffrida/frida-tools 0.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/FridaDevice/package.json +6 -0
- package/FridaDeviceAcquisitionError/package.json +6 -0
- package/FridaScript/package.json +6 -0
- package/FridaSession/package.json +6 -0
- package/FridaSessionError/package.json +6 -0
- package/LICENSE +674 -0
- package/README.md +30 -0
- package/dist/cjs/FridaDevice.js +61 -0
- package/dist/cjs/FridaDevice.js.map +1 -0
- package/dist/cjs/FridaDeviceAcquisitionError.js +34 -0
- package/dist/cjs/FridaDeviceAcquisitionError.js.map +1 -0
- package/dist/cjs/FridaScript.js +41 -0
- package/dist/cjs/FridaScript.js.map +1 -0
- package/dist/cjs/FridaSession.js +46 -0
- package/dist/cjs/FridaSession.js.map +1 -0
- package/dist/cjs/FridaSessionError.js +38 -0
- package/dist/cjs/FridaSessionError.js.map +1 -0
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/internal/device.js +69 -0
- package/dist/cjs/internal/device.js.map +1 -0
- package/dist/cjs/internal/script.js +164 -0
- package/dist/cjs/internal/script.js.map +1 -0
- package/dist/cjs/internal/session.js +56 -0
- package/dist/cjs/internal/session.js.map +1 -0
- package/dist/dts/FridaDevice.d.ts +69 -0
- package/dist/dts/FridaDevice.d.ts.map +1 -0
- package/dist/dts/FridaDeviceAcquisitionError.d.ts +35 -0
- package/dist/dts/FridaDeviceAcquisitionError.d.ts.map +1 -0
- package/dist/dts/FridaScript.d.ts +80 -0
- package/dist/dts/FridaScript.d.ts.map +1 -0
- package/dist/dts/FridaSession.d.ts +56 -0
- package/dist/dts/FridaSession.d.ts.map +1 -0
- package/dist/dts/FridaSessionError.d.ts +35 -0
- package/dist/dts/FridaSessionError.d.ts.map +1 -0
- package/dist/dts/index.d.ts +31 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/internal/device.d.ts +2 -0
- package/dist/dts/internal/device.d.ts.map +1 -0
- package/dist/dts/internal/script.d.ts +2 -0
- package/dist/dts/internal/script.d.ts.map +1 -0
- package/dist/dts/internal/session.d.ts +2 -0
- package/dist/dts/internal/session.d.ts.map +1 -0
- package/dist/esm/FridaDevice.js +52 -0
- package/dist/esm/FridaDevice.js.map +1 -0
- package/dist/esm/FridaDeviceAcquisitionError.js +23 -0
- package/dist/esm/FridaDeviceAcquisitionError.js.map +1 -0
- package/dist/esm/FridaScript.js +32 -0
- package/dist/esm/FridaScript.js.map +1 -0
- package/dist/esm/FridaSession.js +37 -0
- package/dist/esm/FridaSession.js.map +1 -0
- package/dist/esm/FridaSessionError.js +27 -0
- package/dist/esm/FridaSessionError.js.map +1 -0
- package/dist/esm/index.js +31 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/device.js +55 -0
- package/dist/esm/internal/device.js.map +1 -0
- package/dist/esm/internal/script.js +155 -0
- package/dist/esm/internal/script.js.map +1 -0
- package/dist/esm/internal/session.js +44 -0
- package/dist/esm/internal/session.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/package.json +76 -0
- package/src/FridaDevice.ts +103 -0
- package/src/FridaDeviceAcquisitionError.ts +42 -0
- package/src/FridaScript.ts +117 -0
- package/src/FridaSession.ts +76 -0
- package/src/FridaSessionError.ts +42 -0
- package/src/index.ts +34 -0
- package/src/internal/device.ts +93 -0
- package/src/internal/script.ts +208 -0
- package/src/internal/session.ts +73 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Predicate from "effect/Predicate";
|
|
5
|
+
import * as Frida from "frida";
|
|
6
|
+
import * as FridaDeviceAcquisitionError from "../FridaDeviceAcquisitionError.js";
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const FridaDeviceTypeId = /*#__PURE__*/Symbol.for("@efffrida/frida-tools/FridaDevice");
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const Tag = /*#__PURE__*/Context.GenericTag("@efffrida/frida-tools/FridaDevice");
|
|
11
|
+
/** @internal */
|
|
12
|
+
export const isFridaDevice = u => Predicate.hasProperty(u, FridaDeviceTypeId);
|
|
13
|
+
/** @internal */
|
|
14
|
+
export const acquireUsbDevice = options => Effect.map(Effect.tryPromise({
|
|
15
|
+
try: () => Frida.getUsbDevice(options),
|
|
16
|
+
catch: cause => new FridaDeviceAcquisitionError.FridaDeviceAcquisitionError({
|
|
17
|
+
cause,
|
|
18
|
+
attempts: 1,
|
|
19
|
+
acquisitionMethod: "usb"
|
|
20
|
+
})
|
|
21
|
+
}), device => ({
|
|
22
|
+
device,
|
|
23
|
+
[FridaDeviceTypeId]: FridaDeviceTypeId
|
|
24
|
+
}));
|
|
25
|
+
/** @internal */
|
|
26
|
+
export const acquireRemoteDevice = (address, options) => Effect.map(Effect.tryPromise({
|
|
27
|
+
try: () => Frida.getDeviceManager().addRemoteDevice(address, options),
|
|
28
|
+
catch: cause => new FridaDeviceAcquisitionError.FridaDeviceAcquisitionError({
|
|
29
|
+
cause,
|
|
30
|
+
attempts: 1,
|
|
31
|
+
acquisitionMethod: "remote"
|
|
32
|
+
})
|
|
33
|
+
}), device => ({
|
|
34
|
+
device,
|
|
35
|
+
[FridaDeviceTypeId]: FridaDeviceTypeId
|
|
36
|
+
}));
|
|
37
|
+
/** @internal */
|
|
38
|
+
export const acquireLocalDevice = () => Effect.map(Effect.tryPromise({
|
|
39
|
+
try: () => Frida.getLocalDevice(),
|
|
40
|
+
catch: cause => new FridaDeviceAcquisitionError.FridaDeviceAcquisitionError({
|
|
41
|
+
cause,
|
|
42
|
+
attempts: 1,
|
|
43
|
+
acquisitionMethod: "local"
|
|
44
|
+
})
|
|
45
|
+
}), device => ({
|
|
46
|
+
device,
|
|
47
|
+
[FridaDeviceTypeId]: FridaDeviceTypeId
|
|
48
|
+
}));
|
|
49
|
+
/** @internal */
|
|
50
|
+
export const layerRemoteDevice = (address, options) => Layer.effect(Tag, acquireRemoteDevice(address, options));
|
|
51
|
+
/** @internal */
|
|
52
|
+
export const layerUsbDevice = options => Layer.effect(Tag, acquireUsbDevice(options));
|
|
53
|
+
/** @internal */
|
|
54
|
+
export const layerLocalDevice = /*#__PURE__*/Layer.effect(Tag, /*#__PURE__*/acquireLocalDevice());
|
|
55
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","names":["Context","Effect","Layer","Predicate","Frida","FridaDeviceAcquisitionError","FridaDeviceTypeId","Symbol","for","Tag","GenericTag","isFridaDevice","u","hasProperty","acquireUsbDevice","options","map","tryPromise","try","getUsbDevice","catch","cause","attempts","acquisitionMethod","device","acquireRemoteDevice","address","getDeviceManager","addRemoteDevice","acquireLocalDevice","getLocalDevice","layerRemoteDevice","effect","layerUsbDevice","layerLocalDevice"],"sources":["../../../src/internal/device.ts"],"sourcesContent":[null],"mappings":"AAEA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,SAAS,MAAM,kBAAkB;AAC7C,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,OAAO,KAAKC,2BAA2B,MAAM,mCAAmC;AAEhF;AACA,OAAO,MAAMC,iBAAiB,gBAAkCC,MAAM,CAACC,GAAG,CACtE,mCAAmC,CACL;AAElC;AACA,OAAO,MAAMC,GAAG,gBAAGT,OAAO,CAACU,UAAU,CAA0B,mCAAmC,CAAC;AAEnG;AACA,OAAO,MAAMC,aAAa,GAAIC,CAAU,IAAmCT,SAAS,CAACU,WAAW,CAACD,CAAC,EAAEN,iBAAiB,CAAC;AAEtH;AACA,OAAO,MAAMQ,gBAAgB,GACzBC,OAA4C,IAE5Cd,MAAM,CAACe,GAAG,CACNf,MAAM,CAACgB,UAAU,CAAC;EACdC,GAAG,EAAEA,CAAA,KAAMd,KAAK,CAACe,YAAY,CAACJ,OAAO,CAAC;EACtCK,KAAK,EAAGC,KAAK,IACT,IAAIhB,2BAA2B,CAACA,2BAA2B,CAAC;IACxDgB,KAAK;IACLC,QAAQ,EAAE,CAAC;IACXC,iBAAiB,EAAE;GACtB;CACR,CAAC,EACDC,MAAM,KAAM;EAAEA,MAAM;EAAE,CAAClB,iBAAiB,GAAGA;AAAiB,CAAE,CAAU,CAC5E;AAEL;AACA,OAAO,MAAMmB,mBAAmB,GAAGA,CAC/BC,OAAe,EACfX,OAA+C,KAE/Cd,MAAM,CAACe,GAAG,CACNf,MAAM,CAACgB,UAAU,CAAC;EACdC,GAAG,EAAEA,CAAA,KAAMd,KAAK,CAACuB,gBAAgB,EAAE,CAACC,eAAe,CAACF,OAAO,EAAEX,OAAO,CAAC;EACrEK,KAAK,EAAGC,KAAK,IACT,IAAIhB,2BAA2B,CAACA,2BAA2B,CAAC;IACxDgB,KAAK;IACLC,QAAQ,EAAE,CAAC;IACXC,iBAAiB,EAAE;GACtB;CACR,CAAC,EACDC,MAAM,KAAM;EAAEA,MAAM;EAAE,CAAClB,iBAAiB,GAAGA;AAAiB,CAAE,CAAU,CAC5E;AAEL;AACA,OAAO,MAAMuB,kBAAkB,GAAGA,CAAA,KAK9B5B,MAAM,CAACe,GAAG,CACNf,MAAM,CAACgB,UAAU,CAAC;EACdC,GAAG,EAAEA,CAAA,KAAMd,KAAK,CAAC0B,cAAc,EAAE;EACjCV,KAAK,EAAGC,KAAK,IACT,IAAIhB,2BAA2B,CAACA,2BAA2B,CAAC;IACxDgB,KAAK;IACLC,QAAQ,EAAE,CAAC;IACXC,iBAAiB,EAAE;GACtB;CACR,CAAC,EACDC,MAAM,KAAM;EAAEA,MAAM;EAAE,CAAClB,iBAAiB,GAAGA;AAAiB,CAAE,CAAU,CAC5E;AAEL;AACA,OAAO,MAAMyB,iBAAiB,GAAGA,CAC7BL,OAAe,EACfX,OAA+C,KAE/Cb,KAAK,CAAC8B,MAAM,CAACvB,GAAG,EAAEgB,mBAAmB,CAACC,OAAO,EAAEX,OAAO,CAAC,CAAC;AAE5D;AACA,OAAO,MAAMkB,cAAc,GACvBlB,OAA4C,IAE5Cb,KAAK,CAAC8B,MAAM,CAACvB,GAAG,EAAEK,gBAAgB,CAACC,OAAO,CAAC,CAAC;AAEhD;AACA,OAAO,MAAMmB,gBAAgB,gBAIzBhC,KAAK,CAAC8B,MAAM,CAACvB,GAAG,eAAEoB,kBAAkB,EAAE,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Deferred from "effect/Deferred";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Function from "effect/Function";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import * as Option from "effect/Option";
|
|
7
|
+
import * as Predicate from "effect/Predicate";
|
|
8
|
+
import * as Queue from "effect/Queue";
|
|
9
|
+
import * as Sink from "effect/Sink";
|
|
10
|
+
import * as Stream from "effect/Stream";
|
|
11
|
+
import * as Take from "effect/Take";
|
|
12
|
+
import * as Frida from "frida";
|
|
13
|
+
import * as FridaDevice from "../FridaDevice.js";
|
|
14
|
+
import * as FridaSession from "../FridaSession.js";
|
|
15
|
+
import * as FridaSessionError from "../FridaSessionError.js";
|
|
16
|
+
/** @internal */
|
|
17
|
+
export const FridaScriptTypeId = /*#__PURE__*/Symbol.for("@efffrida/frida-tools/FridaScript");
|
|
18
|
+
/** @internal */
|
|
19
|
+
export const Tag = /*#__PURE__*/Context.GenericTag("@efffrida/frida-tools/FridaScript");
|
|
20
|
+
/** @internal */
|
|
21
|
+
export const isFridaScript = u => Predicate.hasProperty(u, FridaScriptTypeId);
|
|
22
|
+
/** @internal */
|
|
23
|
+
export const load = /*#__PURE__*/Function.dual(arguments_ => Predicate.isString(arguments_[0]) || Buffer.isBuffer(arguments_[0]), /*#__PURE__*/Effect.fnUntraced(function* (source, options) {
|
|
24
|
+
const {
|
|
25
|
+
device
|
|
26
|
+
} = yield* FridaDevice.FridaDevice;
|
|
27
|
+
const {
|
|
28
|
+
session
|
|
29
|
+
} = yield* FridaSession.FridaSession;
|
|
30
|
+
const script = Predicate.isString(source) ? yield* Effect.tryPromise({
|
|
31
|
+
try: () => session.createScript(source, {
|
|
32
|
+
runtime: Frida.ScriptRuntime.V8,
|
|
33
|
+
...options
|
|
34
|
+
}),
|
|
35
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
36
|
+
cause,
|
|
37
|
+
when: "compile"
|
|
38
|
+
})
|
|
39
|
+
}) : yield* Effect.tryPromise({
|
|
40
|
+
try: () => session.createScriptFromBytes(source, {
|
|
41
|
+
runtime: Frida.ScriptRuntime.V8,
|
|
42
|
+
...options
|
|
43
|
+
}),
|
|
44
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
45
|
+
cause,
|
|
46
|
+
when: "compile"
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
const messageQueue = yield* Queue.unbounded();
|
|
50
|
+
let scriptDefectCause = undefined;
|
|
51
|
+
const messageHandler = (message, data) => {
|
|
52
|
+
switch (message.type) {
|
|
53
|
+
case Frida.MessageType.Error:
|
|
54
|
+
{
|
|
55
|
+
const error = new Error();
|
|
56
|
+
error.name = "FridaScriptDefect";
|
|
57
|
+
error.stack = message.stack ?? "";
|
|
58
|
+
error.message = message.description.replace(/Error: /, "") ?? "";
|
|
59
|
+
scriptDefectCause = error;
|
|
60
|
+
const sessionError = new FridaSessionError.FridaSessionError({
|
|
61
|
+
when: "message",
|
|
62
|
+
cause: error.cause
|
|
63
|
+
});
|
|
64
|
+
const asTake = Take.fail(sessionError);
|
|
65
|
+
Queue.unsafeOffer(messageQueue, asTake);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case Frida.MessageType.Send:
|
|
69
|
+
{
|
|
70
|
+
const asTake = Take.of({
|
|
71
|
+
message: message.payload,
|
|
72
|
+
data: Option.fromNullable(data)
|
|
73
|
+
});
|
|
74
|
+
Queue.unsafeOffer(messageQueue, asTake);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
default:
|
|
78
|
+
Function.absurd(message);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const disconnectMessageHandler = Effect.sync(() => script.message.disconnect(messageHandler));
|
|
82
|
+
yield* Effect.addFinalizer(() => Effect.flatMap(messageQueue.shutdown, () => disconnectMessageHandler));
|
|
83
|
+
script.message.connect(messageHandler);
|
|
84
|
+
const stream = Stream.fromQueue(messageQueue).pipe(Stream.flattenTake);
|
|
85
|
+
const sink = Sink.forEach(({
|
|
86
|
+
data,
|
|
87
|
+
message
|
|
88
|
+
}) => {
|
|
89
|
+
if (Predicate.isNotUndefined(scriptDefectCause)) {
|
|
90
|
+
return Effect.fail(new FridaSessionError.FridaSessionError({
|
|
91
|
+
when: "rpcCall",
|
|
92
|
+
cause: scriptDefectCause
|
|
93
|
+
}));
|
|
94
|
+
} else {
|
|
95
|
+
return Effect.sync(() => script.post(message, Option.getOrNull(data)));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const destroyed = yield* Deferred.make();
|
|
99
|
+
const destroyedHandler = () => Deferred.unsafeDone(destroyed, Effect.void);
|
|
100
|
+
script.destroyed.connect(destroyedHandler);
|
|
101
|
+
const callExport = exportName => Effect.fn(`call frida export ${exportName}`)(function* (...args) {
|
|
102
|
+
yield* Effect.annotateCurrentSpan("args", args);
|
|
103
|
+
const isDestroyed = yield* Deferred.isDone(destroyed);
|
|
104
|
+
if (isDestroyed) {
|
|
105
|
+
return yield* new FridaSessionError.FridaSessionError({
|
|
106
|
+
when: "rpcCall",
|
|
107
|
+
cause: "Script is destroyed"
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (Predicate.isNotUndefined(scriptDefectCause)) {
|
|
111
|
+
return yield* new FridaSessionError.FridaSessionError({
|
|
112
|
+
when: "rpcCall",
|
|
113
|
+
cause: scriptDefectCause
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const result = yield* Effect.tryPromise({
|
|
117
|
+
try: () => script.exports[exportName](...args),
|
|
118
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
119
|
+
when: "rpcCall",
|
|
120
|
+
cause
|
|
121
|
+
})
|
|
122
|
+
});
|
|
123
|
+
yield* Effect.annotateCurrentSpan("result", result);
|
|
124
|
+
return result;
|
|
125
|
+
});
|
|
126
|
+
yield* Effect.tryPromise({
|
|
127
|
+
try: () => script.load(),
|
|
128
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
129
|
+
cause,
|
|
130
|
+
when: "load"
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
if (options?.resume === true) {
|
|
134
|
+
yield* Effect.tryPromise({
|
|
135
|
+
try: () => device.resume(session.pid),
|
|
136
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
137
|
+
cause,
|
|
138
|
+
when: "resume"
|
|
139
|
+
})
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
script,
|
|
144
|
+
stream,
|
|
145
|
+
sink,
|
|
146
|
+
destroyed,
|
|
147
|
+
callExport,
|
|
148
|
+
[FridaScriptTypeId]: FridaScriptTypeId
|
|
149
|
+
};
|
|
150
|
+
}, /*#__PURE__*/Effect.acquireRelease(({
|
|
151
|
+
script
|
|
152
|
+
}) => Effect.promise(() => script.unload()))));
|
|
153
|
+
/** @internal */
|
|
154
|
+
export const layer = /*#__PURE__*/Function.dual(arguments_ => Predicate.isString(arguments_[0]), (source, options) => Layer.scoped(Tag, load(source, options)));
|
|
155
|
+
//# sourceMappingURL=script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.js","names":["Context","Deferred","Effect","Function","Layer","Option","Predicate","Queue","Sink","Stream","Take","Frida","FridaDevice","FridaSession","FridaSessionError","FridaScriptTypeId","Symbol","for","Tag","GenericTag","isFridaScript","u","hasProperty","load","dual","arguments_","isString","Buffer","isBuffer","fnUntraced","source","options","device","session","script","tryPromise","try","createScript","runtime","ScriptRuntime","V8","catch","cause","when","createScriptFromBytes","messageQueue","unbounded","scriptDefectCause","undefined","messageHandler","message","data","type","MessageType","Error","error","name","stack","description","replace","sessionError","asTake","fail","unsafeOffer","Send","of","payload","fromNullable","absurd","disconnectMessageHandler","sync","disconnect","addFinalizer","flatMap","shutdown","connect","stream","fromQueue","pipe","flattenTake","sink","forEach","isNotUndefined","post","getOrNull","destroyed","make","destroyedHandler","unsafeDone","void","callExport","exportName","fn","args","annotateCurrentSpan","isDestroyed","isDone","result","exports","resume","pid","acquireRelease","promise","unload","layer","scoped"],"sources":["../../../src/internal/script.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Predicate from "effect/Predicate";
|
|
5
|
+
import * as FridaDevice from "../FridaDevice.js";
|
|
6
|
+
import * as FridaSessionError from "../FridaSessionError.js";
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const FridaSessionTypeId = /*#__PURE__*/Symbol.for("@efffrida/frida-tools/FridaSession");
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const Tag = /*#__PURE__*/Context.GenericTag("@efffrida/frida-tools/FridaSession");
|
|
11
|
+
/** @internal */
|
|
12
|
+
export const isFridaSession = u => Predicate.hasProperty(u, FridaSessionTypeId);
|
|
13
|
+
/** @internal */
|
|
14
|
+
export const spawn = (program, options) => Effect.flatMap(FridaDevice.FridaDevice, ({
|
|
15
|
+
device
|
|
16
|
+
}) => Effect.acquireRelease(Effect.tryPromise({
|
|
17
|
+
try: () => device.spawn(program, options),
|
|
18
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
19
|
+
cause,
|
|
20
|
+
when: "spawn"
|
|
21
|
+
})
|
|
22
|
+
}), pid => Effect.promise(() => device.kill(pid))));
|
|
23
|
+
/** @internal */
|
|
24
|
+
export const attach = (target, options) => Effect.flatMap(FridaDevice.FridaDevice, ({
|
|
25
|
+
device
|
|
26
|
+
}) => Effect.acquireRelease(Effect.map(Effect.tryPromise({
|
|
27
|
+
try: () => device.attach(target, options),
|
|
28
|
+
catch: cause => new FridaSessionError.FridaSessionError({
|
|
29
|
+
cause,
|
|
30
|
+
when: "attach"
|
|
31
|
+
})
|
|
32
|
+
}), session => ({
|
|
33
|
+
session,
|
|
34
|
+
[FridaSessionTypeId]: FridaSessionTypeId
|
|
35
|
+
})), ({
|
|
36
|
+
session
|
|
37
|
+
}) => Effect.promise(() => session.detach())));
|
|
38
|
+
/** @internal */
|
|
39
|
+
export const layer = (target, options) => Layer.scoped(Tag, Effect.gen(function* () {
|
|
40
|
+
const pid = yield* spawn(target, options);
|
|
41
|
+
const session = yield* attach(pid, options);
|
|
42
|
+
return session;
|
|
43
|
+
}));
|
|
44
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","names":["Context","Effect","Layer","Predicate","FridaDevice","FridaSessionError","FridaSessionTypeId","Symbol","for","Tag","GenericTag","isFridaSession","u","hasProperty","spawn","program","options","flatMap","device","acquireRelease","tryPromise","try","catch","cause","when","pid","promise","kill","attach","target","map","session","detach","layer","scoped","gen"],"sources":["../../../src/internal/session.ts"],"sourcesContent":[null],"mappings":"AAIA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,SAAS,MAAM,kBAAkB;AAC7C,OAAO,KAAKC,WAAW,MAAM,mBAAmB;AAChD,OAAO,KAAKC,iBAAiB,MAAM,yBAAyB;AAE5D;AACA,OAAO,MAAMC,kBAAkB,gBAAoCC,MAAM,CAACC,GAAG,CACzE,oCAAoC,CACJ;AAEpC;AACA,OAAO,MAAMC,GAAG,gBAAGT,OAAO,CAACU,UAAU,CAA4B,oCAAoC,CAAC;AAEtG;AACA,OAAO,MAAMC,cAAc,GAAIC,CAAU,IACrCT,SAAS,CAACU,WAAW,CAACD,CAAC,EAAEN,kBAAkB,CAAC;AAEhD;AACA,OAAO,MAAMQ,KAAK,GAAGA,CACjBC,OAA+B,EAC/BC,OAAwC,KAExCf,MAAM,CAACgB,OAAO,CAACb,WAAW,CAACA,WAAW,EAAE,CAAC;EAAEc;AAAM,CAAE,KAC/CjB,MAAM,CAACkB,cAAc,CACjBlB,MAAM,CAACmB,UAAU,CAAC;EACdC,GAAG,EAAEA,CAAA,KAAMH,MAAM,CAACJ,KAAK,CAACC,OAAO,EAAEC,OAAO,CAAC;EACzCM,KAAK,EAAGC,KAAK,IAAK,IAAIlB,iBAAiB,CAACA,iBAAiB,CAAC;IAAEkB,KAAK;IAAEC,IAAI,EAAE;EAAO,CAAE;CACrF,CAAC,EACDC,GAAG,IAAKxB,MAAM,CAACyB,OAAO,CAAC,MAAMR,MAAM,CAACS,IAAI,CAACF,GAAG,CAAC,CAAC,CAClD,CACJ;AAEL;AACA,OAAO,MAAMG,MAAM,GAAGA,CAClBC,MAA2B,EAC3Bb,OAA0C,KAM1Cf,MAAM,CAACgB,OAAO,CAACb,WAAW,CAACA,WAAW,EAAE,CAAC;EAAEc;AAAM,CAAE,KAC/CjB,MAAM,CAACkB,cAAc,CACjBlB,MAAM,CAAC6B,GAAG,CACN7B,MAAM,CAACmB,UAAU,CAAC;EACdC,GAAG,EAAEA,CAAA,KAAMH,MAAM,CAACU,MAAM,CAACC,MAAM,EAAEb,OAAO,CAAC;EACzCM,KAAK,EAAGC,KAAK,IAAK,IAAIlB,iBAAiB,CAACA,iBAAiB,CAAC;IAAEkB,KAAK;IAAEC,IAAI,EAAE;EAAQ,CAAE;CACtF,CAAC,EACDO,OAAO,KAAM;EAAEA,OAAO;EAAE,CAACzB,kBAAkB,GAAGA;AAAkB,CAAE,CAAU,CAChF,EACD,CAAC;EAAEyB;AAAO,CAA6B,KAAK9B,MAAM,CAACyB,OAAO,CAAC,MAAMK,OAAO,CAACC,MAAM,EAAE,CAAC,CACrF,CACJ;AAEL;AACA,OAAO,MAAMC,KAAK,GAAGA,CACjBJ,MAAc,EACdb,OAAiE,KAEjEd,KAAK,CAACgC,MAAM,CACRzB,GAAG,EACHR,MAAM,CAACkC,GAAG,CAAC,aAAS;EAChB,MAAMV,GAAG,GAAG,OAAOX,KAAK,CAACe,MAAM,EAAEb,OAAO,CAAC;EACzC,MAAMe,OAAO,GAAG,OAAOH,MAAM,CAACH,GAAG,EAAET,OAAO,CAAC;EAC3C,OAAOe,OAAO;AAClB,CAAC,CAAC,CACL","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@efffrida/frida-tools",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Frida with effect-ts",
|
|
5
|
+
"license": "GPL-3.0-only",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/leoconforti/efffrida.git",
|
|
9
|
+
"directory": "packages/frida-tools"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": [],
|
|
12
|
+
"author": "Leo Conforti <leo@leoconforti.us> (https://leoconforti.us)",
|
|
13
|
+
"homepage": "https://github.com/leoconforti/efffrida",
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"frida": "16.7.10"
|
|
16
|
+
},
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"@effect/platform": "0.80.7",
|
|
19
|
+
"effect": "3.14.7"
|
|
20
|
+
},
|
|
21
|
+
"main": "./dist/cjs/index.js",
|
|
22
|
+
"module": "./dist/esm/index.js",
|
|
23
|
+
"types": "./dist/dts/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
"./package.json": "./package.json",
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/dts/index.d.ts",
|
|
28
|
+
"import": "./dist/esm/index.js",
|
|
29
|
+
"default": "./dist/cjs/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./FridaDevice": {
|
|
32
|
+
"types": "./dist/dts/FridaDevice.d.ts",
|
|
33
|
+
"import": "./dist/esm/FridaDevice.js",
|
|
34
|
+
"default": "./dist/cjs/FridaDevice.js"
|
|
35
|
+
},
|
|
36
|
+
"./FridaDeviceAcquisitionError": {
|
|
37
|
+
"types": "./dist/dts/FridaDeviceAcquisitionError.d.ts",
|
|
38
|
+
"import": "./dist/esm/FridaDeviceAcquisitionError.js",
|
|
39
|
+
"default": "./dist/cjs/FridaDeviceAcquisitionError.js"
|
|
40
|
+
},
|
|
41
|
+
"./FridaScript": {
|
|
42
|
+
"types": "./dist/dts/FridaScript.d.ts",
|
|
43
|
+
"import": "./dist/esm/FridaScript.js",
|
|
44
|
+
"default": "./dist/cjs/FridaScript.js"
|
|
45
|
+
},
|
|
46
|
+
"./FridaSession": {
|
|
47
|
+
"types": "./dist/dts/FridaSession.d.ts",
|
|
48
|
+
"import": "./dist/esm/FridaSession.js",
|
|
49
|
+
"default": "./dist/cjs/FridaSession.js"
|
|
50
|
+
},
|
|
51
|
+
"./FridaSessionError": {
|
|
52
|
+
"types": "./dist/dts/FridaSessionError.d.ts",
|
|
53
|
+
"import": "./dist/esm/FridaSessionError.js",
|
|
54
|
+
"default": "./dist/cjs/FridaSessionError.js"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"typesVersions": {
|
|
58
|
+
"*": {
|
|
59
|
+
"FridaDevice": [
|
|
60
|
+
"./dist/dts/FridaDevice.d.ts"
|
|
61
|
+
],
|
|
62
|
+
"FridaDeviceAcquisitionError": [
|
|
63
|
+
"./dist/dts/FridaDeviceAcquisitionError.d.ts"
|
|
64
|
+
],
|
|
65
|
+
"FridaScript": [
|
|
66
|
+
"./dist/dts/FridaScript.d.ts"
|
|
67
|
+
],
|
|
68
|
+
"FridaSession": [
|
|
69
|
+
"./dist/dts/FridaSession.d.ts"
|
|
70
|
+
],
|
|
71
|
+
"FridaSessionError": [
|
|
72
|
+
"./dist/dts/FridaSessionError.d.ts"
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frida devices
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type * as Context from "effect/Context";
|
|
8
|
+
import type * as Effect from "effect/Effect";
|
|
9
|
+
import type * as Layer from "effect/Layer";
|
|
10
|
+
import type * as Frida from "frida";
|
|
11
|
+
import type * as FridaDeviceAcquisitionError from "./FridaDeviceAcquisitionError.js";
|
|
12
|
+
|
|
13
|
+
import * as internal from "./internal/device.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
* @category Type ids
|
|
18
|
+
*/
|
|
19
|
+
export const FridaDeviceTypeId: unique symbol = internal.FridaDeviceTypeId;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
* @category Type ids
|
|
24
|
+
*/
|
|
25
|
+
export type FridaDeviceTypeId = typeof FridaDeviceTypeId;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
* @category Models
|
|
30
|
+
*/
|
|
31
|
+
export interface FridaDevice {
|
|
32
|
+
readonly device: Frida.Device;
|
|
33
|
+
readonly [FridaDeviceTypeId]: typeof FridaDeviceTypeId;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @since 1.0.0
|
|
38
|
+
* @category Tags
|
|
39
|
+
*/
|
|
40
|
+
export const FridaDevice: Context.Tag<FridaDevice, FridaDevice> = internal.Tag;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @since 1.0.0
|
|
44
|
+
* @category Predicates
|
|
45
|
+
*/
|
|
46
|
+
export const isFridaDevice: (u: unknown) => u is FridaDevice = internal.isFridaDevice;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
* @category Device acquisition
|
|
51
|
+
*/
|
|
52
|
+
export const acquireUsbDevice: (
|
|
53
|
+
options?: Frida.GetDeviceOptions | undefined
|
|
54
|
+
) => Effect.Effect<FridaDevice, FridaDeviceAcquisitionError.FridaDeviceAcquisitionError, never> =
|
|
55
|
+
internal.acquireUsbDevice;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @since 1.0.0
|
|
59
|
+
* @category Device acquisition
|
|
60
|
+
*/
|
|
61
|
+
export const acquireRemoteDevice: (
|
|
62
|
+
address: string,
|
|
63
|
+
options?: Frida.RemoteDeviceOptions | undefined
|
|
64
|
+
) => Effect.Effect<FridaDevice, FridaDeviceAcquisitionError.FridaDeviceAcquisitionError, never> =
|
|
65
|
+
internal.acquireRemoteDevice;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @since 1.0.0
|
|
69
|
+
* @category Device acquisition
|
|
70
|
+
*/
|
|
71
|
+
export const acquireLocalDevice: () => Effect.Effect<
|
|
72
|
+
FridaDevice,
|
|
73
|
+
FridaDeviceAcquisitionError.FridaDeviceAcquisitionError,
|
|
74
|
+
never
|
|
75
|
+
> = internal.acquireLocalDevice;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @since 1.0.0
|
|
79
|
+
* @category Layers
|
|
80
|
+
*/
|
|
81
|
+
export const layerRemoteDevice: (
|
|
82
|
+
address: string,
|
|
83
|
+
options?: Frida.RemoteDeviceOptions | undefined
|
|
84
|
+
) => Layer.Layer<FridaDevice, FridaDeviceAcquisitionError.FridaDeviceAcquisitionError, never> =
|
|
85
|
+
internal.layerRemoteDevice;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @since 1.0.0
|
|
89
|
+
* @category Layers
|
|
90
|
+
*/
|
|
91
|
+
export const layerUsbDevice: (
|
|
92
|
+
options?: Frida.GetDeviceOptions | undefined
|
|
93
|
+
) => Layer.Layer<FridaDevice, FridaDeviceAcquisitionError.FridaDeviceAcquisitionError, never> = internal.layerUsbDevice;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @since 1.0.0
|
|
97
|
+
* @category Layers
|
|
98
|
+
*/
|
|
99
|
+
export const layerLocalDevice: Layer.Layer<
|
|
100
|
+
FridaDevice,
|
|
101
|
+
FridaDeviceAcquisitionError.FridaDeviceAcquisitionError,
|
|
102
|
+
never
|
|
103
|
+
> = internal.layerLocalDevice;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frida device acquisition errors
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as PlatformError from "@effect/platform/Error";
|
|
8
|
+
import * as Predicate from "effect/Predicate";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
* @category Errors
|
|
13
|
+
*/
|
|
14
|
+
export const FridaDeviceAcquisitionErrorTypeId: unique symbol = Symbol.for(
|
|
15
|
+
"@efffrida/FridaError/FridaDeviceAcquisitionError"
|
|
16
|
+
) as FridaDeviceAcquisitionErrorTypeId;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
* @category Errors
|
|
21
|
+
*/
|
|
22
|
+
export type FridaDeviceAcquisitionErrorTypeId = typeof FridaDeviceAcquisitionErrorTypeId;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
* @category Errors
|
|
27
|
+
*/
|
|
28
|
+
export const isFridaDeviceAcquisitionError = (u: unknown): u is FridaDeviceAcquisitionError =>
|
|
29
|
+
Predicate.hasProperty(u, FridaDeviceAcquisitionErrorTypeId);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @since 1.0.0
|
|
33
|
+
* @category Errors
|
|
34
|
+
*/
|
|
35
|
+
export class FridaDeviceAcquisitionError extends PlatformError.TypeIdError(
|
|
36
|
+
FridaDeviceAcquisitionErrorTypeId,
|
|
37
|
+
"FridaDeviceAcquisitionError"
|
|
38
|
+
)<{
|
|
39
|
+
cause: unknown;
|
|
40
|
+
attempts: number;
|
|
41
|
+
acquisitionMethod: "usb" | "remote" | "local";
|
|
42
|
+
}> {}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frida scripts
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type * as Context from "effect/Context";
|
|
8
|
+
import type * as Deferred from "effect/Deferred";
|
|
9
|
+
import type * as Effect from "effect/Effect";
|
|
10
|
+
import type * as Layer from "effect/Layer";
|
|
11
|
+
import type * as Option from "effect/Option";
|
|
12
|
+
import type * as Scope from "effect/Scope";
|
|
13
|
+
import type * as Sink from "effect/Sink";
|
|
14
|
+
import type * as Stream from "effect/Stream";
|
|
15
|
+
import type * as Frida from "frida";
|
|
16
|
+
import type * as FridaDevice from "./FridaDevice.js";
|
|
17
|
+
import type * as FridaSession from "./FridaSession.js";
|
|
18
|
+
import type * as FridaSessionError from "./FridaSessionError.js";
|
|
19
|
+
|
|
20
|
+
import * as internal from "./internal/script.js";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
* @category Type ids
|
|
25
|
+
*/
|
|
26
|
+
export const FridaScriptTypeId: unique symbol = internal.FridaScriptTypeId;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
* @category Type ids
|
|
31
|
+
*/
|
|
32
|
+
export type FridaScriptTypeId = typeof FridaScriptTypeId;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @since 1.0.0
|
|
36
|
+
* @category Models
|
|
37
|
+
*/
|
|
38
|
+
export interface FridaScript {
|
|
39
|
+
readonly script: Frida.Script;
|
|
40
|
+
readonly destroyed: Deferred.Deferred<void, never>;
|
|
41
|
+
readonly [FridaScriptTypeId]: typeof FridaScriptTypeId;
|
|
42
|
+
readonly stream: Stream.Stream<
|
|
43
|
+
{ message: any; data: Option.Option<Buffer> },
|
|
44
|
+
FridaSessionError.FridaSessionError,
|
|
45
|
+
never
|
|
46
|
+
>;
|
|
47
|
+
readonly sink: Sink.Sink<
|
|
48
|
+
void,
|
|
49
|
+
{ message: any; data: Option.Option<Buffer> },
|
|
50
|
+
never,
|
|
51
|
+
FridaSessionError.FridaSessionError,
|
|
52
|
+
never
|
|
53
|
+
>;
|
|
54
|
+
readonly callExport: (
|
|
55
|
+
exportName: string
|
|
56
|
+
) => (...args: Array<any>) => Effect.Effect<unknown, FridaSessionError.FridaSessionError, never>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @since 1.0.0
|
|
61
|
+
* @category Tags
|
|
62
|
+
*/
|
|
63
|
+
export const FridaScript: Context.Tag<FridaScript, FridaScript> = internal.Tag;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
* @category Predicates
|
|
68
|
+
*/
|
|
69
|
+
export const isFridaScript: (u: unknown) => u is FridaScript = internal.isFridaScript;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @since 1.0.0
|
|
73
|
+
* @category Frida
|
|
74
|
+
*/
|
|
75
|
+
export const load: {
|
|
76
|
+
(
|
|
77
|
+
source: string | Buffer,
|
|
78
|
+
options?: (Frida.ScriptOptions & { readonly resume?: boolean | undefined }) | undefined
|
|
79
|
+
): Effect.Effect<
|
|
80
|
+
FridaScript,
|
|
81
|
+
FridaSessionError.FridaSessionError,
|
|
82
|
+
FridaSession.FridaSession | FridaDevice.FridaDevice | Scope.Scope
|
|
83
|
+
>;
|
|
84
|
+
(
|
|
85
|
+
options?: (Frida.ScriptOptions & { readonly resume?: boolean | undefined }) | undefined
|
|
86
|
+
): (
|
|
87
|
+
source: string | Buffer
|
|
88
|
+
) => Effect.Effect<
|
|
89
|
+
FridaScript,
|
|
90
|
+
FridaSessionError.FridaSessionError,
|
|
91
|
+
FridaSession.FridaSession | FridaDevice.FridaDevice | Scope.Scope
|
|
92
|
+
>;
|
|
93
|
+
} = internal.load;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @since 1.0.0
|
|
97
|
+
* @category Layers
|
|
98
|
+
*/
|
|
99
|
+
export const layer: {
|
|
100
|
+
(
|
|
101
|
+
source: string | Buffer,
|
|
102
|
+
options?: (Frida.ScriptOptions & { readonly resume?: boolean | undefined }) | undefined
|
|
103
|
+
): Layer.Layer<
|
|
104
|
+
FridaScript,
|
|
105
|
+
FridaSessionError.FridaSessionError,
|
|
106
|
+
FridaDevice.FridaDevice | FridaSession.FridaSession
|
|
107
|
+
>;
|
|
108
|
+
(
|
|
109
|
+
options?: (Frida.ScriptOptions & { readonly resume?: boolean | undefined }) | undefined
|
|
110
|
+
): (
|
|
111
|
+
source: string | Buffer
|
|
112
|
+
) => Layer.Layer<
|
|
113
|
+
FridaScript,
|
|
114
|
+
FridaSessionError.FridaSessionError,
|
|
115
|
+
FridaDevice.FridaDevice | FridaSession.FridaSession
|
|
116
|
+
>;
|
|
117
|
+
} = internal.layer;
|