首页
社区
课程
招聘
PTRACE注入失败问题
发表于: 2021-2-25 23:26 8897

PTRACE注入失败问题

2021-2-25 23:26
8897

本人安卓小白最近在研究ptrace注入的过程中发现
ptrace(PTRACE_GETREGS, pid, NULL, data);这句代码会执行失败

1
2
3
4
5
6
7
8
9
10
11
12
static int GetRegs(pid_t pid, struct pt_regs *data) {
    int res=0;
 
    res = ptrace(PTRACE_GETREGS, pid, NULL, data);
    if (res < 0) {
        LOGE("<injectso.c:%d> getregs failed:%s\n", __LINE__, strerror(errno));
 
        return -1;
    }
 
    return res;
}

打印错误提示为:

 

<injectso.c:74> getregs failed:Device or resource busy
请大牛解惑!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (8)
雪    币: 10693
活跃值: (7607)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
你是安卓注入吗?安卓的X64如下
int ptrace_getregs(pid_t pid, struct pt_regs * regs)      
{
       int regset = NT_PRSTATUS;
       struct iovec ioVec;
       
       ioVec.iov_base = regs;
       ioVec.iov_len = sizeof(*regs);
       
    if(ptrace(PTRACE_GETREGSET, pid, (void*)regset, &ioVec) < 0) 
       {      
        LOGD("ptrace_getregs failed\n");      
        return -1;      
    }      
      
    return 0;    
}  
2021-2-26 00:28
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
bluefish蓝鱼 你是安卓注入吗?安卓的X64如下 int ptrace_getregs(pid_t pid, struct pt_regs * regs)       { int regset = NT_PR ...

安卓的x86,雷电模拟器

最后于 2021-2-26 21:17 被hekes编辑 ,原因:
2021-2-26 00:34
0
雪    币: 29
活跃值: (5647)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
代码没问题,看一下执行这个函数前你的目标进程是否成功进入了tracing stop状态
2021-2-26 13:47
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不吃早饭 代码没问题,看一下执行这个函数前你的目标进程是否成功进入了tracing stop状态

先进行的附加,附加是成功的

ptrace(PTRACE_ATTACH, pid, NULL, NULL)
adb查看TracerPid值不为0
cat /proc/2240/status|grep TracerPid
TracerPid:      0
aosp:/ # cat /proc/2240/status|grep TracerPid
cat /proc/2240/status|grep TracerPid
TracerPid:      2277


整套代码是网上找的

int WaitPid(pid_t pid, int *status, int option) {
   while (waitpid(pid, status, option) == -1) {
      if (errno == EINTR) 
         continue;
      else
         return -1;
   }

   return 0;
}

// wrap PTRACE_ATTACH call, don't need WaitPid result maybe because we default think it's ok.
static int Attach(pid_t pid) {
   int res=0;
   int status=0;

   res = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
   if (res < 0) {
      LOGE("<injectso.c:%d> attach failed:%s\n", __LINE__, strerror(errno));

      return -1;
   }
   WaitPid(pid, &status, 0);
    LOGE("WaitPid status:%d,test:%d\n",status,WIFSTOPPED(status));
   return res;
}


2021-2-26 21:16
0
雪    币: 29
活跃值: (5647)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
hekes 先进行的附加,附加是成功的ptrace(PTRACE_ATTACH, pid, NULL, NULL)adb查看TracerPid值不为0 ca ...

不只是trace上,还要把attach上的线程stop下来,很简单的道理,如果线程还在执行中,那么寄存器和堆栈都是处于未知状态的,获取到的值也是无意义的。因此attach上去之后必须要把被trace线程stop下来,可以通过发送SIGSTOP信号等方式将其暂停下来

最后于 2021-2-26 21:33 被不吃早饭编辑 ,原因:
2021-2-26 21:30
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不吃早饭 hekes 先进行的附加,附加是成功的ptrace(PTRACE_ATTACH,&nbsp;pid,&nbsp;NULL,&nbsp;NU ...
ptrace(PTRACE_ATTACH, pid, NULL, NULL);

附加进程后,调用SIGSTOP

kill(pid, SIGSTOP);

让进程暂停,app界面卡死,无法操作

此时调用GETREGS

res = ptrace(pid&data)(res < ) {
   (__LINE__strerror(errno))-}

当调用SIGCONT后恢复,界面可正常点击

kill(pid, SIGCONT);

运行后GETREGS还是失败

2021-2-26 22:56
0
雪    币: 29
活跃值: (5647)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
hekes ptrace(PTRACE_ATTACH,&nbsp;pid,&nbsp;NULL,&nbsp;NULL);附加进程后,调用SIGSTOPkill(pid,&nbsp; ...
stop后当然会卡住,在完成注入前不要恢复执行
2021-2-26 23:07
0
雪    币: 0
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
骗子!
2022-6-30 23:50
0
游客
登录 | 注册 方可回帖
返回
//