Beispiel #1
0
FridaHostProcessInfo *
frida_system_enumerate_processes (int * result_length)
{
  GArray * processes;
  FridaImageData no_icon;
  GDir * proc_dir;
  const gchar * proc_name;

  static struct
  {
    procfs_debuginfo    info;
    char                buff [PATH_MAX];
  } procfs_name;

  processes = g_array_new (FALSE, FALSE, sizeof (FridaHostProcessInfo));
  frida_image_data_init (&no_icon, 0, 0, 0, "");

  proc_dir = g_dir_open ("/proc", 0, NULL);
  g_assert (proc_dir != NULL);

  while ((proc_name = g_dir_read_name (proc_dir)) != NULL)
  {
    guint pid;
    gchar * tmp = NULL, * name;
    gint fd;
    FridaHostProcessInfo * process_info;

    pid = strtoul (proc_name, &tmp, 10);
    if (*tmp != '\0')
      continue;

    tmp = g_build_filename ("/proc", proc_name, "as", NULL);
    fd = open(tmp, O_RDONLY);
    g_free (tmp);
    g_assert (fd != -1);

    g_assert (devctl (fd, DCMD_PROC_MAPDEBUG_BASE, &procfs_name,
      sizeof (procfs_name), 0) == EOK);

    name = g_path_get_basename (procfs_name.info.path);

    g_array_set_size (processes, processes->len + 1);
    process_info = &g_array_index (processes, FridaHostProcessInfo, processes->len - 1);
    frida_host_process_info_init (process_info, pid, name, &no_icon, &no_icon);

    g_free (name);
  }

  g_dir_close (proc_dir);

  frida_image_data_destroy (&no_icon);

  *result_length = processes->len;

  return (FridaHostProcessInfo *) g_array_free (processes, FALSE);
}
Beispiel #2
0
FridaHostProcessInfo *
frida_system_enumerate_processes (int * result_length1)
{
  GArray * processes;
  FridaImageData no_icon;
  GDir * proc_dir;
  const gchar * proc_name;

  processes = g_array_new (FALSE, FALSE, sizeof (FridaHostProcessInfo));
  frida_image_data_init (&no_icon, 0, 0, 0, "");

  proc_dir = g_dir_open ("/proc", 0, NULL);
  g_assert (proc_dir != NULL);

  while ((proc_name = g_dir_read_name (proc_dir)) != NULL)
  {
    guint pid;
    gchar * tmp = NULL;
    gchar * name;
    FridaHostProcessInfo * process_info;

    pid = strtoul (proc_name, &tmp, 10);
    if (*tmp != '\0')
      continue;

    tmp = g_build_filename ("/proc", proc_name, "exe", NULL);
    name = g_file_read_link (tmp, NULL);
    g_free (tmp);

    if (name == NULL)
      continue;

    tmp = g_path_get_basename (name);
    g_free (name);
    name = tmp;

    g_array_set_size (processes, processes->len + 1);
    process_info = &g_array_index (processes, FridaHostProcessInfo, processes->len - 1);
    frida_host_process_info_init (process_info, pid, name, &no_icon, &no_icon);

    g_free (name);
  }

  g_dir_close (proc_dir);

  *result_length1 = processes->len;
  return (FridaHostProcessInfo *) g_array_free (processes, FALSE);
}
FridaHostProcessInfo *
frida_system_enumerate_processes (int * result_length1)
{
  GArray * processes;
  DWORD * pids = NULL;
  DWORD size = 64 * sizeof (DWORD);
  DWORD bytes_returned;
  guint i;

  processes = g_array_new (FALSE, FALSE, sizeof (FridaHostProcessInfo));

  do
  {
    size *= 2;
    pids = (DWORD *) g_realloc (pids, size);
    if (!EnumProcesses (pids, size, &bytes_returned))
      bytes_returned = 0;
  }
  while (bytes_returned == size);

  for (i = 0; i != bytes_returned / sizeof (DWORD); i++)
  {
    HANDLE handle;

    handle = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, pids[i]);
    if (handle != NULL)
    {
      WCHAR name_utf16[MAX_PATH];
      DWORD name_length = MAX_PATH;

      if (get_process_filename (handle, name_utf16, name_length))
      {
        gchar * name, * tmp;
        FridaHostProcessInfo * process_info;
        FridaImageData * small_icon, * large_icon;

        name = g_utf16_to_utf8 ((gunichar2 *) name_utf16, -1, NULL, NULL, NULL);
        tmp = g_path_get_basename (name);
        g_free (name);
        name = tmp;

        small_icon = _frida_image_data_from_process_or_file (pids[i], name_utf16, FRIDA_ICON_SMALL);
        large_icon = _frida_image_data_from_process_or_file (pids[i], name_utf16, FRIDA_ICON_LARGE);

        g_array_set_size (processes, processes->len + 1);
        process_info = &g_array_index (processes, FridaHostProcessInfo, processes->len - 1);
        frida_host_process_info_init (process_info, pids[i], name, small_icon, large_icon);

        frida_image_data_free (large_icon);
        frida_image_data_free (small_icon);

        g_free (name);
      }

      CloseHandle (handle);
    }
  }

  g_free (pids);

  *result_length1 = processes->len;
  return (FridaHostProcessInfo *) g_array_free (processes, FALSE);
}