微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在x86-64上玩ptrace?

我正在按照这里的教程,并修改了一些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 举报,一经查实,本站将立刻删除。

相关推荐