#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_SUCCESS3. Я только что проверил, и возвращаемое значение 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>
. Я не знаю, существует ли существующая функция для поиска числовых значений и печати для них удобочитаемого имени константы.