static gboolean gum_emit_range (const GumRangeDetails * details, gpointer user_data) { GumDukMatchContext * mc = user_data; GumDukScope * scope = mc->scope; duk_context * ctx = scope->ctx; gboolean proceed = TRUE; duk_push_heapptr (ctx, mc->on_match); _gum_duk_push_range (ctx, details, scope->core); if (_gum_duk_scope_call_sync (scope, 1)) { if (duk_is_string (ctx, -1)) proceed = strcmp (duk_require_string (ctx, -1), "stop") != 0; } else { proceed = FALSE; } duk_pop (ctx); return proceed; }
static gboolean gum_emit_malloc_range (const GumMallocRangeDetails * details, gpointer user_data) { GumDukMatchContext * mc = user_data; GumDukScope * scope = mc->scope; duk_context * ctx = scope->ctx; gboolean proceed = TRUE; duk_push_heapptr (ctx, mc->on_match); duk_push_object (ctx); _gum_duk_push_native_pointer (ctx, GSIZE_TO_POINTER (details->range->base_address), scope->core); duk_put_prop_string (ctx, -2, "base"); duk_push_uint (ctx, details->range->size); duk_put_prop_string (ctx, -2, "size"); if (_gum_duk_scope_call_sync (scope, 1)) { if (duk_is_string (ctx, -1)) proceed = strcmp (duk_require_string (ctx, -1), "stop") != 0; } else { proceed = FALSE; } duk_pop (ctx); return proceed; }
static gboolean gum_emit_module_range (const GumKernelModuleRangeDetails * details, GumDukMatchContext * mc) { GumDukScope * scope = mc->scope; duk_context * ctx = scope->ctx; gboolean proceed = TRUE; duk_push_heapptr (ctx, mc->on_match); duk_push_object (ctx); duk_push_string (ctx, details->name); duk_put_prop_string (ctx, -2, "name"); _gum_duk_push_uint64 (ctx, details->address, scope->core); duk_put_prop_string (ctx, -2, "base"); duk_push_uint (ctx, details->size); duk_put_prop_string (ctx, -2, "size"); _gum_duk_push_page_protection (ctx, details->protection); duk_put_prop_string (ctx, -2, "protection"); if (_gum_duk_scope_call_sync (scope, 1)) { if (duk_is_string (ctx, -1)) proceed = strcmp (duk_require_string (ctx, -1), "stop") != 0; } else { proceed = FALSE; } duk_pop (ctx); return proceed; }
static gboolean gum_emit_thread (const GumThreadDetails * details, gpointer user_data) { GumDukMatchContext * mc = user_data; GumDukScope * scope = mc->scope; duk_context * ctx = scope->ctx; gboolean proceed = TRUE; if (gum_script_backend_is_ignoring (details->id)) return TRUE; duk_push_heapptr (ctx, mc->on_match); duk_push_object (ctx); duk_push_uint (ctx, details->id); duk_put_prop_string (ctx, -2, "id"); duk_push_string (ctx, _gum_duk_thread_state_to_string (details->state)); duk_put_prop_string (ctx, -2, "state"); _gum_duk_push_cpu_context (ctx, (GumCpuContext *) &details->cpu_context, GUM_CPU_CONTEXT_READONLY, scope->core); duk_put_prop_string (ctx, -2, "context"); if (_gum_duk_scope_call_sync (scope, 1)) { if (duk_is_string (ctx, -1)) proceed = strcmp (duk_require_string (ctx, -1), "stop") != 0; } else { proceed = FALSE; } duk_pop (ctx); return proceed; }