frida 16.7.14 → 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.
- package/README.md +1 -10
- package/build/BSDmakefile +6 -0
- package/build/Makefile +10 -0
- package/build/src/frida.d.ts +364 -0
- package/build/src/frida.js +962 -0
- package/build/src/frida_binding.d.ts +938 -0
- package/meson.build +34 -67
- package/package.json +30 -20
- package/scripts/fetch-abi-bits.py +15 -65
- package/scripts/install.js +5 -4
- package/src/addon.def +3 -0
- package/src/addon.symbols +2 -1
- package/src/addon.version +4 -0
- package/src/frida_bindgen/__init__.py +0 -0
- package/src/frida_bindgen/__main__.py +4 -0
- package/src/frida_bindgen/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/frida_bindgen/__pycache__/__main__.cpython-312.pyc +0 -0
- package/src/frida_bindgen/__pycache__/cli.cpython-312.pyc +0 -0
- package/src/frida_bindgen/__pycache__/codegen.cpython-312.pyc +0 -0
- package/src/frida_bindgen/__pycache__/customization.cpython-312.pyc +0 -0
- package/src/frida_bindgen/__pycache__/loader.cpython-312.pyc +0 -0
- package/src/frida_bindgen/__pycache__/model.cpython-312.pyc +0 -0
- package/src/frida_bindgen/assets/codegen_helpers.c +1970 -0
- package/src/frida_bindgen/assets/codegen_helpers.ts +100 -0
- package/src/frida_bindgen/assets/codegen_prototypes.h +78 -0
- package/src/frida_bindgen/assets/codegen_types.h +57 -0
- package/src/frida_bindgen/assets/customization_facade.exports +13 -0
- package/src/frida_bindgen/assets/customization_facade.ts +157 -0
- package/src/frida_bindgen/assets/customization_helpers.imports +2 -0
- package/src/frida_bindgen/assets/customization_helpers.ts +396 -0
- package/src/frida_bindgen/cli.py +96 -0
- package/src/frida_bindgen/codegen.py +2233 -0
- package/src/frida_bindgen/customization.py +924 -0
- package/src/frida_bindgen/loader.py +60 -0
- package/src/frida_bindgen/model.py +1357 -0
- package/src/meson.build +92 -27
- package/{lib/build.py → src/tsc.py} +12 -12
- package/src/win_delay_load_hook.c +56 -0
- package/subprojects/frida-core.wrap +1 -1
- package/test/data/index.ts +2 -2
- package/test/device.ts +1 -2
- package/test/device_manager.ts +1 -2
- package/test/labrat.ts +2 -2
- package/test/script.ts +12 -12
- package/test/session.ts +3 -3
- package/tsconfig.json +6 -11
- package/dist/application.d.ts +0 -81
- package/dist/application.js +0 -2
- package/dist/authentication.d.ts +0 -3
- package/dist/authentication.js +0 -2
- package/dist/bus.d.ts +0 -16
- package/dist/bus.js +0 -23
- package/dist/cancellable.d.ts +0 -15
- package/dist/cancellable.js +0 -41
- package/dist/child.d.ts +0 -16
- package/dist/child.js +0 -9
- package/dist/crash.d.ts +0 -10
- package/dist/crash.js +0 -2
- package/dist/device.d.ts +0 -156
- package/dist/device.js +0 -188
- package/dist/device_manager.d.ts +0 -25
- package/dist/device_manager.js +0 -42
- package/dist/endpoint_parameters.d.ts +0 -26
- package/dist/endpoint_parameters.js +0 -24
- package/dist/icon.d.ts +0 -14
- package/dist/icon.js +0 -2
- package/dist/index.d.ts +0 -161
- package/dist/index.js +0 -170
- package/dist/iostream.d.ts +0 -13
- package/dist/iostream.js +0 -73
- package/dist/native.d.ts +0 -1
- package/dist/native.js +0 -11
- package/dist/portal_membership.d.ts +0 -6
- package/dist/portal_membership.js +0 -12
- package/dist/portal_service.d.ts +0 -48
- package/dist/portal_service.js +0 -52
- package/dist/process.d.ts +0 -47
- package/dist/process.js +0 -2
- package/dist/relay.d.ts +0 -22
- package/dist/relay.js +0 -32
- package/dist/script.d.ts +0 -70
- package/dist/script.js +0 -266
- package/dist/service.d.ts +0 -16
- package/dist/service.js +0 -26
- package/dist/session.d.ts +0 -45
- package/dist/session.js +0 -73
- package/dist/signals.d.ts +0 -20
- package/dist/signals.js +0 -40
- package/dist/socket_address.d.ts +0 -25
- package/dist/socket_address.js +0 -2
- package/dist/spawn.d.ts +0 -4
- package/dist/spawn.js +0 -2
- package/dist/system_parameters.d.ts +0 -84
- package/dist/system_parameters.js +0 -2
- package/lib/application.ts +0 -98
- package/lib/authentication.ts +0 -3
- package/lib/bus.ts +0 -30
- package/lib/cancellable.ts +0 -48
- package/lib/child.ts +0 -15
- package/lib/crash.ts +0 -11
- package/lib/device.ts +0 -331
- package/lib/device_manager.ts +0 -69
- package/lib/endpoint_parameters.ts +0 -56
- package/lib/icon.ts +0 -15
- package/lib/index.ts +0 -316
- package/lib/iostream.ts +0 -78
- package/lib/meson.build +0 -53
- package/lib/native.ts +0 -9
- package/lib/portal_membership.ts +0 -10
- package/lib/portal_service.ts +0 -105
- package/lib/process.ts +0 -57
- package/lib/relay.ts +0 -44
- package/lib/script.ts +0 -361
- package/lib/service.ts +0 -34
- package/lib/session.ts +0 -113
- package/lib/signals.ts +0 -45
- package/lib/socket_address.ts +0 -35
- package/lib/spawn.ts +0 -4
- package/lib/system_parameters.ts +0 -103
- package/meson.options +0 -11
- package/src/addon.cc +0 -78
- package/src/application.cc +0 -148
- package/src/application.h +0 -31
- package/src/authentication.cc +0 -174
- package/src/authentication.h +0 -24
- package/src/bus.cc +0 -167
- package/src/bus.h +0 -33
- package/src/cancellable.cc +0 -117
- package/src/cancellable.h +0 -31
- package/src/child.cc +0 -150
- package/src/child.h +0 -32
- package/src/crash.cc +0 -122
- package/src/crash.h +0 -30
- package/src/device.cc +0 -1350
- package/src/device.h +0 -56
- package/src/device_manager.cc +0 -362
- package/src/device_manager.h +0 -35
- package/src/endpoint_parameters.cc +0 -171
- package/src/endpoint_parameters.h +0 -28
- package/src/glib_context.cc +0 -62
- package/src/glib_context.h +0 -29
- package/src/glib_object.cc +0 -25
- package/src/glib_object.h +0 -37
- package/src/iostream.cc +0 -243
- package/src/iostream.h +0 -30
- package/src/operation.h +0 -94
- package/src/portal_membership.cc +0 -100
- package/src/portal_membership.h +0 -26
- package/src/portal_service.cc +0 -401
- package/src/portal_service.h +0 -40
- package/src/process.cc +0 -135
- package/src/process.h +0 -30
- package/src/relay.cc +0 -139
- package/src/relay.h +0 -31
- package/src/runtime.cc +0 -568
- package/src/runtime.h +0 -69
- package/src/script.cc +0 -301
- package/src/script.h +0 -36
- package/src/service.cc +0 -224
- package/src/service.h +0 -36
- package/src/session.cc +0 -860
- package/src/session.h +0 -42
- package/src/signals.cc +0 -334
- package/src/signals.h +0 -47
- package/src/spawn.cc +0 -95
- package/src/spawn.h +0 -27
- package/src/usage_monitor.h +0 -117
- package/src/uv_context.cc +0 -118
- package/src/uv_context.h +0 -40
- package/src/win_delay_load_hook.cc +0 -63
- package/subprojects/nan.wrap +0 -9
- package/subprojects/packagefiles/nan.patch +0 -13
package/src/session.h
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
#ifndef FRIDANODE_SESSION_H
|
|
2
|
-
#define FRIDANODE_SESSION_H
|
|
3
|
-
|
|
4
|
-
#include "glib_object.h"
|
|
5
|
-
|
|
6
|
-
#include <frida-core.h>
|
|
7
|
-
|
|
8
|
-
namespace frida {
|
|
9
|
-
|
|
10
|
-
class Session : public GLibObject {
|
|
11
|
-
public:
|
|
12
|
-
static void Init(v8::Local<v8::Object> exports, Runtime* runtime);
|
|
13
|
-
static v8::Local<v8::Object> New(gpointer handle, Runtime* runtime);
|
|
14
|
-
|
|
15
|
-
private:
|
|
16
|
-
explicit Session(FridaSession* handle, Runtime* runtime);
|
|
17
|
-
~Session();
|
|
18
|
-
|
|
19
|
-
static NAN_METHOD(New);
|
|
20
|
-
|
|
21
|
-
static NAN_PROPERTY_GETTER(GetPid);
|
|
22
|
-
static NAN_PROPERTY_GETTER(GetPersistTimeout);
|
|
23
|
-
static NAN_PROPERTY_GETTER(IsDetached);
|
|
24
|
-
|
|
25
|
-
static NAN_METHOD(Detach);
|
|
26
|
-
static NAN_METHOD(Resume);
|
|
27
|
-
static NAN_METHOD(EnableChildGating);
|
|
28
|
-
static NAN_METHOD(DisableChildGating);
|
|
29
|
-
static NAN_METHOD(CreateScript);
|
|
30
|
-
static NAN_METHOD(CreateScriptFromBytes);
|
|
31
|
-
static NAN_METHOD(CompileScript);
|
|
32
|
-
static NAN_METHOD(SnapshotScript);
|
|
33
|
-
static NAN_METHOD(SetupPeerConnection);
|
|
34
|
-
static NAN_METHOD(JoinPortal);
|
|
35
|
-
|
|
36
|
-
static v8::Local<v8::Value> TransformSignal(const gchar* name, guint index,
|
|
37
|
-
const GValue* value, gpointer user_data);
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
#endif
|
package/src/signals.cc
DELETED
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
#include "signals.h"
|
|
2
|
-
|
|
3
|
-
#include <cstring>
|
|
4
|
-
|
|
5
|
-
#define SIGNALS_DATA_CONSTRUCTOR "signals:ctor"
|
|
6
|
-
|
|
7
|
-
using std::memset;
|
|
8
|
-
using v8::Boolean;
|
|
9
|
-
using v8::Exception;
|
|
10
|
-
using v8::External;
|
|
11
|
-
using v8::Function;
|
|
12
|
-
using v8::Integer;
|
|
13
|
-
using v8::Isolate;
|
|
14
|
-
using v8::Local;
|
|
15
|
-
using v8::Number;
|
|
16
|
-
using v8::Object;
|
|
17
|
-
using v8::Persistent;
|
|
18
|
-
using v8::String;
|
|
19
|
-
using v8::Uint32;
|
|
20
|
-
using v8::Value;
|
|
21
|
-
|
|
22
|
-
namespace frida {
|
|
23
|
-
|
|
24
|
-
struct SignalsClosure {
|
|
25
|
-
GClosure closure;
|
|
26
|
-
gboolean alive;
|
|
27
|
-
guint signal_id;
|
|
28
|
-
guint handler_id;
|
|
29
|
-
Persistent<Function>* callback;
|
|
30
|
-
Persistent<Object>* parent;
|
|
31
|
-
Signals::TransformCallback transform;
|
|
32
|
-
gpointer transform_data;
|
|
33
|
-
Runtime* runtime;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
static SignalsClosure* signals_closure_new(guint signal_id,
|
|
37
|
-
Local<Function> callback, Local<Object> parent,
|
|
38
|
-
Signals::TransformCallback transform, gpointer transform_data,
|
|
39
|
-
Runtime* runtime);
|
|
40
|
-
static void signals_closure_finalize(gpointer data, GClosure* closure);
|
|
41
|
-
static void signals_closure_marshal(GClosure* closure, GValue* return_gvalue,
|
|
42
|
-
guint n_param_values, const GValue* param_values, gpointer invocation_hint,
|
|
43
|
-
gpointer marshal_data);
|
|
44
|
-
static Local<Value> signals_closure_gvalue_to_jsvalue(const GValue* gvalue);
|
|
45
|
-
|
|
46
|
-
Signals::Signals(gpointer handle, TransformCallback transform,
|
|
47
|
-
gpointer transform_data, Runtime* runtime)
|
|
48
|
-
: GLibObject(handle, runtime),
|
|
49
|
-
transform_(transform),
|
|
50
|
-
transform_data_(transform_data),
|
|
51
|
-
connect_(NULL),
|
|
52
|
-
connect_data_(NULL),
|
|
53
|
-
disconnect_(NULL),
|
|
54
|
-
disconnect_data_(NULL),
|
|
55
|
-
closures_(NULL) {
|
|
56
|
-
g_object_ref(handle_);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
Signals::~Signals() {
|
|
60
|
-
g_assert(closures_ == NULL); // They keep us alive
|
|
61
|
-
frida_unref(handle_);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
void Signals::Init(Local<Object> exports, Runtime* runtime) {
|
|
65
|
-
auto isolate = Isolate::GetCurrent();
|
|
66
|
-
|
|
67
|
-
auto name = Nan::New("Signals").ToLocalChecked();
|
|
68
|
-
auto tpl = CreateTemplate(name, Signals::New, runtime);
|
|
69
|
-
|
|
70
|
-
Nan::SetPrototypeMethod(tpl, "connect", Connect);
|
|
71
|
-
Nan::SetPrototypeMethod(tpl, "disconnect", Disconnect);
|
|
72
|
-
|
|
73
|
-
auto ctor = Nan::GetFunction(tpl).ToLocalChecked();
|
|
74
|
-
Nan::Set(exports, name, ctor);
|
|
75
|
-
runtime->SetDataPointer(SIGNALS_DATA_CONSTRUCTOR,
|
|
76
|
-
new Persistent<Function>(isolate, ctor));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
Local<Object> Signals::New(gpointer handle, Runtime* runtime,
|
|
80
|
-
TransformCallback transform, gpointer transform_data) {
|
|
81
|
-
|
|
82
|
-
auto ctor = Nan::New<Function>(
|
|
83
|
-
*static_cast<Persistent<Function>*>(
|
|
84
|
-
runtime->GetDataPointer(SIGNALS_DATA_CONSTRUCTOR)));
|
|
85
|
-
const int argc = 3;
|
|
86
|
-
Local<Value> argv[argc] = {
|
|
87
|
-
Nan::New<External>(handle),
|
|
88
|
-
Nan::New<External>(reinterpret_cast<void*>(transform)),
|
|
89
|
-
Nan::New<External>(transform_data)
|
|
90
|
-
};
|
|
91
|
-
return Nan::NewInstance(ctor, argc, argv).ToLocalChecked();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
void Signals::SetConnectCallback(ConnectCallback callback,
|
|
95
|
-
gpointer user_data) {
|
|
96
|
-
connect_ = callback;
|
|
97
|
-
connect_data_ = user_data;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
void Signals::SetDisconnectCallback(DisconnectCallback callback,
|
|
101
|
-
gpointer user_data) {
|
|
102
|
-
disconnect_ = callback;
|
|
103
|
-
disconnect_data_ = user_data;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
NAN_METHOD(Signals::New) {
|
|
107
|
-
if (!info.IsConstructCall()) {
|
|
108
|
-
Nan::ThrowError("Use the `new` keyword to create a new instance");
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (info.Length() != 3 ||
|
|
113
|
-
!info[0]->IsExternal() ||
|
|
114
|
-
!info[1]->IsExternal() ||
|
|
115
|
-
!info[2]->IsExternal()) {
|
|
116
|
-
Nan::ThrowTypeError("Bad argument, expected raw handles");
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
auto handle = Local<External>::Cast(info[0])->Value();
|
|
121
|
-
auto transform = reinterpret_cast<TransformCallback>(
|
|
122
|
-
Local<External>::Cast(info[1])->Value());
|
|
123
|
-
auto transform_data = Local<External>::Cast(info[2])->Value();
|
|
124
|
-
auto wrapper = new Signals(handle, transform, transform_data,
|
|
125
|
-
GetRuntimeFromConstructorArgs(info));
|
|
126
|
-
auto obj = info.This();
|
|
127
|
-
wrapper->Wrap(obj);
|
|
128
|
-
info.GetReturnValue().Set(obj);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
NAN_METHOD(Signals::Connect) {
|
|
132
|
-
auto obj = info.Holder();
|
|
133
|
-
auto wrapper = ObjectWrap::Unwrap<Signals>(obj);
|
|
134
|
-
auto runtime = wrapper->runtime_;
|
|
135
|
-
|
|
136
|
-
guint signal_id;
|
|
137
|
-
Local<Function> callback;
|
|
138
|
-
if (!wrapper->GetSignalArguments(info, signal_id, callback))
|
|
139
|
-
return;
|
|
140
|
-
|
|
141
|
-
auto signals_closure = signals_closure_new(signal_id, callback, obj,
|
|
142
|
-
wrapper->transform_, wrapper->transform_data_, runtime);
|
|
143
|
-
auto closure = reinterpret_cast<GClosure*>(signals_closure);
|
|
144
|
-
g_closure_ref(closure);
|
|
145
|
-
g_closure_sink(closure);
|
|
146
|
-
wrapper->closures_ = g_slist_append(wrapper->closures_, signals_closure);
|
|
147
|
-
|
|
148
|
-
signals_closure->handler_id = g_signal_connect_closure_by_id(wrapper->handle_,
|
|
149
|
-
signal_id, 0, closure, TRUE);
|
|
150
|
-
g_assert(signals_closure->handler_id != 0);
|
|
151
|
-
|
|
152
|
-
if (wrapper->connect_ != NULL) {
|
|
153
|
-
wrapper->connect_(g_signal_name(signal_id), wrapper->connect_data_);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
NAN_METHOD(Signals::Disconnect) {
|
|
158
|
-
auto wrapper = ObjectWrap::Unwrap<Signals>(info.Holder());
|
|
159
|
-
|
|
160
|
-
guint signal_id;
|
|
161
|
-
Local<Function> callback;
|
|
162
|
-
if (!wrapper->GetSignalArguments(info, signal_id, callback))
|
|
163
|
-
return;
|
|
164
|
-
|
|
165
|
-
for (GSList* cur = wrapper->closures_; cur != NULL; cur = cur->next) {
|
|
166
|
-
auto signals_closure = static_cast<SignalsClosure*>(cur->data);
|
|
167
|
-
auto closure = reinterpret_cast<GClosure*>(signals_closure);
|
|
168
|
-
auto closure_callback = Nan::New<Function>(*signals_closure->callback);
|
|
169
|
-
if (signals_closure->signal_id == signal_id &&
|
|
170
|
-
closure_callback->SameValue(callback)) {
|
|
171
|
-
if (wrapper->disconnect_ != NULL) {
|
|
172
|
-
wrapper->disconnect_(g_signal_name(signal_id),
|
|
173
|
-
wrapper->disconnect_data_);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
wrapper->closures_ = g_slist_delete_link(wrapper->closures_, cur);
|
|
177
|
-
|
|
178
|
-
signals_closure->alive = FALSE;
|
|
179
|
-
|
|
180
|
-
g_assert(signals_closure->handler_id != 0);
|
|
181
|
-
g_signal_handler_disconnect(wrapper->handle_,
|
|
182
|
-
signals_closure->handler_id);
|
|
183
|
-
|
|
184
|
-
g_closure_unref(closure);
|
|
185
|
-
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
bool Signals::GetSignalArguments(const Nan::FunctionCallbackInfo<Value>& info,
|
|
192
|
-
guint& signal_id, Local<Function>& callback) {
|
|
193
|
-
if (info.Length() < 2 || !info[0]->IsString() || !info[1]->IsFunction()) {
|
|
194
|
-
Nan::ThrowTypeError("Bad arguments, expected string and function");
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
Nan::Utf8String signal_name(info[0]);
|
|
198
|
-
signal_id = g_signal_lookup(*signal_name, G_OBJECT_TYPE(handle_));
|
|
199
|
-
if (signal_id == 0) {
|
|
200
|
-
Nan::ThrowTypeError("Bad signal name");
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
callback = Local<Function>::Cast(info[1]);
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
static SignalsClosure* signals_closure_new(guint signal_id,
|
|
208
|
-
Local<Function> callback, Local<Object> parent,
|
|
209
|
-
Signals::TransformCallback transform, gpointer transform_data,
|
|
210
|
-
Runtime* runtime) {
|
|
211
|
-
auto isolate = Isolate::GetCurrent();
|
|
212
|
-
|
|
213
|
-
GClosure* closure = g_closure_new_simple(sizeof(SignalsClosure), NULL);
|
|
214
|
-
g_closure_add_finalize_notifier(closure, NULL, signals_closure_finalize);
|
|
215
|
-
g_closure_set_marshal(closure, signals_closure_marshal);
|
|
216
|
-
|
|
217
|
-
SignalsClosure* self = reinterpret_cast<SignalsClosure*>(closure);
|
|
218
|
-
self->alive = TRUE;
|
|
219
|
-
self->signal_id = signal_id;
|
|
220
|
-
self->handler_id = 0;
|
|
221
|
-
self->callback = new Persistent<Function>(isolate, callback);
|
|
222
|
-
self->parent = new Persistent<Object>(isolate, parent);
|
|
223
|
-
self->transform = transform;
|
|
224
|
-
self->transform_data = transform_data;
|
|
225
|
-
self->runtime = runtime;
|
|
226
|
-
|
|
227
|
-
return self;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
static void signals_closure_finalize(gpointer data, GClosure* closure) {
|
|
231
|
-
SignalsClosure* self = reinterpret_cast<SignalsClosure*>(closure);
|
|
232
|
-
|
|
233
|
-
self->callback->Reset();
|
|
234
|
-
self->parent->Reset();
|
|
235
|
-
delete self->callback;
|
|
236
|
-
delete self->parent;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
static void signals_closure_marshal(GClosure* closure, GValue* return_gvalue,
|
|
240
|
-
guint n_param_values, const GValue* param_values, gpointer invocation_hint,
|
|
241
|
-
gpointer marshal_data) {
|
|
242
|
-
SignalsClosure* self = reinterpret_cast<SignalsClosure*>(closure);
|
|
243
|
-
|
|
244
|
-
g_closure_ref(closure);
|
|
245
|
-
|
|
246
|
-
GArray* args = g_array_sized_new(FALSE, FALSE, sizeof(GValue),
|
|
247
|
-
n_param_values);
|
|
248
|
-
g_assert(n_param_values >= 1);
|
|
249
|
-
for (guint i = 1; i != n_param_values; i++) {
|
|
250
|
-
GValue val;
|
|
251
|
-
memset(&val, 0, sizeof(val));
|
|
252
|
-
g_value_init(&val, param_values[i].g_type);
|
|
253
|
-
g_value_copy(¶m_values[i], &val);
|
|
254
|
-
g_array_append_val(args, val);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
self->runtime->GetUVContext()->Schedule([=]() {
|
|
258
|
-
if (self->alive) {
|
|
259
|
-
auto transform = self->transform;
|
|
260
|
-
auto transform_data = self->transform_data;
|
|
261
|
-
auto signal_name = g_signal_name(self->signal_id);
|
|
262
|
-
|
|
263
|
-
const int argc = args->len;
|
|
264
|
-
Local<Value>* argv = new Local<Value>[argc];
|
|
265
|
-
for (guint i = 0; i != args->len; i++) {
|
|
266
|
-
auto value = &g_array_index(args, GValue, i);
|
|
267
|
-
argv[i] = transform != NULL
|
|
268
|
-
? transform(signal_name, i, value, transform_data)
|
|
269
|
-
: Local<Value>();
|
|
270
|
-
if (argv[i].IsEmpty())
|
|
271
|
-
argv[i] = signals_closure_gvalue_to_jsvalue(value);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
auto context = Isolate::GetCurrent()->GetCurrentContext();
|
|
275
|
-
auto callback = Nan::New<Function>(*self->callback);
|
|
276
|
-
auto recv = Nan::Undefined();
|
|
277
|
-
Local<Value> no_result;
|
|
278
|
-
callback->Call(context, recv, argc, argv).FromMaybe(no_result);
|
|
279
|
-
|
|
280
|
-
delete[] argv;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
for (guint i = 0; i != args->len; i++)
|
|
284
|
-
g_value_reset(&g_array_index(args, GValue, i));
|
|
285
|
-
g_array_free(args, TRUE);
|
|
286
|
-
|
|
287
|
-
g_closure_unref(closure);
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
static Local<Value> signals_closure_gvalue_to_jsvalue(const GValue* gvalue) {
|
|
292
|
-
auto gtype = G_VALUE_TYPE(gvalue);
|
|
293
|
-
switch (gtype) {
|
|
294
|
-
case G_TYPE_BOOLEAN:
|
|
295
|
-
return Nan::New<Boolean>(g_value_get_boolean(gvalue));
|
|
296
|
-
case G_TYPE_INT:
|
|
297
|
-
return Nan::New<Integer>(g_value_get_int(gvalue));
|
|
298
|
-
case G_TYPE_UINT:
|
|
299
|
-
return Nan::New<Uint32>(g_value_get_uint(gvalue));
|
|
300
|
-
case G_TYPE_FLOAT:
|
|
301
|
-
return Nan::New<Number>(g_value_get_float(gvalue));
|
|
302
|
-
case G_TYPE_DOUBLE:
|
|
303
|
-
return Nan::New<Number>(g_value_get_double(gvalue));
|
|
304
|
-
case G_TYPE_STRING: {
|
|
305
|
-
auto str = g_value_get_string(gvalue);
|
|
306
|
-
if (str == NULL)
|
|
307
|
-
return Nan::Null();
|
|
308
|
-
return Nan::New<String>(str).ToLocalChecked();
|
|
309
|
-
}
|
|
310
|
-
default: {
|
|
311
|
-
if (G_TYPE_IS_ENUM(gtype))
|
|
312
|
-
return Runtime::ValueFromEnum(g_value_get_enum(gvalue), gtype);
|
|
313
|
-
|
|
314
|
-
if (g_type_is_a(gtype, G_TYPE_SOCKET_ADDRESS)) {
|
|
315
|
-
return Runtime::ValueFromSocketAddress(
|
|
316
|
-
G_SOCKET_ADDRESS(g_value_get_object(gvalue)));
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
g_assert(gtype == G_TYPE_BYTES);
|
|
320
|
-
auto bytes = static_cast<GBytes*>(g_value_get_boxed(gvalue));
|
|
321
|
-
if (bytes != NULL) {
|
|
322
|
-
gsize size;
|
|
323
|
-
gconstpointer data = g_bytes_get_data(bytes, &size);
|
|
324
|
-
|
|
325
|
-
return Nan::CopyBuffer(static_cast<const char*>(data), size)
|
|
326
|
-
.ToLocalChecked();
|
|
327
|
-
} else {
|
|
328
|
-
return Nan::Null();
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
}
|
package/src/signals.h
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#ifndef FRIDANODE_SIGNALS_H
|
|
2
|
-
#define FRIDANODE_SIGNALS_H
|
|
3
|
-
|
|
4
|
-
#include "glib_object.h"
|
|
5
|
-
|
|
6
|
-
namespace frida {
|
|
7
|
-
|
|
8
|
-
class Signals : public GLibObject {
|
|
9
|
-
public:
|
|
10
|
-
typedef v8::Local<v8::Value>(*TransformCallback)(const gchar* name,
|
|
11
|
-
guint index, const GValue* value, gpointer user_data);
|
|
12
|
-
typedef void (*ConnectCallback)(const gchar* name, gpointer user_data);
|
|
13
|
-
typedef void (*DisconnectCallback)(const gchar* name, gpointer user_data);
|
|
14
|
-
|
|
15
|
-
static void Init(v8::Local<v8::Object> exports, Runtime* runtime);
|
|
16
|
-
static v8::Local<v8::Object> New(gpointer handle, Runtime* runtime,
|
|
17
|
-
TransformCallback transform = NULL, gpointer transform_data = NULL);
|
|
18
|
-
|
|
19
|
-
void SetConnectCallback(ConnectCallback callback, gpointer user_data);
|
|
20
|
-
void SetDisconnectCallback(DisconnectCallback callback, gpointer user_data);
|
|
21
|
-
|
|
22
|
-
private:
|
|
23
|
-
Signals(gpointer handle, TransformCallback transform, gpointer transform_data,
|
|
24
|
-
Runtime* runtime);
|
|
25
|
-
~Signals();
|
|
26
|
-
|
|
27
|
-
static NAN_METHOD(New);
|
|
28
|
-
|
|
29
|
-
static NAN_METHOD(Connect);
|
|
30
|
-
static NAN_METHOD(Disconnect);
|
|
31
|
-
|
|
32
|
-
bool GetSignalArguments(
|
|
33
|
-
const Nan::FunctionCallbackInfo<v8::Value>& info,
|
|
34
|
-
guint& signal_id, v8::Local<v8::Function>& callback);
|
|
35
|
-
|
|
36
|
-
TransformCallback transform_;
|
|
37
|
-
gpointer transform_data_;
|
|
38
|
-
ConnectCallback connect_;
|
|
39
|
-
gpointer connect_data_;
|
|
40
|
-
DisconnectCallback disconnect_;
|
|
41
|
-
gpointer disconnect_data_;
|
|
42
|
-
GSList* closures_;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
#endif
|
package/src/spawn.cc
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
#include "spawn.h"
|
|
2
|
-
|
|
3
|
-
#define SPAWN_DATA_CONSTRUCTOR "spawn:ctor"
|
|
4
|
-
|
|
5
|
-
using v8::DEFAULT;
|
|
6
|
-
using v8::External;
|
|
7
|
-
using v8::Function;
|
|
8
|
-
using v8::Integer;
|
|
9
|
-
using v8::Isolate;
|
|
10
|
-
using v8::Local;
|
|
11
|
-
using v8::Object;
|
|
12
|
-
using v8::Persistent;
|
|
13
|
-
using v8::ReadOnly;
|
|
14
|
-
using v8::Value;
|
|
15
|
-
|
|
16
|
-
namespace frida {
|
|
17
|
-
|
|
18
|
-
Spawn::Spawn(FridaSpawn* handle, Runtime* runtime)
|
|
19
|
-
: GLibObject(handle, runtime) {
|
|
20
|
-
g_object_ref(handle_);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
Spawn::~Spawn() {
|
|
24
|
-
g_object_unref(handle_);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
void Spawn::Init(Local<Object> exports, Runtime* runtime) {
|
|
28
|
-
auto isolate = Isolate::GetCurrent();
|
|
29
|
-
|
|
30
|
-
auto name = Nan::New("Spawn").ToLocalChecked();
|
|
31
|
-
auto tpl = CreateTemplate(name, Spawn::New, runtime);
|
|
32
|
-
|
|
33
|
-
auto instance_tpl = tpl->InstanceTemplate();
|
|
34
|
-
auto data = Local<Value>();
|
|
35
|
-
Nan::SetAccessor(instance_tpl, Nan::New("identifier").ToLocalChecked(),
|
|
36
|
-
GetIdentifier, 0, data, DEFAULT, ReadOnly);
|
|
37
|
-
Nan::SetAccessor(instance_tpl, Nan::New("pid").ToLocalChecked(),
|
|
38
|
-
GetPid, 0, data, DEFAULT, ReadOnly);
|
|
39
|
-
|
|
40
|
-
auto ctor = Nan::GetFunction(tpl).ToLocalChecked();
|
|
41
|
-
Nan::Set(exports, name, ctor);
|
|
42
|
-
runtime->SetDataPointer(SPAWN_DATA_CONSTRUCTOR,
|
|
43
|
-
new Persistent<Function>(isolate, ctor));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
Local<Object> Spawn::New(gpointer handle, Runtime* runtime) {
|
|
47
|
-
auto ctor = Nan::New<Function>(
|
|
48
|
-
*static_cast<Persistent<Function>*>(
|
|
49
|
-
runtime->GetDataPointer(SPAWN_DATA_CONSTRUCTOR)));
|
|
50
|
-
const int argc = 1;
|
|
51
|
-
Local<Value> argv[argc] = { Nan::New<External>(handle) };
|
|
52
|
-
return Nan::NewInstance(ctor, argc, argv).ToLocalChecked();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
NAN_METHOD(Spawn::New) {
|
|
56
|
-
if (!info.IsConstructCall()) {
|
|
57
|
-
Nan::ThrowError("Use the `new` keyword to create a new instance");
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (info.Length() != 1 || !info[0]->IsExternal()) {
|
|
62
|
-
Nan::ThrowTypeError("Bad argument, expected raw handle");
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
auto runtime = GetRuntimeFromConstructorArgs(info);
|
|
67
|
-
|
|
68
|
-
auto handle = static_cast<FridaSpawn*>(
|
|
69
|
-
Local<External>::Cast(info[0])->Value());
|
|
70
|
-
auto wrapper = new Spawn(handle, runtime);
|
|
71
|
-
auto obj = info.This();
|
|
72
|
-
wrapper->Wrap(obj);
|
|
73
|
-
|
|
74
|
-
info.GetReturnValue().Set(obj);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
NAN_PROPERTY_GETTER(Spawn::GetPid) {
|
|
78
|
-
auto handle = ObjectWrap::Unwrap<Spawn>(
|
|
79
|
-
info.Holder())->GetHandle<FridaSpawn>();
|
|
80
|
-
|
|
81
|
-
info.GetReturnValue().Set(Nan::New<Integer>(frida_spawn_get_pid(handle)));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
NAN_PROPERTY_GETTER(Spawn::GetIdentifier) {
|
|
85
|
-
auto handle = ObjectWrap::Unwrap<Spawn>(
|
|
86
|
-
info.Holder())->GetHandle<FridaSpawn>();
|
|
87
|
-
|
|
88
|
-
auto identifier = frida_spawn_get_identifier(handle);
|
|
89
|
-
if (identifier != NULL)
|
|
90
|
-
info.GetReturnValue().Set(Nan::New(identifier).ToLocalChecked());
|
|
91
|
-
else
|
|
92
|
-
info.GetReturnValue().Set(Nan::Null());
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
}
|
package/src/spawn.h
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#ifndef FRIDANODE_SPAWN_H
|
|
2
|
-
#define FRIDANODE_SPAWN_H
|
|
3
|
-
|
|
4
|
-
#include "glib_object.h"
|
|
5
|
-
|
|
6
|
-
#include <frida-core.h>
|
|
7
|
-
|
|
8
|
-
namespace frida {
|
|
9
|
-
|
|
10
|
-
class Spawn : public GLibObject {
|
|
11
|
-
public:
|
|
12
|
-
static void Init(v8::Local<v8::Object> exports, Runtime* runtime);
|
|
13
|
-
static v8::Local<v8::Object> New(gpointer handle, Runtime* runtime);
|
|
14
|
-
|
|
15
|
-
private:
|
|
16
|
-
explicit Spawn(FridaSpawn* handle, Runtime* runtime);
|
|
17
|
-
~Spawn();
|
|
18
|
-
|
|
19
|
-
static NAN_METHOD(New);
|
|
20
|
-
|
|
21
|
-
static NAN_PROPERTY_GETTER(GetPid);
|
|
22
|
-
static NAN_PROPERTY_GETTER(GetIdentifier);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
#endif
|
package/src/usage_monitor.h
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
#ifndef FRIDANODE_USAGE_MONITOR_H
|
|
2
|
-
#define FRIDANODE_USAGE_MONITOR_H
|
|
3
|
-
|
|
4
|
-
#include "glib_object.h"
|
|
5
|
-
|
|
6
|
-
using Nan::HandleScope;
|
|
7
|
-
|
|
8
|
-
namespace frida {
|
|
9
|
-
|
|
10
|
-
template<typename T>
|
|
11
|
-
class UsageMonitor {
|
|
12
|
-
public:
|
|
13
|
-
typedef gboolean (*CheckCallback)(T* self);
|
|
14
|
-
|
|
15
|
-
UsageMonitor(CheckCallback check, const gchar* signal)
|
|
16
|
-
: ref_count_(1),
|
|
17
|
-
check_(check),
|
|
18
|
-
signal_(signal),
|
|
19
|
-
instance_(NULL),
|
|
20
|
-
handler_id_(0),
|
|
21
|
-
runtime_(NULL) {
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
private:
|
|
25
|
-
void Ref() {
|
|
26
|
-
g_atomic_int_add(&ref_count_, 1);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
void Unref() {
|
|
30
|
-
if (g_atomic_int_add(&ref_count_, -1) - 1 == 0) {
|
|
31
|
-
delete this;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
~UsageMonitor() {
|
|
36
|
-
if (!object_.IsEmpty()) {
|
|
37
|
-
object_.ClearWeak();
|
|
38
|
-
object_.Reset();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public:
|
|
43
|
-
void Enable(GLibObject* wrapper) {
|
|
44
|
-
g_assert(instance_ == NULL);
|
|
45
|
-
|
|
46
|
-
auto isolate = v8::Isolate::GetCurrent();
|
|
47
|
-
object_.Reset(wrapper->handle(isolate));
|
|
48
|
-
object_.SetWeak(this, OnWeakNotifyWrapper, Nan::WeakCallbackType::kParameter);
|
|
49
|
-
#if NODE_MAJOR_VERSION < 12
|
|
50
|
-
object_.MarkIndependent();
|
|
51
|
-
#endif
|
|
52
|
-
instance_ = wrapper->GetHandle<T>();
|
|
53
|
-
g_object_ref(instance_);
|
|
54
|
-
runtime_ = wrapper->GetRuntime();
|
|
55
|
-
|
|
56
|
-
runtime_->GetUVContext()->IncreaseUsage();
|
|
57
|
-
runtime_->GetGLibContext()->Schedule([=]() {
|
|
58
|
-
handler_id_ = g_signal_connect_swapped(instance_, signal_,
|
|
59
|
-
reinterpret_cast<GCallback>(OnSignal), this);
|
|
60
|
-
Check();
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
private:
|
|
65
|
-
void Disable() {
|
|
66
|
-
if (instance_ == NULL)
|
|
67
|
-
return;
|
|
68
|
-
|
|
69
|
-
g_signal_handler_disconnect(instance_, handler_id_);
|
|
70
|
-
g_object_unref(instance_);
|
|
71
|
-
instance_ = NULL;
|
|
72
|
-
|
|
73
|
-
runtime_->GetUVContext()->Schedule([=]() {
|
|
74
|
-
runtime_->GetUVContext()->DecreaseUsage();
|
|
75
|
-
Unref();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
void Check() {
|
|
80
|
-
if (check_(instance_))
|
|
81
|
-
Disable();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
static void OnWeakNotifyWrapper(
|
|
85
|
-
const Nan::WeakCallbackInfo<UsageMonitor<T>>& data) {
|
|
86
|
-
HandleScope scope;
|
|
87
|
-
data.GetParameter()->OnWeakNotify();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
void OnWeakNotify() {
|
|
91
|
-
object_.Reset();
|
|
92
|
-
|
|
93
|
-
Ref();
|
|
94
|
-
runtime_->GetGLibContext()->Schedule([=]() {
|
|
95
|
-
Disable();
|
|
96
|
-
runtime_->GetUVContext()->Schedule([=]() {
|
|
97
|
-
Unref();
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
static void OnSignal(UsageMonitor* monitor) {
|
|
103
|
-
monitor->Check();
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
volatile gint ref_count_;
|
|
107
|
-
CheckCallback check_;
|
|
108
|
-
const gchar* signal_;
|
|
109
|
-
Nan::Persistent<v8::Object> object_;
|
|
110
|
-
T* instance_;
|
|
111
|
-
guint handler_id_;
|
|
112
|
-
Runtime* runtime_;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
#endif
|