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); }
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); }