首页
社区
课程
招聘
[求助]ptrace(PTRACE_ATTACH, pid, 0, 0)
发表于: 2013-7-10 15:23 10465

[求助]ptrace(PTRACE_ATTACH, pid, 0, 0)

2013-7-10 15:23
10465
ptrace(PTRACE_ATTACH, pid, 0, 0)

若这行代码执行后,目标进程(pid)是否一定停止在系统调用那行代码上?????????

经我自己试验以及查看ptrace帮助,我认为应该是这样。

下面附上我的试验代码:

目标进程:

.data
hello:
.string "hello world\n"
.globl  main
main:
front:
movl    $4, %eax                      # $3, %eax
movl    $1, %ebx                      # $0, %ebx
movl    $hello, %ecx
movl    $12, %edx
int     $0x80
jmp          front
movl    $1, %eax
xorl    %ebx, %ebx
int     $0x80
ret

就是循环输出/读取字符串(输出是hello world;输入就是从标准输入读字符串)。

调试程序:
#include <stdio.h>

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
#include <sys/syscall.h>   /* For SYS_write etc */

#define ORIG_EAX 11
#define EBX 0
#define ECX 1
#define EDX 2
#define EAX 6

int main(int argc, char * argv[])
{   
        pid_t child;
        long orig_eax, eax;
        long params[3];
        int status;
        int insyscall = 0;

        if(argc < 2)
        {
                printf("need pid\n");
                return 0;
        }

        child = atoi(argv[1]);
        printf("try to attch pid [%d]\n", child);
        ptrace(PTRACE_ATTACH, child, 0, 0);

        int count = 20;
        while(count-- > 0)
        {
                wait(&status);
                printf("recv sig [%d]\n", WSTOPSIG(status));
                if(WIFEXITED(status))
                {
                        printf("子进程死了\n");
                        break;
                }
                struct user_regs_struct regs;
                ptrace(PTRACE_GETREGS, child, NULL, ®s);
                printf("EIP: %lx , orig_eax %lx, eax %lx\n", regs.eip, regs.orig_eax, regs.eax);

                printf("PTRACE_SYSCALL\n");
                ptrace(PTRACE_SYSCALL, child, NULL, NULL);

                printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
        }

        return 0;
}

运行结果(目标进程使用read系统调用的结果):
try to attch pid [9943]
recv sig [19]
EIP: 804a033 , orig_eax 3, eax fffffe00
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax 2
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 3, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

运行结果(目标进程使用write系统调用的结果):

try to attch pid [9953]
recv sig [19]
EIP: 804a033 , orig_eax 4, eax b
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax c
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

recv sig [5]
EIP: 804a033 , orig_eax 4, eax ffffffda
PTRACE_SYSCALL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

目标进程的反汇编:
Breakpoint 1 at 0x804a01d
(gdb) disassemble 0x804a01d
Dump of assembler code for function main:
   0x0804a01d <+0>:        mov    $0x4,%eax
   0x0804a022 <+5>:        mov    $0x1,%ebx
   0x0804a027 <+10>:        mov    $0x804a010,%ecx
   0x0804a02c <+15>:        mov    $0xc,%edx
   0x0804a031 <+20>:        int    $0x80
   0x0804a033 <+22>:        jmp    0x804a01d <main>
   0x0804a035 <+24>:        mov    $0x1,%eax
   0x0804a03a <+29>:        xor    %ebx,%ebx
   0x0804a03c <+31>:        int    $0x80
   0x0804a03e <+33>:        ret   
   0x0804a03f <+34>:        add    %al,(%eax)
End of assembler dump.

总结:
根据试验结果,查看EIP值,发现ptrace发送PTRACE_ATTACH后,就停在了系统调用上。

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
求非虫、古河等大大指教,给一个明确的答复。
2013-7-10 15:25
0
游客
登录 | 注册 方可回帖
返回
//