frida 16.7.13 → 16.7.15

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 (172) hide show
  1. package/README.md +1 -10
  2. package/build/BSDmakefile +6 -0
  3. package/build/Makefile +10 -0
  4. package/build/src/frida.d.ts +364 -0
  5. package/build/src/frida.js +962 -0
  6. package/build/src/frida_binding.d.ts +938 -0
  7. package/meson.build +34 -67
  8. package/package.json +30 -20
  9. package/scripts/fetch-abi-bits.py +15 -65
  10. package/scripts/install.js +5 -4
  11. package/src/addon.def +3 -0
  12. package/src/addon.symbols +2 -1
  13. package/src/addon.version +4 -0
  14. package/src/frida_bindgen/__init__.py +0 -0
  15. package/src/frida_bindgen/__main__.py +4 -0
  16. package/src/frida_bindgen/__pycache__/__init__.cpython-312.pyc +0 -0
  17. package/src/frida_bindgen/__pycache__/__main__.cpython-312.pyc +0 -0
  18. package/src/frida_bindgen/__pycache__/cli.cpython-312.pyc +0 -0
  19. package/src/frida_bindgen/__pycache__/codegen.cpython-312.pyc +0 -0
  20. package/src/frida_bindgen/__pycache__/customization.cpython-312.pyc +0 -0
  21. package/src/frida_bindgen/__pycache__/loader.cpython-312.pyc +0 -0
  22. package/src/frida_bindgen/__pycache__/model.cpython-312.pyc +0 -0
  23. package/src/frida_bindgen/assets/codegen_helpers.c +1970 -0
  24. package/src/frida_bindgen/assets/codegen_helpers.ts +100 -0
  25. package/src/frida_bindgen/assets/codegen_prototypes.h +78 -0
  26. package/src/frida_bindgen/assets/codegen_types.h +57 -0
  27. package/src/frida_bindgen/assets/customization_facade.exports +13 -0
  28. package/src/frida_bindgen/assets/customization_facade.ts +157 -0
  29. package/src/frida_bindgen/assets/customization_helpers.imports +2 -0
  30. package/src/frida_bindgen/assets/customization_helpers.ts +396 -0
  31. package/src/frida_bindgen/cli.py +96 -0
  32. package/src/frida_bindgen/codegen.py +2233 -0
  33. package/src/frida_bindgen/customization.py +924 -0
  34. package/src/frida_bindgen/loader.py +60 -0
  35. package/src/frida_bindgen/model.py +1357 -0
  36. package/src/meson.build +92 -27
  37. package/{lib/build.py → src/tsc.py} +12 -12
  38. package/src/win_delay_load_hook.c +56 -0
  39. package/subprojects/frida-core.wrap +1 -1
  40. package/test/data/index.ts +2 -2
  41. package/test/device.ts +1 -2
  42. package/test/device_manager.ts +1 -2
  43. package/test/labrat.ts +2 -2
  44. package/test/script.ts +12 -12
  45. package/test/session.ts +3 -3
  46. package/tsconfig.json +6 -11
  47. package/dist/application.d.ts +0 -81
  48. package/dist/application.js +0 -2
  49. package/dist/authentication.d.ts +0 -3
  50. package/dist/authentication.js +0 -2
  51. package/dist/bus.d.ts +0 -16
  52. package/dist/bus.js +0 -23
  53. package/dist/cancellable.d.ts +0 -15
  54. package/dist/cancellable.js +0 -41
  55. package/dist/child.d.ts +0 -16
  56. package/dist/child.js +0 -9
  57. package/dist/crash.d.ts +0 -10
  58. package/dist/crash.js +0 -2
  59. package/dist/device.d.ts +0 -156
  60. package/dist/device.js +0 -188
  61. package/dist/device_manager.d.ts +0 -25
  62. package/dist/device_manager.js +0 -42
  63. package/dist/endpoint_parameters.d.ts +0 -26
  64. package/dist/endpoint_parameters.js +0 -24
  65. package/dist/icon.d.ts +0 -14
  66. package/dist/icon.js +0 -2
  67. package/dist/index.d.ts +0 -161
  68. package/dist/index.js +0 -170
  69. package/dist/iostream.d.ts +0 -13
  70. package/dist/iostream.js +0 -73
  71. package/dist/native.d.ts +0 -1
  72. package/dist/native.js +0 -11
  73. package/dist/portal_membership.d.ts +0 -6
  74. package/dist/portal_membership.js +0 -12
  75. package/dist/portal_service.d.ts +0 -48
  76. package/dist/portal_service.js +0 -52
  77. package/dist/process.d.ts +0 -47
  78. package/dist/process.js +0 -2
  79. package/dist/relay.d.ts +0 -22
  80. package/dist/relay.js +0 -32
  81. package/dist/script.d.ts +0 -70
  82. package/dist/script.js +0 -266
  83. package/dist/service.d.ts +0 -16
  84. package/dist/service.js +0 -26
  85. package/dist/session.d.ts +0 -45
  86. package/dist/session.js +0 -73
  87. package/dist/signals.d.ts +0 -20
  88. package/dist/signals.js +0 -40
  89. package/dist/socket_address.d.ts +0 -25
  90. package/dist/socket_address.js +0 -2
  91. package/dist/spawn.d.ts +0 -4
  92. package/dist/spawn.js +0 -2
  93. package/dist/system_parameters.d.ts +0 -84
  94. package/dist/system_parameters.js +0 -2
  95. package/lib/application.ts +0 -98
  96. package/lib/authentication.ts +0 -3
  97. package/lib/bus.ts +0 -30
  98. package/lib/cancellable.ts +0 -48
  99. package/lib/child.ts +0 -15
  100. package/lib/crash.ts +0 -11
  101. package/lib/device.ts +0 -331
  102. package/lib/device_manager.ts +0 -69
  103. package/lib/endpoint_parameters.ts +0 -56
  104. package/lib/icon.ts +0 -15
  105. package/lib/index.ts +0 -316
  106. package/lib/iostream.ts +0 -78
  107. package/lib/meson.build +0 -53
  108. package/lib/native.ts +0 -9
  109. package/lib/portal_membership.ts +0 -10
  110. package/lib/portal_service.ts +0 -105
  111. package/lib/process.ts +0 -57
  112. package/lib/relay.ts +0 -44
  113. package/lib/script.ts +0 -361
  114. package/lib/service.ts +0 -34
  115. package/lib/session.ts +0 -113
  116. package/lib/signals.ts +0 -45
  117. package/lib/socket_address.ts +0 -35
  118. package/lib/spawn.ts +0 -4
  119. package/lib/system_parameters.ts +0 -103
  120. package/meson.options +0 -11
  121. package/src/addon.cc +0 -78
  122. package/src/application.cc +0 -148
  123. package/src/application.h +0 -31
  124. package/src/authentication.cc +0 -174
  125. package/src/authentication.h +0 -24
  126. package/src/bus.cc +0 -167
  127. package/src/bus.h +0 -33
  128. package/src/cancellable.cc +0 -117
  129. package/src/cancellable.h +0 -31
  130. package/src/child.cc +0 -150
  131. package/src/child.h +0 -32
  132. package/src/crash.cc +0 -122
  133. package/src/crash.h +0 -30
  134. package/src/device.cc +0 -1350
  135. package/src/device.h +0 -56
  136. package/src/device_manager.cc +0 -362
  137. package/src/device_manager.h +0 -35
  138. package/src/endpoint_parameters.cc +0 -171
  139. package/src/endpoint_parameters.h +0 -28
  140. package/src/glib_context.cc +0 -62
  141. package/src/glib_context.h +0 -29
  142. package/src/glib_object.cc +0 -25
  143. package/src/glib_object.h +0 -37
  144. package/src/iostream.cc +0 -243
  145. package/src/iostream.h +0 -30
  146. package/src/operation.h +0 -94
  147. package/src/portal_membership.cc +0 -100
  148. package/src/portal_membership.h +0 -26
  149. package/src/portal_service.cc +0 -401
  150. package/src/portal_service.h +0 -40
  151. package/src/process.cc +0 -135
  152. package/src/process.h +0 -30
  153. package/src/relay.cc +0 -139
  154. package/src/relay.h +0 -31
  155. package/src/runtime.cc +0 -568
  156. package/src/runtime.h +0 -69
  157. package/src/script.cc +0 -301
  158. package/src/script.h +0 -36
  159. package/src/service.cc +0 -224
  160. package/src/service.h +0 -36
  161. package/src/session.cc +0 -860
  162. package/src/session.h +0 -42
  163. package/src/signals.cc +0 -334
  164. package/src/signals.h +0 -47
  165. package/src/spawn.cc +0 -95
  166. package/src/spawn.h +0 -27
  167. package/src/usage_monitor.h +0 -117
  168. package/src/uv_context.cc +0 -118
  169. package/src/uv_context.h +0 -40
  170. package/src/win_delay_load_hook.cc +0 -63
  171. package/subprojects/nan.wrap +0 -9
  172. package/subprojects/packagefiles/nan.patch +0 -13
