OS X получает аргументы удаленного ввода процесса иногда терпит неудачу

я хотел бы получить входные аргументы удаленного процесса программно,
поэтому я использовал sysctl следующим образом (частичный код):

int    mib[3]
mib = {CTL_KERN, KERN_ARGMAX,0,0}

size = sizeof(argmax);
if (sysctl(mib, 2, &argmax, &size, NULL, 0) == -1) {
goto ERROR_A;
}
procargs = (char *)malloc(argmax);

mib = {CTL_KERN,KERN_PROCARGS2,pid,0}

size = (size_t)argmax;
if (sysctl(mib, 3, procargs, &size, NULL, 0) == -1) {
printf("a");
goto ERROR_B;
}

Однако я не работаю для всех процессов.
Вот рабочий случай:

/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared

но приведенный ниже случай не удался на «sysctl (mib, 3, procargs, &размер, NULL, 0) «.
хотя я успешно получил командную строку, используя ‘ps ax PID’ из терминала

0   655   501   0 10:55AM ttys008    0:00.02 login -pfl zohar81 /bin/bash -c exec -la bash /bin/bash

возможно, вы можете сказать мне, почему вызов sysctl с KERN_PROCARGS2 не удался во втором примере?

Спасибо

1

Решение

Я обнаружил, что в OS X процессу предоставляется доступ к KERN_PROCARGS2 для всех процессов, когда владельцем исполняемого файла является root и исполняемый файл имеет включенный флаг SUID (set-uid). Единственное исключение — PID 0 (kernel_task), но у него даже нет аргументов.

Вы можете сделать это для своего файла, используя:

chmod u+s myprogram
sudo chown root:wheel myprogram
# now my program should be able to make get KERN_PROCARGS2 for all processes
./myprogram
1

Другие решения


По вопросам рекламы [email protected]