基本上標題,我無法讓它作業,我也找不到它不應該作業的任何理由。
ptrace(2)的手冊指出需要 Linux 5.3 并且我正在運行 Linux 5.17.4,以下簡化代碼編譯時沒有任何警告,在檢測每個系統呼叫時運行時沒有任何錯誤,但syscall_info.op始終具有價值PTRACE_SYSCALL_INFO_NONE。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <sys/user.h>
#include <syscall.h>
#include <sys/ptrace.h>
#include <linux/ptrace.h>
#include <sys/errno.h>
int main(int argc, char **argv) {
pid_t pid = fork();
switch(pid) {
case -1:
//error...
case 0:
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execvp(argv[1], argv 1);
//error...
}
waitpid(pid, NULL, 0);
ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_EXITKILL);
struct ptrace_syscall_info syscall_info;
size_t size = sizeof(syscall_info);
while(1) {
if(ptrace(PTRACE_SYSCALL, pid, NULL, NULL) == -1) {
//error...
}
if(waitpid(pid, NULL, 0) == -1) {
//error...
}
// syscall entry
if(ptrace(PTRACE_GET_SYSCALL_INFO, pid, (void *)size, &syscall_info) == -1) {
//error...
}
/* syscall_info.op is always PTRACE_SYSCALL_INFO_NONE
instead of PTRACE_SYSCALL_INFO_ENTRY */
if(ptrace(PTRACE_SYSCALL, pid, NULL, NULL) == -1) {
//error...
}
if(waitpid(pid, NULL, 0) == -1) {
//error...
}
// syscall exit
if(ptrace(PTRACE_GET_SYSCALL_INFO, pid, (void *)size, &syscall_info) == -1) {
if(errno == ESRCH) {
exit(syscall_info.exit.rval);
}
//error...
}
/* Same here, should be PTRACE_SYSCALL_INFO_EXIT but still
is PTRACE_SYSCALL_INFO_NONE */
}
}
過去 3 天一直在谷歌搜索,我無法找到太多來驗證我是否正確使用它或任何解釋為什么這不應該作業的帖子。我甚至研究了strace的源代碼,看看他們是如何做到的,我所能找到的只是幾個宏測驗是否PTRACE_GET_SYSCALL_INFO首先支持,但不知道這些測驗是什么。如果除了內核版本之外還有某些標準,PTRACE_GET_SYSCALL_INFO為什么它們沒有在手冊中列出?
uj5u.com熱心網友回復:
經過一番挖掘,您似乎必須啟用PTRACE_O_TRACESYSGOOD選項PTRACE_SETOPTIONS才能從PTRACE_GET_SYSCALL_INFO.
此要求似乎沒有記錄在案。目前尚不清楚這是有意的還是內核錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484764.html
