使用ptrace时,attach的子进程钟代码执行的有点懵逼

IT保安 IT保安 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
刚刚接触ptrace,百度了一些资料,主要是写个测试代码,自己将代码敲了出来,然后在虚拟机里慢慢玩。

主要问题是:
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;
}
...全文
评论
收藏 已收藏
分享
返回顶部
IT保安
Linux/Unix社区 23,224 成员 74,535 内容