Ptrace in Solaris - PullRequest
       9

Ptrace in Solaris

2 голосов
/ 15 июля 2011

Я пытаюсь портировать программу, которая использует ptrace из linux в solaris, но не повезло, так как жалуется, что sys/ptrace.h не найден. Есть идеи как его портировать?

Ответы [ 3 ]

4 голосов
/ 15 июля 2011

По крайней мере, в системе Solaris, к которой у меня есть доступ, man ptrace говорит, что включает

#include <unistd.h>
#include <sys/types.h>

для доступа к прототипу и константам ptrace. Тем не менее, есть примечание об использовании, в котором говорится, что ptrace доступен только с 32-битным libc, и что вместо этого 64-битные клиенты должны использовать отладочные интерфейсы / proc, поэтому я не уверен, как далеко вы это добьетесь.

1 голос
/ 15 июля 2011

Некоторые, например Solaris, вообще удалили ptrace как системный вызов, сохранив его как библиотечный вызов, который интерпретирует вызовы ptrace в терминах procfs платформы

http://en.wikipedia.org/wiki/Ptrace

Кроме того, похоже, что утилита strace недоступна в Solaris, вместо этого у них есть такая, которая называется truss, проверьте, есть ли она в вашей системе.

0 голосов
/ 19 октября 2014

РЕДАКТИРОВАТЬ: добавлены и удалены устаревшие данные о том, как связаться со мной и как я буду лицензировать код для вас

В итоге я использовал /proc/<pid>/ctrl и другие различные интерфейсы в /proc/<pid>, чтобы написать свою собственную библиотеку для выполнения ptrace() подобных вещей. К сожалению, этот интерфейс (по крайней мере, в то время) был помечен как небезопасный для непосредственного использования, мог измениться в любое время и т. Д., Но на практике он казался стабильным. Не знаю, изменилось ли это с тех пор, примерно в 2011 или около того, я думаю ...

Чтобы разработать базовую функциональность, эквивалентную ptrace, начните с:

man 4 proc

Используя интерфейс /proc/<pid>/ctrl, вы можете делать практически все (и даже больше), чем с ptrace, такие как чтение / запись памяти / регистры, присоединение / отсоединение, установка точек останова системного вызова и т. Д. И т. Д. С not слишком много работы, вы можете написать свой собственный API эмуляции ptrace. Это прототипы низкоуровневой части API, которую я написал:

procfs_ctl_PCSFAULT (pid_t pid, fltset_t * fltset);
procfs_ctl_PCWATCH (pid_t pid, prwatch_t * prwatch);
procfs_ctl_PCSTRACE (pid_t pid, sigset_t * sigset);
procfs_ctl_PCSEXIT (pid_t pid, sysset_t * sysset);
procfs_ctl_PCSENTRY (pid_t pid, sysset_t * sysset);
procfs_ctl_PCWSTOP (pid_t pid);
procfs_ctl_PCSVADDR (pid_t pid, long vaddr);
procfs_ctl_PCSTOP (pid_t pid);
procfs_ctl_PCWRITE (pid_t pid, off_t off, void *buff, size_t count);
procfs_ctl_PCTWSTOP (pid_t pid, long delay);
procfs_ctl_PCSCRED (pid_t pid, prcred_t * cred);
procfs_ctl_PCREAD (pid_t pid, off_t off, void *buff, size_t count);
procfs_ctl_PCSSIG (pid_t pid);
procfs_ctl_PCRUN (pid_t pid, long flags);
procfs_ctl_PCDSTOP (pid_t pid);
procfs_ctl_PCCSIG (pid_t pid);
procfs_ctl_PCCFAULT (pid_t pid);
procfs_ctl_PCKILL (pid_t pid, long signal);
procfs_ctl_PCSREG (pid_t pid, long lwpid, prgregset_t * regs);

Вероятно, вы видите, как легко было бы написать слой совместимости для ptrace поверх этих функций. Книга Solaris Internals была действительно полезна при этом - хотя глава, посвященная интерфейсу proc, была в значительной степени дословной копией справочных страниц, было бы неплохо быстро пролистать ее.

В конечном итоге, я не создал API, совместимый с ptrace. Я пропустил этот шаг и реализовал функции, которые выполняли функции гораздо более высокого уровня. В качестве примера кода высокого уровня, который использовал эти функции, основанные на /proc/<pid>/ctrl, ниже приведен список некоторых примеров высокоуровневых функций, которые я реализовал на основе этих низкоуровневых функций, которые демонстрируют все предоставляемые ими строительные блоки (почти все, как я уже говорил)

ПРИМЕЧАНИЕ. Они были разработаны для конкретной программы, которая должна выполнять экзотические / опасные / неподдерживаемые операции с работающим двоичным файлом (без символов), например находить ссылки на строки и адреса, находить и вызывать существующие функции, вводить и выполнять независимый от позиции код, перехватывать системные вызовы и изменять аргументы, читать возвращаемые значения и т. д., так что здесь довольно много странных функций.

Кроме того, те, которые связаны с поиском ссылок на строки и указатели, не очень хорошо написаны - они просто написаны так, чтобы они работали с приложением, с которым я работал. Вы должны действительно использовать что-то вроде настоящей библиотеки бинарного анализа для подобных вещей, но это только демонстрирует, насколько мощен интерфейс proc. Это было все для Solaris 9/10 SPARC. Примеры:

TrapPostSyscall (pid, SYS_dup);
SingleStep(pid,lwpid,flags);
AttachProcess (pid);
ContinueProcess (pid, PRCFAULT | PRCSIG | PRSABORT);
DetachProcess (pid);
GetFaultAddress(pid,1);
GetMainDataSection (pid, &datamap);
WhyStopped (pid, 1));
PrintRegisters(regs);
ReadGeneralRegisterSet (pid, 1, &saved_regs);
SetProgramCounter (pid, 1, mapping - 4);
StopProcess (pid);
TraceFault (pid, FLTWATCH);
TrapPostSyscall (pid, SYS_dup);
TrapPostSyscall (pid, SYS_execve);
TrapSyscallClearall (pid);
WaitForProcessStop (pid);
WatchMemory (pid, datamap.pr_vaddr, datamap.pr_size,WA_TRAPAFTER | WA_WRITE);
WriteGeneralRegisterSet (pid, 1, &saved_regs);
WriteToProcess (pid, mapping, call_pic, sizeof (call_pic));
ReadFromProcess (pid, prmap.pr_vaddr, buff, size);
GetIndividualRegister (pid, 1, R_O0, (long *) fd);
SetIndividualRegister (pid,1,R_O0,fd);
IsProcessStopped (pid);
SearchProcessForReference (pid, stringat);
SearchProcessMem (pid,needle,strlen(needle)+1);
GetPreviousSave (pid, SearchProcessForReference (pid, stringat));
GetMapFromVirtualAddress (pid, base, &prmap);
GetNextProcessMapping (pid, &prmap);
SearchProcessWordRef (pid, addr);
GetReadWriteExecMapping (pid);
CreateRemoteMapping (pid, NULL, PAGESIZE)
TrapSyscall (pid, SYS_dup);
TrapSyscallClearall(pid);
TrapPostSyscall (pid, SYS_dup);
TrapPostSyscallClearall (pid);

Если вы заинтересованы в этом, я могу разрешить GPL низкоуровневые или высокоуровневые вещи, и вы можете очень легко создать ptrace-совместимые обертки вокруг них. Отправьте мне записку, и я поделюсь с вами под GPLv2

...