使用ptrace时,attach的子进程钟代码执行的有点懵逼
刚刚接触ptrace,百度了一些资料,主要是写个测试代码,自己将代码敲了出来,然后在虚拟机里慢慢玩。
主要问题是:
1.既然子进程里调用execl会令内核挂起子进程,并通知调试进程,那么调试进程在干完活之后,放开对子进程的控制。按我的理解,此时子进程的代码流程就应该由被挂起的execl开始向下继续执行。
可是我在控制台中看到了由execl函数执行的"ls"命令的输出,却无法看见printf的输出,也就说明了子进程此时应该是挂起的哦,只有在控制台中手动输入ctrl+c结束掉进程。
这就有点不理解啊,为何子进程没有按代码流程向下执行呢?求解答
主要问题是:
1.既然子进程里调用execl会令内核挂起子进程,并通知调试进程,那么调试进程在干完活之后,放开对子进程的控制。按我的理解,此时子进程的代码流程就应该由被挂起的execl开始向下继续执行。
可是我在控制台中看到了由execl函数执行的"ls"命令的输出,却无法看见printf的输出,也就说明了子进程此时应该是挂起的哦,只有在控制台中手动输入ctrl+c结束掉进程。
这就有点不理解啊,为何子进程没有按代码流程向下执行呢?求解答
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/user.h>
#include <sys/syscall.h>
#include <time.h>
#include <string.h>
int main()
{
pid_t pidChild = 0;
long orig_rax;
int status;
int iscalling = 0;
struct user_regs_struct Regs;
pidChild = fork();
if(pidChild == 0)
{
ptrace(PTRACE_TRACEME,0,NULL,NULL);
execl("/bin/ls","ls",NULL);
printf("child exit!\r\n"); //
}else if(pidChild != -1) //parent
{
wait(&status);
if(WIFEXITED(status))
{
return 0;
}
/* ptrace(PTRACE_GETREGS,pidChild,NULL,®s);
printf("EAX == %llx,EBX == %llx,ECX == %llx,ESP == %llx\r\n",Regs.rax,Regs.rbx,Regs.rcx,Regs.rsp);
ptrace(PTRACE_CONT,pidChild,NULL,NULL);*/
ptrace(PTRACE_DETACH,pidChild,NULL,NULL);
sleep(4); //wait 4 secs,let son_process run
}
printf("exit!\r\n");
return 0;
}
...全文
相关推荐
letmedebug:禁用ptrace的PT_DENY_ATTACH-修补ptrace系统调用
PT_DENY_ATTACH是一个ptrace标志,用于防止其他进程通过ptrace进行附加调试。当一个进程在其启动时或运行过程中设置这个标志,任何试图使用ptrace进行附加的尝试都将失败。
Linux源码分析(ptrace)
区别在于,当使用`PTRACE_CONT`时,进程将继续运行,直到遇到下一个信号;而使用`PTRACE_SYSCALL`时,进程将暂停在每次系统调用的入口和出口处,这对于调试系统调用相关的代码非常有用。
ptrace安卓程序注入例子
**获取目标进程**:使用`ptrace(PTRACE_ATTACH, pid, 0, 0)`附加到目标进程。
PTRACE函数代码分析
然而,由于其深度级别的操作,使用时需要谨慎,以免对系统稳定性造成影响。对于那些想要深入理解操作系统内核和进程交互的开发者来说,Ptrace是一个不可多得的学习和研究对象。
ptrace注入实例
通过学习和实践ptrace注入实例,我们可以增强对系统级编程的理解,同时也需要注意其潜在的安全风险,并合理使用。