package/src/runtime.cc DELETED
@@ -1,568 +0,0 @@
1
- #include "runtime.h"
2
-
3
- #include <cstring>
4
- #include <nan.h>
5
- #ifdef G_OS_UNIX
6
- # include <gio/gunixsocketaddress.h>
7
- #endif
8
-
9
- using std::strchr;
10
- using v8::Array;
11
- using v8::Boolean;
12
- using v8::Date;
13
- using v8::Function;
14
- using v8::Isolate;
15
- using v8::Local;
16
- using v8::Number;
17
- using v8::Object;
18
- using v8::String;
19
- using v8::Symbol;
20
- using v8::Value;
21
-
22
- namespace frida {
23
-
24
- Runtime::Runtime(UVContext* uv_context, GLibContext* glib_context)
25
- : uv_context_(uv_context),
26
- glib_context_(glib_context),
27
- data_(g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL)) {
28
- auto isolate = Isolate::GetCurrent();
29
- auto global = isolate->GetCurrentContext()->Global();
30
- auto json_module = Local<Object>::Cast(
31
- Nan::Get(global, Nan::New("JSON").ToLocalChecked()).ToLocalChecked());
32
- auto json_stringify = Local<Function>::Cast(
33
- Nan::Get(json_module,
34
- Nan::New("stringify").ToLocalChecked()).ToLocalChecked());
35
- auto json_parse = Local<Function>::Cast(
36
- Nan::Get(json_module,
37
- Nan::New("parse").ToLocalChecked()).ToLocalChecked());
38
- json_module_.Reset(isolate, json_module);
39
- json_stringify_.Reset(isolate, json_stringify);
40
- json_parse_.Reset(isolate, json_parse);
41
- }
42
-
43
- Runtime::~Runtime() {
44
- json_parse_.Reset();
45
- json_stringify_.Reset();
46
- json_module_.Reset();
47
-
48
- g_hash_table_unref(data_);
49
-
50
- delete glib_context_;
51
- delete uv_context_;
52
- }
53
-
54
- UVContext* Runtime::GetUVContext() const {
55
- return uv_context_;
56
- }
57
-
58
- GLibContext* Runtime::GetGLibContext() const {
59
- return glib_context_;
60
- }
61
-
62
- void* Runtime::GetDataPointer(const char* id) {
63
- return g_hash_table_lookup(data_, id);
64
- }
65
-
66
- void Runtime::SetDataPointer(const char* id, void* value) {
67
- g_hash_table_insert(data_, const_cast<char*>(id), value);
68
- }
69
-
70
- Local<String> Runtime::ValueToJson(Local<Value> value) {
71
- auto context = Isolate::GetCurrent()->GetCurrentContext();
72
- auto module = Nan::New<Object>(json_module_);
73
- auto stringify = Nan::New<Function>(json_stringify_);
74
- Local<Value> argv[] = { value };
75
- return Local<String>::Cast(
76
- stringify->Call(context, module, 1, argv).ToLocalChecked());
77
- }
78
-
79
- Local<Value> Runtime::ValueFromJson(Local<String> json) {
80
- auto context = Isolate::GetCurrent()->GetCurrentContext();
81
- auto module = Nan::New<Object>(json_module_);
82
- auto parse = Nan::New<Function>(json_parse_);
83
- Local<Value> argv[] = { json };
84
- return parse->Call(context, module, 1, argv).ToLocalChecked();
85
- }
86
-
87
- Local<Value> Runtime::ValueFromDatetime(const char* iso8601_text) {
88
- GDateTime* dt = g_date_time_new_from_iso8601(iso8601_text, NULL);
89
- if (dt == NULL)
90
- return Nan::Null();
91
-
92
- double unix_msec = static_cast<double>(g_date_time_to_unix(dt) * 1000) +
93
- (static_cast<double>(g_date_time_get_microsecond(dt)) / 1000.0);
94
- Local<Date> result = Nan::New<Date>(unix_msec).ToLocalChecked();
95
-
96
- g_date_time_unref(dt);
97
-
98
- return result;
99
- }
100
-
101
- bool Runtime::ValueToStrv(Local<Value> value, gchar*** strv, gint* length) {
102
- if (!value->IsArray()) {
103
- Nan::ThrowTypeError("Bad argument, expected an array of strings");
104
- return false;
105
- }
106
- auto array = Local<Array>::Cast(value);
107
-
108
- uint32_t n = array->Length();
109
- gchar** elements = g_new0(gchar*, n + 1);
110
-
111
- for (uint32_t i = 0; i != n; i++) {
112
- auto element_value = Nan::Get(array, i).ToLocalChecked();
113
- if (!element_value->IsString()) {
114
- g_strfreev(elements);
115
- Nan::ThrowTypeError("Bad argument, expected an array of strings only");
116
- return false;
117
- }
118
-
119
- Nan::Utf8String element(element_value);
120
- elements[i] = g_strdup(*element);
121
- }
122
-
123
- *strv = elements;
124
- *length = n;
125
-
126
- return true;
127
- }
128
-
129
- Local<Value> Runtime::ValueFromStrv(gchar* const* strv, gint length) {
130
- if (strv == NULL)
131
- return Nan::Null();
132
-
133
- auto result = Nan::New<Array>(length);
134
- for (gint i = 0; i != length; i++)
135
- Nan::Set(result, i, Nan::New(strv[i]).ToLocalChecked());
136
- return result;
137
- }
138
-
139
- bool Runtime::ValueToEnvp(Local<Value> value, gchar*** envp, gint* length) {
140
- auto isolate = Isolate::GetCurrent();
141
- auto context = isolate->GetCurrentContext();
142
-
143
- if (!value->IsObject()) {
144
- Nan::ThrowTypeError("Bad argument, expected an object");
145
- return false;
146
- }
147
- auto object = Local<Object>::Cast(value);
148
-
149
- Local<Array> names(object->GetOwnPropertyNames(context).ToLocalChecked());
150
- uint32_t n = names->Length();
151
-
152
- gchar** elements = g_new0(gchar*, n + 1);
153
-
154
- for (uint32_t i = 0; i != n; i++) {
155
- auto name = Nan::Get(names, i).ToLocalChecked();
156
- auto value = Nan::Get(object, name).ToLocalChecked();
157
-
158
- Nan::Utf8String name_str(name);
159
- Nan::Utf8String value_str(value);
160
- elements[i] = g_strconcat(*name_str, "=", *value_str, NULL);
161
- }
162
-
163
- *envp = elements;
164
- *length = n;
165
-
166
- return true;
167
- }
168
-
169
- Local<Value> Runtime::ValueFromEnvp(gchar* const* envp, gint length) {
170
- if (envp == NULL)
171
- return Nan::Null();
172
-
173
- auto result = Nan::New<Object>();
174
- for (gint i = 0; i != length; i++) {
175
- auto tokens = g_strsplit(envp[i], "=", 2);
176
- if (g_strv_length(tokens) == 2) {
177
- Nan::Set(result, Nan::New(tokens[0]).ToLocalChecked(),
178
- Nan::New(tokens[1]).ToLocalChecked());
179
- }
180
- g_strfreev(tokens);
181
- }
182
- return result;
183
- }
184
-
185
- bool Runtime::ValueToEnum(Local<Value> value, GType type, gpointer result) {
186
- if (!value->IsString()) {
187
- Nan::ThrowTypeError("Bad argument, expected a string");
188
- return false;
189
- }
190
- Nan::Utf8String str(value);
191
-
192
- bool success = false;
193
-
194
- auto enum_class = static_cast<GEnumClass*>(g_type_class_ref(type));
195
-
196
- auto enum_value = g_enum_get_value_by_nick(enum_class, *str);
197
- if (enum_value != NULL) {
198
- *((gint*) result) = enum_value->value;
199
-
200
- success = true;
201
- } else {
202
- auto message = g_string_sized_new(128);
203
-
204
- g_string_append_printf(message,
205
- "Enum type %s does not have a value named '%s', it only has: ",
206
- ClassNameFromC(g_type_name(type)), *str);
207
-
208
- for (guint i = 0; i != enum_class->n_values; i++) {
209
- if (i != 0)
210
- g_string_append(message, ", ");
211
- g_string_append_c(message, '\'');
212
- g_string_append(message, enum_class->values[i].value_nick);
213
- g_string_append_c(message, '\'');
214
- }
215
-
216
- Nan::ThrowTypeError(message->str);
217
-
218
- g_string_free(message, TRUE);
219
- }
220
-
221
- g_type_class_unref(enum_class);
222
-
223
- return success;
224
- }
225
-
226
- Local<String> Runtime::ValueFromEnum(gint value, GType type) {
227
- auto enum_class = static_cast<GEnumClass*>(g_type_class_ref(type));
228
- auto result = Nan::New(g_enum_get_value(enum_class, value)->value_nick)
229
- .ToLocalChecked();
230
- g_type_class_unref(enum_class);
231
- return result;
232
- }
233
-
234
- Local<Value> Runtime::ValueFromParametersDict(GHashTable* dict) {
235
- auto result = Nan::New<Object>();
236
-
237
- GHashTableIter iter;
238
- gpointer raw_key, raw_value;
239
-
240
- g_hash_table_iter_init(&iter, dict);
241
-
242
- while (g_hash_table_iter_next(&iter, &raw_key, &raw_value)) {
243
- char* canonicalized_key = ParameterNameFromC(static_cast<char*>(raw_key));
244
-
245
- Local<String> key = Nan::New(canonicalized_key).ToLocalChecked();
246
- Local<Value> value = ValueFromVariant(static_cast<GVariant*>(raw_value));
247
- Nan::Set(result, key, value);
248
-
249
- g_free(canonicalized_key);
250
- }
251
-
252
- return result;
253
- }
254
-
255
- GVariant* Runtime::ValueToVariant(Local<Value> value) {
256
- if (value->IsString()) {
257
- Nan::Utf8String str(value);
258
- return g_variant_new_string(*str);
259
- }
260
-
261
- if (value->IsNumber()) {
262
- return g_variant_new_int64(
263
- static_cast<gint64>(Local<Number>::Cast(value)->Value()));
264
- }
265
-
266
- if (value->IsBoolean()) {
267
- return g_variant_new_boolean(Local<Boolean>::Cast(value)->Value());
268
- }
269
-
270
- if (node::Buffer::HasInstance(value)) {
271
- auto size = node::Buffer::Length(value);
272
- auto copy = g_memdup2(node::Buffer::Data(value), size);
273
- return g_variant_new_from_data(G_VARIANT_TYPE_BYTESTRING, copy, size, TRUE,
274
- g_free, copy);
275
- }
276
-
277
- if (value->IsArray()) {
278
- auto array = Local<Array>::Cast(value);
279
- uint32_t n = array->Length();
280
- if (n == 2) {
281
- auto first = Nan::Get(array, 0).ToLocalChecked();
282
- if (first->IsSymbol()) {
283
- auto sym = first.As<Symbol>();
284
- auto desc = sym->Description(
285
- #if V8_MAJOR_VERSION > 9 || (V8_MAJOR_VERSION == 9 && V8_MINOR_VERSION >= 5)
286
- Isolate::GetCurrent()
287
- #endif
288
- );
289
- Nan::Utf8String type(desc);
290
-
291
- auto val = ValueToVariant(Nan::Get(array, 1).ToLocalChecked());
292
- if (val == NULL) {
293
- return NULL;
294
- }
295
-
296
- GVariant* t[2] = { g_variant_new_string(*type), val };
297
- return g_variant_new_tuple(t, G_N_ELEMENTS(t));
298
- }
299
- }
300
-
301
- GVariantBuilder builder;
302
- g_variant_builder_init(&builder, G_VARIANT_TYPE ("av"));
303
-
304
- for (uint32_t i = 0; i != n; i++) {
305
- auto v = ValueToVariant(Nan::Get(array, i).ToLocalChecked());
306
- if (v == NULL) {
307
- g_variant_builder_clear(&builder);
308
- return NULL;
309
- }
310
- g_variant_builder_add(&builder, "v", v);
311
- }
312
-
313
- return g_variant_builder_end(&builder);
314
- }
315
-
316
- if (value->IsObject()) {
317
- GVariantBuilder builder;
318
- g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
319
-
320
- auto isolate = Isolate::GetCurrent();
321
- auto context = isolate->GetCurrentContext();
322
-
323
- auto object = Local<Object>::Cast(value);
324
-
325
- Local<Array> names(object->GetOwnPropertyNames(context).ToLocalChecked());
326
- uint32_t n = names->Length();
327
-
328
- for (uint32_t i = 0; i != n; i++) {
329
- auto key = Nan::Get(names, i).ToLocalChecked();
330
- auto val = Nan::Get(object, key).ToLocalChecked();
331
- if (val->IsUndefined()) {
332
- continue;
333
- }
334
-
335
- Nan::Utf8String k(key);
336
-
337
- auto v = ValueToVariant(val);
338
- if (v == NULL) {
339
- g_variant_builder_clear(&builder);
340
- return NULL;
341
- }
342
-
343
- g_variant_builder_add(&builder, "{sv}", *k, v);
344
- }
345
-
346
- return g_variant_builder_end(&builder);
347
- }
348
-
349
- Nan::ThrowTypeError("Bad argument, expected value serializable to GVariant");
350
- return NULL;
351
- }
352
-
353
- Local<Value> Runtime::ValueFromVariant(GVariant* v) {
354
- switch (g_variant_classify(v)) {
355
- case G_VARIANT_CLASS_STRING:
356
- return Nan::New<String>(g_variant_get_string(v, NULL)).ToLocalChecked();
357
- case G_VARIANT_CLASS_INT64:
358
- return Nan::New<Number>(static_cast<double>(g_variant_get_int64(v)));
359
- case G_VARIANT_CLASS_UINT64:
360
- return Nan::New<Number>(static_cast<double>(g_variant_get_uint64(v)));
361
- case G_VARIANT_CLASS_DOUBLE:
362
- return Nan::New<Number>(static_cast<double>(g_variant_get_double(v)));
363
- case G_VARIANT_CLASS_BOOLEAN:
364
- return Nan::New<Boolean>(static_cast<bool>(g_variant_get_boolean(v)));
365
- case G_VARIANT_CLASS_ARRAY:
366
- if (g_variant_is_of_type(v, G_VARIANT_TYPE("ay"))) {
367
- return ValueFromVariantByteArray(v);
368
- }
369
-
370
- if (g_variant_is_of_type(v, G_VARIANT_TYPE_VARDICT)) {
371
- return ValueFromVariantDict(v);
372
- }
373
-
374
- if (g_variant_is_of_type(v, G_VARIANT_TYPE_ARRAY)) {
375
- return ValueFromVariantArray(v);
376
- }
377
-
378
- break;
379
- case G_VARIANT_CLASS_TUPLE:
380
- return Nan::Undefined();
381
- default:
382
- break;
383
- }
384
-
385
- return Nan::Null();
386
- }
387
-
388
- Local<Value> Runtime::ValueFromVariantByteArray(GVariant* v) {
389
- gsize size;
390
- gconstpointer data = g_variant_get_fixed_array(v, &size, sizeof(guint8));
391
-
392
- return Nan::CopyBuffer(static_cast<const char*>(data), size).ToLocalChecked();
393
- }
394
-
395
- Local<Value> Runtime::ValueFromVariantDict(GVariant* v) {
396
- auto dict = Nan::New<Object>();
397
-
398
- GVariantIter iter;
399
- gchar* raw_key;
400
- GVariant* raw_value;
401
-
402
- g_variant_iter_init(&iter, v);
403
-
404
- while (g_variant_iter_next(&iter, "{sv}", &raw_key, &raw_value)) {
405
- char* canonicalized_key = ParameterNameFromC(raw_key);
406
-
407
- Local<String> key = Nan::New(canonicalized_key).ToLocalChecked();
408
- Local<Value> value = ValueFromVariant(raw_value);
409
- Nan::Set(dict, key, value);
410
-
411
- g_free(canonicalized_key);
412
- g_variant_unref(raw_value);
413
- g_free(raw_key);
414
- }
415
-
416
- return dict;
417
- }
418
-
419
- Local<Value> Runtime::ValueFromVariantArray(GVariant* v) {
420
- GVariantIter iter;
421
- g_variant_iter_init(&iter, v);
422
-
423
- auto array = Nan::New<Array>(g_variant_iter_n_children(&iter));
424
-
425
- GVariant* child;
426
- for (int i = 0; (child = g_variant_iter_next_value(&iter)) != NULL; i++) {
427
- if (g_variant_is_of_type(child, G_VARIANT_TYPE_VARIANT)) {
428
- GVariant* inner = g_variant_get_variant(child);
429
- g_variant_unref(child);
430
- child = inner;
431
- }
432
- Nan::Set(array, i, ValueFromVariant(child));
433
- g_variant_unref(child);
434
- }
435
-
436
- return array;
437
- }
438
-
439
- Local<Object> Runtime::ValueFromSocketAddress(GSocketAddress* address) {
440
- auto result = Nan::New<Object>();
441
-
442
- if (G_IS_INET_SOCKET_ADDRESS(address)) {
443
- GSocketFamily family = g_socket_address_get_family(address);
444
- GInetSocketAddress* sa = G_INET_SOCKET_ADDRESS(address);
445
-
446
- Nan::Set(result,
447
- Nan::New("family").ToLocalChecked(),
448
- Nan::New((family == G_SOCKET_FAMILY_IPV6) ? "ipv6" : "ipv4")
449
- .ToLocalChecked());
450
-
451
- gchar* host = g_inet_address_to_string(
452
- g_inet_socket_address_get_address(sa));
453
- Nan::Set(result,
454
- Nan::New("address").ToLocalChecked(),
455
- Nan::New(host).ToLocalChecked());
456
- g_free(host);
457
-
458
- Nan::Set(result, Nan::New("port").ToLocalChecked(),
459
- Nan::New(static_cast<uint32_t>(g_inet_socket_address_get_port(sa))));
460
-
461
- if (family == G_SOCKET_FAMILY_IPV6) {
462
- Nan::Set(result,
463
- Nan::New("flowlabel").ToLocalChecked(),
464
- Nan::New(g_inet_socket_address_get_flowinfo(sa)));
465
- Nan::Set(result,
466
- Nan::New("scopeid").ToLocalChecked(),
467
- Nan::New(g_inet_socket_address_get_scope_id(sa)));
468
- }
469
- }
470
-
471
- #ifdef G_OS_UNIX
472
- if (G_IS_UNIX_SOCKET_ADDRESS(address)) {
473
- GUnixSocketAddress* sa = G_UNIX_SOCKET_ADDRESS(address);
474
-
475
- switch (g_unix_socket_address_get_address_type(sa)) {
476
- case G_UNIX_SOCKET_ADDRESS_ANONYMOUS: {
477
- Nan::Set(result,
478
- Nan::New("family").ToLocalChecked(),
479
- Nan::New("unix:anonymous").ToLocalChecked());
480
-
481
- break;
482
- }
483
- case G_UNIX_SOCKET_ADDRESS_PATH: {
484
- Nan::Set(result,
485
- Nan::New("family").ToLocalChecked(),
486
- Nan::New("unix:path").ToLocalChecked());
487
-
488
- gchar* path = g_filename_to_utf8(g_unix_socket_address_get_path(sa), -1,
489
- NULL, NULL, NULL);
490
- Nan::Set(result,
491
- Nan::New("path").ToLocalChecked(),
492
- Nan::New(path).ToLocalChecked());
493
- g_free(path);
494
-
495
- break;
496
- }
497
- case G_UNIX_SOCKET_ADDRESS_ABSTRACT:
498
- case G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED: {
499
- Nan::Set(result,
500
- Nan::New("family").ToLocalChecked(),
501
- Nan::New("unix:abstract").ToLocalChecked());
502
-
503
- Nan::Set(result,
504
- Nan::New("path").ToLocalChecked(),
505
- Nan::CopyBuffer(
506
- g_unix_socket_address_get_path(sa),
507
- g_unix_socket_address_get_path_len(sa)).ToLocalChecked());
508
-
509
- break;
510
- }
511
- default:
512
- break;
513
- }
514
- }
515
- #endif
516
-
517
- return result;
518
- }
519
-
520
- bool Runtime::ValueToCertificate(Local<Value> value,
521
- GTlsCertificate** certificate) {
522
- if (!value->IsString()) {
523
- Nan::ThrowTypeError("Bad argument, expected a string");
524
- return false;
525
- }
526
- Nan::Utf8String str(value);
527
- const char* cstr = *str;
528
-
529
- GError* error = NULL;
530
- if (strchr(cstr, '\n') != NULL)
531
- *certificate = g_tls_certificate_new_from_pem(cstr, -1, &error);
532
- else
533
- *certificate = g_tls_certificate_new_from_file(cstr, &error);
534
-
535
- if (error != NULL) {
536
- Nan::ThrowError(Nan::Error(error->message));
537
- g_error_free(error);
538
- return false;
539
- }
540
-
541
- return true;
542
- }
543
-
544
- const char* Runtime::ClassNameFromC(const char* cname) {
545
- if (g_str_has_prefix(cname, "Frida"))
546
- return cname + 5;
547
-
548
- return cname;
549
- }
550
-
551
- char* Runtime::ParameterNameFromC(const char* cname) {
552
- auto name = g_string_new("");
553
-
554
- bool need_uppercase = false;
555
- for (const char* cursor = cname; *cursor != '\0'; cursor++) {
556
- char ch = *cursor;
557
- if (ch == '-') {
558
- need_uppercase = true;
559
- } else {
560
- g_string_append_c(name, need_uppercase ? g_ascii_toupper(ch) : ch);
561
- need_uppercase = false;
562
- }
563
- }
564
-
565
- return g_string_free(name, FALSE);
566
- }
567
-
568
- }
package/src/runtime.h DELETED
@@ -1,69 +0,0 @@
1
- #ifndef FRIDANODE_RUNTIME_H
2
- #define FRIDANODE_RUNTIME_H
3
-
4
- #include "glib_context.h"
5
- #include "uv_context.h"
6
-
7
- #include <v8.h>
8
-
9
- namespace frida {
10
-
11
- class Runtime {
12
- public:
13
- Runtime(UVContext* uv_context, GLibContext* glib_context);
14
- ~Runtime();
15
-
16
- UVContext* GetUVContext() const;
17
- GLibContext* GetGLibContext() const;
18
-
19
- void* GetDataPointer(const char* id);
20
- void SetDataPointer(const char* id, void* value);
21
-
22
- v8::Local<v8::String> ValueToJson(v8::Local<v8::Value> value);
23
- v8::Local<v8::Value> ValueFromJson(v8::Local<v8::String> json);
24
-
25
- static v8::Local<v8::Value> ValueFromDatetime(const char* iso8601_text);
26
-
27
- static bool ValueToStrv(v8::Local<v8::Value> value, gchar*** strv,
28
- gint* length);
29
- static v8::Local<v8::Value> ValueFromStrv(gchar* const* strv, gint length);
30
-
31
- static bool ValueToEnvp(v8::Local<v8::Value> value, gchar*** envp,
32
- gint* length);
33
- static v8::Local<v8::Value> ValueFromEnvp(gchar* const* envp, gint length);
34
-
35
- static bool ValueToEnum(v8::Local<v8::Value> value, GType type,
36
- gpointer result);
37
- static v8::Local<v8::String> ValueFromEnum(gint value, GType type);
38
-
39
- static v8::Local<v8::Value> ValueFromParametersDict(GHashTable* dict);
40
-
41
- static GVariant* ValueToVariant(v8::Local<v8::Value> value);
42
- static v8::Local<v8::Value> ValueFromVariant(GVariant* v);
43
-
44
- static v8::Local<v8::Object> ValueFromSocketAddress(GSocketAddress* address);
45
-
46
- static bool ValueToCertificate(v8::Local<v8::Value> value,
47
- GTlsCertificate** certificate);
48
-
49
- static const char* ClassNameFromC(const char* cname);
50
- static char* ParameterNameFromC(const char* cname);
51
-
52
- private:
53
- static v8::Local<v8::Value> ValueFromVariantByteArray(GVariant* v);
54
- static v8::Local<v8::Value> ValueFromVariantDict(GVariant* v);
55
- static v8::Local<v8::Value> ValueFromVariantArray(GVariant* v);
56
-
57
- UVContext* uv_context_;
58
- GLibContext* glib_context_;
59
-
60
- GHashTable* data_;
61
-
62
- v8::Persistent<v8::Object> json_module_;
63
- v8::Persistent<v8::Function> json_stringify_;
64
- v8::Persistent<v8::Function> json_parse_;
65
- };
66
-
67
- }
68
-
69
- #endif