由於工作上的需要,之前只是對大概的原理了解,現對此進行詳細的分析。
涉及到的關鍵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:存儲函數返回值寄存器