Esempio n. 1
0
static NativeThreadFuncReturnType
frida_agent_auto_ignorer_thread_create_proxy (void * data)
{
  GumThreadId current_thread_id;
  FridaAutoInterceptContext * ctx = data;
  NativeThreadFuncReturnType result;

  current_thread_id = gum_process_get_current_thread_id ();

  gum_script_ignore (current_thread_id);

  result = ctx->thread_func (ctx->thread_data);

  g_object_unref (ctx->interceptor);
  g_slice_free (FridaAutoInterceptContext, ctx);

  gum_script_unignore (current_thread_id);

  return result;
}
Esempio n. 2
0
static void
_gum_tls_key_del_tmp_value (GumTlsKey key)
{
  guint i;
  GumThreadId tid = gum_process_get_current_thread_id ();

  gum_spinlock_acquire (&_gum_tls_tmp_keys_lock);

  for (i = 0; i != MAX_TMP_TLS_KEY; i++)
  {
    if (_gum_tls_tmp_keys[i].tid == tid && _gum_tls_tmp_keys[i].key == key)
    {
      memset (&_gum_tls_tmp_keys[i], 0, sizeof (_gum_tls_tmp_keys[i]));
      break;
    }
  }
  g_assert (i < MAX_TMP_TLS_KEY);

  gum_spinlock_release (&_gum_tls_tmp_keys_lock);
}
Esempio n. 3
0
static void
gum_on_thread_realize (void)
{
  GumInternalThreadDetails * details;
  guint i;

  gum_interceptor_ignore_current_thread (gum_cached_interceptor);

  details = g_slice_new (GumInternalThreadDetails);
  details->thread_id = gum_process_get_current_thread_id ();
  details->n_cloaked_ranges =
      gum_thread_try_get_ranges (details->cloaked_ranges,
          GUM_MAX_THREAD_RANGES);

  gum_cloak_add_thread (details->thread_id);

  for (i = 0; i != details->n_cloaked_ranges; i++)
    gum_cloak_add_range (&details->cloaked_ranges[i]);

  /* This allows us to free the data no matter how the thread exits */
  g_private_set (&gum_internal_thread_details_key, details);
}
Esempio n. 4
0
static gpointer
_gum_tls_key_get_tmp_value (GumTlsKey key)
{
  guint i;
  GumThreadId tid = gum_process_get_current_thread_id ();
  gpointer value = NULL;

  gum_spinlock_acquire (&_gum_tls_tmp_keys_lock);

  for (i = 0; i != MAX_TMP_TLS_KEY; i++)
  {
    if (_gum_tls_tmp_keys[i].tid == tid && _gum_tls_tmp_keys[i].key == key)
    {
      value = _gum_tls_tmp_keys[i].value;
      break;
    }
  }

  gum_spinlock_release (&_gum_tls_tmp_keys_lock);

  return value;
}
Esempio n. 5
0
static void
_gum_tls_key_set_tmp_value (GumTlsKey key,
                            gpointer value)
{
  guint i;
  GumThreadId tid = gum_process_get_current_thread_id ();

  gum_spinlock_acquire (&_gum_tls_tmp_keys_lock);

  for (i = 0; i != MAX_TMP_TLS_KEY; i++)
  {
    if (_gum_tls_tmp_keys[i].tid == 0)
    {
      _gum_tls_tmp_keys[i].tid = tid;
      _gum_tls_tmp_keys[i].key = key;
      _gum_tls_tmp_keys[i].value = value;
      break;
    }
  }
  g_assert (i < MAX_TMP_TLS_KEY);

  gum_spinlock_release (&_gum_tls_tmp_keys_lock);
}