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直播授课