Системные вызовы Catching Mach с использованием dtruss
Я запустил dtruss на vmmap, который считывает виртуальную память другого удаленного процесса.
Я ожидаю, что некоторые системные вызовы mach_port появятся в выводе моей команды, но не смогут отследить их (например, mach_vm_read, task_for_pid и т. Д.)
Точная команда, которую я выполнил (обратите внимание, что dtruss является сценарием оболочки dtrace в OS-X):
sudo dtruss vmmap <pid_of_sample_process>
Входной аргумент для vmmap - это просто pid любого запущенного процесса, и используемая мной версия ОС - 10.10 (в 10.11 есть проблема с правами при запуске dtruss для продуктов Apple, таких как vmmap).
Возможно, кто-то может сказать мне, как определить системный вызов, который я ищу... Должен ли я искать явное имя в выводе dtruss или просто общий номер вызова желаемого системного вызова (к сожалению, я не нашел ни одного из их):
./bsd/kern/trace.codes:0xff004b10 MSG_mach_vm_read
1 ответ
Мне кажется, что он не использует Mach API. Он использует интерфейс libproc. Я вижу много proc_info()
системные вызовы, которые стоят за библиотечными вызовами, как proc_pidinfo()
,
Я использовал:
sudo dtrace -n 'pid$target::proc_*:entry {}' -c 'vmmap <some PID>'
отследить различные вызываемые функции libproc. Я вижу звонки proc_name()
, proc_pidpath()
, а также proc_pidinfo()
чтобы получить информацию о целевом процессе, а затем звонит proc_regionfilename()
получить информацию о регионах ВМ.
Кстати, vmmap
не читает память другого процесса, он просто сообщает информацию об областях виртуальной машины, а не их содержимое. Так что я не ожидал увидеть mach_vm_read()
или т.п.