由于工作上的需要,之前只是对大概的原理了解,现对此进行详细的分析。
涉及到的关键API以及数据结构:
1. ptrace
PTRACE_ATTACH:挂载到指定的pid进程上
PTRACE_GETREGSET:读取目标进程的寄存器
PTRACE_POKETEXT:复制一个word的数据
PTRACE_PEEKTEXT:复制一个word的数据
PTRACE_SETREGSET:设置寄存器
PTRACE_CONT:指定pid进程继续执行
2. waitpid
WUNTRACED:当指定pid进程暂停后,返回
3. struct iovec
向量元素,主要提供给readv和writev系统调用进行使用
4. mmap
5. __libc_dlopen_mode
6. __libc_dlsym
获取指定符号的地址
7. __libc_dlclose
8. /proc/pid/maps
查看每一个so的内存加载地址
9. 设置关键寄存器
sp:堆栈寄存器
pc:程序执行寄存器
cpsr:
lr:函数返回地址
r0:存储函数返回值寄存器