我正在按照这里的教程,并修改了一些x86-64 (基本上取代eax rax等),以便它编译:
#include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <sys/user.h> #include <sys/reg.h> #include <unistd.h> int main() { pid_t child; long orig_eax; child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME,NULL,NULL); execl("/bin/ls","ls",NULL); } else { wait(NULL); orig_eax = ptrace(PTRACE_PEEKUSER,child,4 * ORIG_RAX,NULL); printf("The child made a " "system call %ldn",orig_eax); ptrace(PTRACE_CONT,NULL); } return 0; }
但它并不像预期的那样工作,它总是说:
The child made a system call -1
代码有什么问题?
C ++:如何在编译时encryptionstring?
如何使线程同步,而不使用互斥,semorphore,spinLock和futex?
如何获得给定过程的窗口站?
移到较大的显示器时,窗口不能正确resize
lib OSMesa屏幕上下文创build在C ++中失败,但仅在静态链接时才会失败
Windows服务中的关键事件处理C#
原始套接字不发送
GPG自动解密密码传递
如何识别安装程序文件?
C交叉编译链接extern声明为静态?
ptrace用errno EIO返回-1,因为你要读取的内容没有正确对齐。 从ptrace手册中获取:
PTRACE_PEEKUSER Reads a word at offset addr in the child's USER area,which holds the registers and other information about the process (see <sys/user.h>). The word is returned as the result of the ptrace() call. Typically the offset must be word-aligned,though this might vary by architecture. See NOTES. (data is ignored.)
在我的64位系统中,4 * ORIG_RAX不是8字节对齐的。 尝试使用值为0或8,它应该工作。
在64位= 8 * ORIG_RAX
8 = sizeof(长)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。