GumScriptBackend * gum_script_backend_obtain_v8 (void) { static volatile gsize gonce_value; if (g_once_init_enter (&gonce_value)) { GumScriptBackend * backend = NULL; if (gum_query_is_rwx_supported ()) { #ifdef HAVE_V8 backend = GUM_SCRIPT_BACKEND ( g_object_new (GUM_V8_TYPE_SCRIPT_BACKEND, NULL)); #endif if (backend != NULL) _gum_register_early_destructor (gum_script_backend_deinit_v8); } g_once_init_leave (&gonce_value, GPOINTER_TO_SIZE (backend) + 1); } return GUM_SCRIPT_BACKEND (GSIZE_TO_POINTER (gonce_value - 1)); }
GumScriptBackend * gum_script_backend_obtain_duk (void) { static volatile gsize gonce_value; if (g_once_init_enter (&gonce_value)) { GumScriptBackend * backend; backend = GUM_SCRIPT_BACKEND ( g_object_new (GUM_DUK_TYPE_SCRIPT_BACKEND, NULL)); _gum_register_early_destructor (gum_script_backend_deinit_duk); g_once_init_leave (&gonce_value, GPOINTER_TO_SIZE (backend) + 1); } return GUM_SCRIPT_BACKEND (GSIZE_TO_POINTER (gonce_value - 1)); }
GumScriptBackend * gum_script_backend_obtain_jsc (void) { static volatile gsize gonce_value; if (g_once_init_enter (&gonce_value)) { GumScriptBackend * backend = NULL; #ifdef HAVE_IOS backend = GUM_SCRIPT_BACKEND ( g_object_new (GUM_JSC_TYPE_SCRIPT_BACKEND, NULL)); #endif if (backend != NULL) _gum_register_destructor (gum_script_backend_deinit_jsc); g_once_init_leave (&gonce_value, GPOINTER_TO_SIZE (backend) + 1); } return GUM_SCRIPT_BACKEND (GSIZE_TO_POINTER (gonce_value - 1)); }
static gboolean gum_emit_thread (const GumThreadDetails * details, gpointer user_data) { GumJscMatchContext * mc = user_data; GumJscCore * core = mc->self->core; GumJscScope scope = GUM_JSC_SCOPE_INIT (core); JSContextRef ctx = mc->ctx; JSObjectRef thread; JSValueRef result; gboolean proceed; gchar * str; if (gum_script_backend_is_ignoring (GUM_SCRIPT_BACKEND (core->backend), details->id)) return TRUE; thread = JSObjectMake (ctx, NULL, NULL); _gumjs_object_set_uint (ctx, thread, "id", details->id); _gumjs_object_set_string (ctx, thread, "state", _gumjs_thread_state_to_string (details->state)); _gumjs_object_set (ctx, thread, "context", _gumjs_cpu_context_new (ctx, (GumCpuContext *) &details->cpu_context, GUM_CPU_CONTEXT_READONLY, core)); result = JSObjectCallAsFunction (ctx, mc->on_match, NULL, 1, (JSValueRef *) &thread, &scope.exception); _gum_jsc_scope_flush (&scope); proceed = TRUE; if (result != NULL && _gumjs_string_try_get (ctx, result, &str, NULL)) { proceed = strcmp (str, "stop") != 0; g_free (str); } return proceed; }