frida 0.1.0 → 0.1.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +84 -0
  3. data/Gemfile +12 -0
  4. data/Gemfile.lock +25 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +64 -0
  7. data/Rakefile +20 -0
  8. data/exe/frida +3 -0
  9. data/ext/c_frida/Application.c +79 -0
  10. data/ext/c_frida/Bus.c +91 -0
  11. data/ext/c_frida/Child.c +134 -0
  12. data/ext/c_frida/Compiler.c +208 -0
  13. data/ext/c_frida/Crash.c +92 -0
  14. data/ext/c_frida/Device.c +955 -0
  15. data/ext/c_frida/DeviceManager.c +260 -0
  16. data/ext/c_frida/EndpointParameters.c +189 -0
  17. data/ext/c_frida/FileMonitor.c +67 -0
  18. data/ext/c_frida/GObject.c +138 -0
  19. data/ext/c_frida/IOStream.c +228 -0
  20. data/ext/c_frida/PortalMembership.c +43 -0
  21. data/ext/c_frida/PortalService.c +413 -0
  22. data/ext/c_frida/Process.c +67 -0
  23. data/ext/c_frida/Relay.c +121 -0
  24. data/ext/c_frida/Script.c +221 -0
  25. data/ext/c_frida/Session.c +626 -0
  26. data/ext/c_frida/Spawn.c +53 -0
  27. data/ext/c_frida/c_frida.c +68 -0
  28. data/ext/c_frida/extconf.rb +26 -25
  29. data/ext/c_frida/gutils.c +498 -0
  30. data/ext/c_frida/gvl_bridge.c +131 -0
  31. data/ext/c_frida/inc/Application.h +9 -0
  32. data/ext/c_frida/inc/Bus.h +15 -0
  33. data/ext/c_frida/inc/Child.h +9 -0
  34. data/ext/c_frida/inc/Compiler.h +21 -0
  35. data/ext/c_frida/inc/Crash.h +9 -0
  36. data/ext/c_frida/inc/Device.h +71 -0
  37. data/ext/c_frida/inc/DeviceManager.h +20 -0
  38. data/ext/c_frida/inc/EndpointParameters.h +15 -0
  39. data/ext/c_frida/inc/FileMonitor.h +9 -0
  40. data/ext/c_frida/inc/GObject.h +10 -0
  41. data/ext/c_frida/inc/IOStream.h +29 -0
  42. data/ext/c_frida/inc/PortalMembership.h +9 -0
  43. data/ext/c_frida/inc/PortalService.h +47 -0
  44. data/ext/c_frida/inc/Process.h +9 -0
  45. data/ext/c_frida/inc/Relay.h +9 -0
  46. data/ext/c_frida/inc/Script.h +21 -0
  47. data/ext/c_frida/inc/Session.h +40 -0
  48. data/ext/c_frida/inc/Spawn.h +9 -0
  49. data/ext/c_frida/inc/c_frida.h +129 -0
  50. data/ext/c_frida/inc/gutils.h +21 -0
  51. data/ext/c_frida/inc/gvl_bridge.h +42 -0
  52. data/frida.gemspec +39 -0
  53. data/lib/frida/version.rb +5 -0
  54. data/lib/frida.rb +8 -0
  55. metadata +55 -3
