Я пытаюсь использовать ptrace.h для отслеживания создания новых процессов в двоичном. Я намерен разрешить только создание одного процесса (что в будущем я также буду отслеживать, что он может написать). < /P>
Чтобы контролировать программу, я написал следующий код: < /p>
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
if (argc != 2) {
return 1;
}
struct user_regs_struct regs;
int pid_parent = fork(), status_pai;
char buffer_pai[0x1000];
int pid_child = -1, status_filho;
char buffer_filho[0x1000];
int current_pid = - 1, new_pid, current_status, new_status;
if (pid_parent == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl(argv[1], argv[1], NULL);
}
waitpid(pid_parent, &status_pai, 0);
// Track all kinds of clone
ptrace(PTRACE_SETOPTIONS, pid_parent, 0,
PTRACE_O_TRACESYSGOOD | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK |
PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC);
ptrace(PTRACE_SYSCALL, pid_parent, 0, 0);
int flag_fork = 1, pending_exits = 1;
while (pending_exits) {
current_pid = waitpid(-1, ¤t_status, __WALL);
if (WIFEXITED(current_status) || WIFSIGNALED(current_status)) {
pending_exits--;
continue;
}
if (current_status >> 8 == (SIGTRAP | (PTRACE_EVENT_FORK > 8 == (SIGTRAP | (PTRACE_EVENT_VFORK > 8 == (SIGTRAP | (PTRACE_EVENT_CLONE 2) {
puts("Fork overflow");
exit(1);
}
ptrace(PTRACE_SYSCALL, current_pid, 0, 0);
}
return 0;
}
< /code>
Программа, которую я использовал для тестирования, - это следующее: < /p>
#include
#include
int main() {
if (!fork()) {
fork();
}
return 0;
}
< /code>
В этом случае, после того, как родительский вил, ребенок только будет распахваться. Когда я запускаю эту программу отслеживания с первым, я получил следующий вывод: < /p>
[1337] j3r3mias@serenity > ./tracker example
Parent pid: 2605006 - Child pid: 0
Current pid: 2605006 - New pid: 2605007
Parent forked for the first time.
Parent pid: 2605006 - Child pid: 0
Current pid: 2605007 - New pid: 2605008
Проблема с трекером заключается в том, что PID_CHILD даже после обновления после родительской вилки показывает значение 0 во втором взаимодействии while . Являются ли какие -либо различия в состоянии программы при использовании PTRACE < /code>? 2.39-0ubuntu8.4
[*] Версия ядра: 5.15.167
Я пытаюсь использовать ptrace.h для отслеживания создания новых процессов в двоичном. Я намерен разрешить только создание одного процесса (что в будущем я также буду отслеживать, что он может написать). < /P> Чтобы контролировать программу, я написал следующий код: < /p> [code]#include #include #include #include #include #include #include #include #include #include
int main(int argc, char **argv) { if (argc != 2) { return 1; }
struct user_regs_struct regs; int pid_parent = fork(), status_pai; char buffer_pai[0x1000]; int pid_child = -1, status_filho; char buffer_filho[0x1000]; int current_pid = - 1, new_pid, current_status, new_status;
} < /code> Программа, которую я использовал для тестирования, - это следующее: < /p> #include #include
int main() {
if (!fork()) { fork(); } return 0; } < /code> В этом случае, после того, как родительский вил, ребенок только будет распахваться. Когда я запускаю эту программу отслеживания с первым, я получил следующий вывод: < /p> [1337] j3r3mias@serenity > ./tracker example
Parent pid: 2605006 - Child pid: 0 Current pid: 2605006 - New pid: 2605007 Parent forked for the first time.
Parent pid: 2605006 - Child pid: 0 Current pid: 2605007 - New pid: 2605008 [/code] Проблема с трекером заключается в том, что PID_CHILD даже после обновления после родительской вилки показывает значение 0 во втором взаимодействии while . Являются ли какие -либо различия в состоянии программы при использовании PTRACE < /code>? 2.39-0ubuntu8.4 [*] Версия ядра: 5.15.167
Я пытаюсь использовать ptrace.h для отслеживания создания новых процессов в двоичном. Я намерен разрешить только создание одного процесса (что в будущем я также буду отслеживать, что он может написать).
Чтобы контролировать программу, я написал...
Я пытаюсь написать трассировщик для любой программы на языке C, который отображает все вызываемые функции. Вот пример:
$./tracer toto.out
+ Entering main at 0x123456789
'I am in Toto's main'
+ Entering toto at 0x123456AAA
'I am in toto'
+ Entering...
Я пытаюсь написать приложение, которое будет порождать дочерний процесс под другим родительским процессом, а также получать его выходные данные. В основном это будет файл explorer.exe того же пользовательского контекста, что не должно вызывать...