macOS vm_read API кажется неустойчивым (такого процесса нет)

#macos #memory #kernel #mach

#macos #память #ядро #mach

Вопрос:

У меня есть некоторый код на C, вызывающий Mach vm_read API для извлечения одного или нескольких слов из памяти другого процесса. Иногда я могу заставить его работать (компиляция с подписью кода и запуск sudo ), но в других случаях я получаю ошибку ядра «нет такого процесса», хотя процесс остается неизменным. Является ли эта неустойчивость известной проблемой?

Фрагмент кода ниже. Это не работает ( vm_read возвращает 1), но выглядит идентично коду, который был в прошлом:

 size_t PTR_SIZE = sizeof(void*);
size_t size = PTR_SIZE;

char* rbuffer = malloc(size);

vm_offset_t buffer_pointer;
mach_msg_type_number_t data_cnt;

kernret = vm_read(task, (vm_address_t)start_addr, size, amp;buffer_pointer, amp;data_cnt);
 

Комментарии:

1. Как вы получаете task портвейн, и действительно ли он действителен?

2. @pmdj Использует task_for_pid(mach_task_self(), pid, amp;task) и получает KERN_SUCCESS

3. Я только что проверил, и возвращаемое значение Mach равно 1 KERN_INVALID_ADDRESS , так что я не уверен, откуда вы получаете «нет такого процесса»? Я предполагаю, что ваша start_addr ценность может быть неправильной? Кроме того, обратите внимание, что rbuffer в вашем коде это не используется, поэтому я надеюсь, что вы не ожидаете появления каких-либо данных в этой памяти. (для чтения в существующий буфер памяти используйте vm_read_overwrite() )

4. @pmdj Большое спасибо. Я позвонил perror("vmread") , и мне ответили: «Такого процесса нет». Я проверю start_addr . Да, позже у меня будет вызов memcpy, но, возможно, я воспользуюсь vm_read_overwrite() .

5. perror() работает с errno которым полностью отдельно от кодов возврата Mach. Последние определены в <mach/kern_return.h> . Я не знаю, существует ли существующая функция для поиска числовых значений и печати для них удобочитаемого имени константы.