@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.
Files changed (72) hide show
  1. package/FridaDevice/package.json +6 -0
  2. package/FridaDeviceAcquisitionError/package.json +6 -0
  3. package/FridaScript/package.json +6 -0
  4. package/FridaSession/package.json +6 -0
  5. package/FridaSessionError/package.json +6 -0
  6. package/LICENSE +674 -0
  7. package/README.md +30 -0
  8. package/dist/cjs/FridaDevice.js +61 -0
  9. package/dist/cjs/FridaDevice.js.map +1 -0
  10. package/dist/cjs/FridaDeviceAcquisitionError.js +34 -0
  11. package/dist/cjs/FridaDeviceAcquisitionError.js.map +1 -0
  12. package/dist/cjs/FridaScript.js +41 -0
  13. package/dist/cjs/FridaScript.js.map +1 -0
  14. package/dist/cjs/FridaSession.js +46 -0
  15. package/dist/cjs/FridaSession.js.map +1 -0
  16. package/dist/cjs/FridaSessionError.js +38 -0
  17. package/dist/cjs/FridaSessionError.js.map +1 -0
  18. package/dist/cjs/index.js +19 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/cjs/internal/device.js +69 -0
  21. package/dist/cjs/internal/device.js.map +1 -0
  22. package/dist/cjs/internal/script.js +164 -0
  23. package/dist/cjs/internal/script.js.map +1 -0
  24. package/dist/cjs/internal/session.js +56 -0
  25. package/dist/cjs/internal/session.js.map +1 -0
  26. package/dist/dts/FridaDevice.d.ts +69 -0
  27. package/dist/dts/FridaDevice.d.ts.map +1 -0
  28. package/dist/dts/FridaDeviceAcquisitionError.d.ts +35 -0
  29. package/dist/dts/FridaDeviceAcquisitionError.d.ts.map +1 -0
  30. package/dist/dts/FridaScript.d.ts +80 -0
  31. package/dist/dts/FridaScript.d.ts.map +1 -0
  32. package/dist/dts/FridaSession.d.ts +56 -0
  33. package/dist/dts/FridaSession.d.ts.map +1 -0
  34. package/dist/dts/FridaSessionError.d.ts +35 -0
  35. package/dist/dts/FridaSessionError.d.ts.map +1 -0
  36. package/dist/dts/index.d.ts +31 -0
  37. package/dist/dts/index.d.ts.map +1 -0
  38. package/dist/dts/internal/device.d.ts +2 -0
  39. package/dist/dts/internal/device.d.ts.map +1 -0
  40. package/dist/dts/internal/script.d.ts +2 -0
  41. package/dist/dts/internal/script.d.ts.map +1 -0
  42. package/dist/dts/internal/session.d.ts +2 -0
  43. package/dist/dts/internal/session.d.ts.map +1 -0
  44. package/dist/esm/FridaDevice.js +52 -0
  45. package/dist/esm/FridaDevice.js.map +1 -0
  46. package/dist/esm/FridaDeviceAcquisitionError.js +23 -0
  47. package/dist/esm/FridaDeviceAcquisitionError.js.map +1 -0
  48. package/dist/esm/FridaScript.js +32 -0
  49. package/dist/esm/FridaScript.js.map +1 -0
  50. package/dist/esm/FridaSession.js +37 -0
  51. package/dist/esm/FridaSession.js.map +1 -0
  52. package/dist/esm/FridaSessionError.js +27 -0
  53. package/dist/esm/FridaSessionError.js.map +1 -0
  54. package/dist/esm/index.js +31 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/internal/device.js +55 -0
  57. package/dist/esm/internal/device.js.map +1 -0
  58. package/dist/esm/internal/script.js +155 -0
  59. package/dist/esm/internal/script.js.map +1 -0
  60. package/dist/esm/internal/session.js +44 -0
  61. package/dist/esm/internal/session.js.map +1 -0
  62. package/dist/esm/package.json +4 -0
  63. package/package.json +76 -0
  64. package/src/FridaDevice.ts +103 -0
  65. package/src/FridaDeviceAcquisitionError.ts +42 -0
  66. package/src/FridaScript.ts +117 -0
  67. package/src/FridaSession.ts +76 -0
  68. package/src/FridaSessionError.ts +42 -0
  69. package/src/index.ts +34 -0
  70. package/src/internal/device.ts +93 -0
  71. package/src/internal/script.ts +208 -0
  72. 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":[]}
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "sideEffects": []
4
+ }
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;