Ptrace学习(1)

跟随玩转ptrace的文章跑示例的时候提示出错。


代码:

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> 
/* For constantsORIG_EAX etc */
int main()
{
pid_t child;longorig_eax;
child =fork();
if(child ==0)
{
ptrace(PTRACE_TRACEME,0,NULL,NULL);
execl("/bin/ls","ls",NULL);
}
else{wait(NULL);
orig_eax =ptrace(PTRACE_PEEKUSER,child,4*ORIG_EAX,NULL);
printf("The child made a system call %ld\n",orig_eax);
ptrace(PTRACE_CONT,child,NULL,NULL);
}
return0;
}


error: linux/user.h: No such file or directory

error: ‘ORIG_EAX’ was not declared in this scope


因为作者给的示例是32位系统下的。移到64位上要进行如下修改。

A。把linux/user.h换成sys/reg.h。

B。ORIG_EAX改为ORIG_RAX。因为ORIG_EAX寄存器在64位下对应的是ORIG_RAX。

C。4*ORIG_EAX  修改为 =》8*ORIG_RAX   因为现在是64位寄存器。


该示例是使用了PTRACE_PEEKUSER参数的ptrace函数,

从用户内存空间的栈顶指针开始往回偏移,找到ORIG_EAX(64位下是ORIG_RAX)里存放的系统调用号。偏移量就是寄存器号*寄存器宽度。

示例的系统调用是execve


执行结果:

32位下是:The child made a system call 11

64位下是:The child made a system call 59

这是因为execve系统调用号在32位和64位下的值不同。

具体可以查看/usr/include/asm/unistd.h下的execve的定义。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shim ptrace是一个用于操作进程的系统调用接口。它允许一个进程跟踪、控制和检查另一个进程的执行情况。通过shim ptrace,一个进程可以检查另一个进程的寄存器、内存和系统调用,并有能力修改它们的执行过程。 shim ptrace通常用于调试、监视和诊断进程。调试器可以使用shim ptrace来实现断点、单步执行和修改变量等调试功能。另外,shim ptrace还可以用于分析和检查进程的运行,例如查找进程中的内存泄漏、跟踪系统调用和信号处理。 在使用shim ptrace时,一个进程可以作为被跟踪进程,另一个进程则作为跟踪进程。跟踪进程使用ptrace系统调用来发送指令,而被跟踪进程则接收并执行指令。通过这种方式,跟踪进程可以获取被跟踪进程的状态信息,并对其进行操作。 对于被跟踪进程,它会在指令执行之前接收到跟踪进程发送的指令,并根据指令的要求进行操作。例如,跟踪进程可以用ptrace(PTRACE_PEEKDATA, pid, addr, data)来读取被跟踪进程中地址为addr的内存数据,并将结果保存在data中。类似地,跟踪进程也可以使用ptrace(PTRACE_POKEDATA, pid, addr, data)来修改被跟踪进程的内存值。 总之,shim ptrace是一个强大的工具,允许进程间相互跟踪、控制和修改执行过程。它在调试、监视和诊断进程方面扮演着重要角色,为开发人员提供了有效的方法来分析和改进程序的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值