@@ -0,0 +1,208 @@
1
+ #include "Compiler.h"
2
+
3
+ VALUE Compiler_from_FridaCompiler(FridaCompiler *handle)
4
+ {
5
+ VALUE self;
6
+
7
+ if (!handle)
8
+ return (Qnil);
9
+ VALUE args[1] = {Qfalse};
10
+ self = rb_class_new_instance(1, args, cCompiler);
11
+ GET_GOBJECT_DATA();
12
+ d->handle = handle;
13
+ d->destroy = frida_unref;
14
+ return (self);
15
+ }
16
+
17
+ GVL_FREE_PROXY_FUNC(build_sync, build_sync_proxy_args *args)
18
+ {
19
+ GError *gerr = NULL;
20
+ char *bundle;
21
+
22
+ bundle = frida_compiler_build_sync(args->handle, args->entrypoint, args->options, NULL, &gerr);
23
+ RETURN_GVL_FREE_RESULT(bundle);
24
+ }
25
+
26
+ /*
27
+ call-seq:
28
+ #build(entrypoint, project_root:, source_maps:, compression:) -> String
29
+ */
30
+ static VALUE Compiler_build(int argc, VALUE *argv, VALUE self)
31
+ {
32
+ GET_GOBJECT_DATA();
33
+ REQUIRE_GOBJECT_HANDLE();
34
+
35
+ VALUE entrypoint, kws;
36
+ FridaBuildOptions *options;
37
+ FridaCompilerOptions *coptions;
38
+
39
+ rb_scan_args(argc, argv, "1:", &entrypoint, &kws);
40
+ if (!RB_TYPE_P(entrypoint, T_STRING)) {
41
+ raise_argerror("entrypoint must be a string.");
42
+ return (Qnil);
43
+ }
44
+ options = frida_build_options_new();
45
+ coptions = FRIDA_COMPILER_OPTIONS(options);
46
+ if (!NIL_P(kws)) {
47
+ VALUE project_root = rb_hash_aref(kws, ID2SYM(rb_intern("project_root")));
48
+ if (!NIL_P(project_root)) {
49
+ if (!RB_TYPE_P(project_root, T_STRING)) {
50
+ raise_argerror("project_root must be a string.");
51
+ return (Qnil);
52
+ }
53
+ frida_compiler_options_set_project_root(coptions, StringValueCStr(project_root));
54
+ }
55
+ VALUE source_maps = rb_hash_aref(kws, ID2SYM(rb_intern("source_maps")));
56
+ if (!NIL_P(source_maps)) {
57
+ if (!RB_TYPE_P(source_maps, T_STRING)) {
58
+ raise_argerror("source_maps must be a string.");
59
+ return (Qnil);
60
+ }
61
+ FridaSourceMaps gsource_maps;
62
+ if (!rbGObject_unmarshal_enum(StringValueCStr(source_maps), FRIDA_TYPE_SOURCE_MAPS, &gsource_maps)) {
63
+ raise_argerror("invalid source_maps.");
64
+ return (Qnil);
65
+ }
66
+ frida_compiler_options_set_source_maps(coptions, gsource_maps);
67
+ }
68
+ VALUE compression = rb_hash_aref(kws, ID2SYM(rb_intern("compression")));
69
+ if (!NIL_P(compression)) {
70
+ if (!RB_TYPE_P(compression, T_STRING)) {
71
+ raise_argerror("compression must be a string.");
72
+ return (Qnil);
73
+ }
74
+ FridaJsCompression gcompression;
75
+ if (!rbGObject_unmarshal_enum(StringValueCStr(compression), FRIDA_TYPE_JS_COMPRESSION, &gcompression)) {
76
+ raise_argerror("invalid compression.");
77
+ return (Qnil);
78
+ }
79
+ frida_compiler_options_set_compression(coptions, gcompression);
80
+ }
81
+ }
82
+ build_sync_proxy_args args = {
83
+ .handle = d->handle,
84
+ .entrypoint = StringValueCStr(entrypoint),
85
+ .options = options
86
+ };
87
+ CALL_GVL_FREE_WITH_RET(char *bundle, build_sync, &args);
88
+ g_object_unref(options);
89
+ VALUE rbundle = rb_str_new_cstr(bundle);
90
+ g_free(bundle);
91
+ return (rbundle);
92
+
93
+ gerror:
94
+ g_object_unref(options);
95
+ raise_rerror(NULL, _gerr);
96
+ return (Qnil);
97
+ }
98
+
99
+ GVL_FREE_PROXY_FUNC(watch_sync, watch_sync_proxy_args *args)
100
+ {
101
+ GError *gerr = NULL;
102
+
103
+ frida_compiler_watch_sync(args->handle, args->entrypoint, args->options, NULL, &gerr);
104
+ RETURN_GVL_FREE_RESULT(NULL);
105
+ }
106
+
107
+ /*
108
+ call-seq:
109
+ #watch(entrypoint, project_root:, source_maps:, compression:) -> nil
110
+ */
111
+ static VALUE Compiler_watch(int argc, VALUE *argv, VALUE self)
112
+ {
113
+ GET_GOBJECT_DATA();
114
+ REQUIRE_GOBJECT_HANDLE();
115
+
116
+ VALUE entrypoint, kws;
117
+ FridaWatchOptions *options;
118
+ FridaCompilerOptions *coptions;
119
+
120
+ rb_scan_args(argc, argv, "1:", &entrypoint, &kws);
121
+ if (!RB_TYPE_P(entrypoint, T_STRING)) {
122
+ raise_argerror("entrypoint must be a string.");
123
+ return (Qnil);
124
+ }
125
+ options = frida_watch_options_new();
126
+ coptions = FRIDA_COMPILER_OPTIONS(options);
127
+ if (!NIL_P(kws)) {
128
+ VALUE project_root = rb_hash_aref(kws, ID2SYM(rb_intern("project_root")));
129
+ if (!NIL_P(project_root)) {
130
+ if (!RB_TYPE_P(project_root, T_STRING)) {
131
+ raise_argerror("project_root must be a string.");
132
+ return (Qnil);
133
+ }
134
+ frida_compiler_options_set_project_root(coptions, StringValueCStr(project_root));
135
+ }
136
+ VALUE source_maps = rb_hash_aref(kws, ID2SYM(rb_intern("source_maps")));
137
+ if (!NIL_P(source_maps)) {
138
+ if (!RB_TYPE_P(source_maps, T_STRING)) {
139
+ raise_argerror("source_maps must be a string.");
140
+ return (Qnil);
141
+ }
142
+ FridaSourceMaps gsource_maps;
143
+ if (!rbGObject_unmarshal_enum(StringValueCStr(source_maps), FRIDA_TYPE_SOURCE_MAPS, &gsource_maps)) {
144
+ raise_argerror("invalid source_maps.");
145
+ return (Qnil);
146
+ }
147
+ frida_compiler_options_set_source_maps(coptions, gsource_maps);
148
+ }
149
+ VALUE compression = rb_hash_aref(kws, ID2SYM(rb_intern("compression")));
150
+ if (!NIL_P(compression)) {
151
+ if (!RB_TYPE_P(compression, T_STRING)) {
152
+ raise_argerror("compression must be a string.");
153
+ return (Qnil);
154
+ }
155
+ FridaJsCompression gcompression;
156
+ if (!rbGObject_unmarshal_enum(StringValueCStr(compression), FRIDA_TYPE_JS_COMPRESSION, &gcompression)) {
157
+ raise_argerror("invalid compression.");
158
+ return (Qnil);
159
+ }
160
+ frida_compiler_options_set_compression(coptions, gcompression);
161
+ }
162
+ }
163
+ watch_sync_proxy_args args = {
164
+ .handle = d->handle,
165
+ .entrypoint = StringValueCStr(entrypoint),
166
+ .options = options
167
+ };
168
+ CALL_GVL_FREE_WITH_RET(char *dummy, watch_sync, &args);
169
+ goto done;
170
+
171
+ gerror:
172
+ raise_rerror(NULL, _gerr);
173
+ done:
174
+ g_object_unref(options);
175
+ return (Qnil);
176
+ }
177
+
178
+ /*
179
+ call-seq:
180
+ #new(dvmgr) -> Compiler
181
+ */
182
+ static VALUE Compiler_initialize(VALUE self, VALUE dvmgr)
183
+ {
184
+ GET_GOBJECT_DATA();
185
+
186
+ if (dvmgr == Qfalse)
187
+ return (self);
188
+ if (!rb_obj_is_instance_of(dvmgr, cDeviceManager)) {
189
+ raise_argerror("argument should be a DeviceManager instance.");
190
+ return (Qnil);
191
+ }
192
+ VALUE dvmgr_self;
193
+ dvmgr_self = dvmgr;
194
+ GET_DATA_EX(GObject, dvmgr_self, dvmgr_d);
195
+ d->handle = frida_compiler_new(dvmgr_d->handle);
196
+ d->destroy = frida_unref;
197
+ return (self);
198
+ }
199
+
200
+ void define_Compiler()
201
+ {
202
+ cCompiler = rb_define_class_under(mCFrida, "Compiler", cGObject);
203
+
204
+ rb_define_method(cCompiler, "initialize", Compiler_initialize, 1);
205
+
206
+ rb_define_method(cCompiler, "build", Compiler_build, -1);
207
+ rb_define_method(cCompiler, "watch", Compiler_watch, -1);
208
+ }
@@ -0,0 +1,92 @@
1
+ #include "Crash.h"
2
+
3
+ VALUE Crash_from_FridaCrash(FridaCrash *handle)
4
+ {
5
+ VALUE self;
6
+
7
+ if (!handle)
8
+ return (Qnil);
9
+ self = rb_class_new_instance(0, NULL, cCrash);
10
+ GET_GOBJECT_DATA();
11
+ d->handle = handle;
12
+ d->destroy = g_object_unref;
13
+ rb_ivar_set(self, rb_intern("pid"), LL2NUM(frida_crash_get_pid(handle)));
14
+ rb_ivar_set(self, rb_intern("process_name"), rbGObject_marshal_string(frida_crash_get_process_name(handle)));
15
+ rb_ivar_set(self, rb_intern("summary"), rbGObject_marshal_string(frida_crash_get_summary(handle)));
16
+ rb_ivar_set(self, rb_intern("report"), rbGObject_marshal_string(frida_crash_get_report(handle)));
17
+ rb_ivar_set(self, rb_intern("parameters"), rbGObject_marshal_dict(frida_crash_get_parameters(handle)));
18
+ return (self);
19
+ }
20
+
21
+ VALUE Crash_inspect(VALUE self)
22
+ {
23
+ VALUE s, report;
24
+
25
+ report = rb_funcall(self, rb_intern("report"), 0, NULL);
26
+ s = rb_sprintf("#<Crash: pid=%+"PRIsVALUE", process_name=%+"PRIsVALUE", summary=%+"PRIsVALUE", report=<%+"PRIsVALUE" bytes>, parameters=%+"PRIsVALUE">", \
27
+ rb_funcall(self, rb_intern("pid"), 0, NULL),
28
+ rb_funcall(self, rb_intern("process_name"), 0, NULL),
29
+ rb_funcall(self, rb_intern("summary"), 0, NULL),
30
+ (report == Qnil) ? UINT2NUM(0) : rb_funcall(report, rb_intern("length"), 0, NULL),
31
+ rb_funcall(self, rb_intern("parameters"), 0, NULL)
32
+ );
33
+ return (s);
34
+ }
35
+
36
+ /*
37
+ call-seq:
38
+ #pid() -> Fixnum
39
+ */
40
+ static VALUE Crash_pid(VALUE self)
41
+ {
42
+ return (rb_ivar_get(self, rb_intern("pid")));
43
+ }
44
+
45
+ /*
46
+ call-seq:
47
+ #process_name() -> String
48
+ */
49
+ static VALUE Crash_process_name(VALUE self)
50
+ {
51
+ return (rb_ivar_get(self, rb_intern("process_name")));
52
+ }
53
+
54
+ /*
55
+ call-seq:
56
+ #summary() -> String
57
+ */
58
+ static VALUE Crash_summary(VALUE self)
59
+ {
60
+ return (rb_ivar_get(self, rb_intern("summary")));
61
+ }
62
+
63
+ /*
64
+ call-seq:
65
+ #report() -> String
66
+ */
67
+ static VALUE Crash_report(VALUE self)
68
+ {
69
+ return (rb_ivar_get(self, rb_intern("report")));
70
+ }
71
+
72
+ /*
73
+ call-seq:
74
+ #parameters() -> Hash
75
+ */
76
+ static VALUE Crash_parameters(VALUE self)
77
+ {
78
+ return (rb_ivar_get(self, rb_intern("parameters")));
79
+ }
80
+
81
+ void define_Crash()
82
+ {
83
+ cCrash = rb_define_class_under(mCFrida, "Crash", cGObject);
84
+
85
+ rb_define_method(cCrash, "inspect", Crash_inspect, 0);
86
+ rb_define_alias(cCrash, "to_s", "inspect");
87
+ rb_define_method(cCrash, "pid", Crash_pid, 0);
88
+ rb_define_method(cCrash, "process_name", Crash_process_name, 0);
89
+ rb_define_method(cCrash, "summary", Crash_summary, 0);
90
+ rb_define_method(cCrash, "report", Crash_report, 0);
91
+ rb_define_method(cCrash, "parameters", Crash_parameters, 0);
92
+ }