hook - 拦截系统调用
本文是对大犇蒸米spark的安卓动态调试七种武器之离别钩 – Hooking的实践记录以及知识整理!原文请戳链接.
实现hook就离不开ptrace.
ARM上的系统调用
系统调用由SWI实现,即软件中断(Software Interrupt),在请求系统服务时造成的中断,由SWI指令造成异常从而切入特权模式,从而允许非特权模式访问特权模式的函数.
ARM中有两种系统调用方式: OABI(old application binary interface)和EABI(extended application binary interface).见(内核源码arch/arm/kernel/entry-common.S文件).
对于OABI: 通过跟随在swi指令后的调用号来进行. 1101 1111 vvvv vvvv -- SWI immed_8
(Thumb指令)格式)
对于EABI: 调用号存放在r7中. 1110 1111 0000 0000 -- SWI 0
(Thumb指令格式)
在 arm.pdf的 A4.1.107 SWI 和 A7.1.69 SWI 分别是对ARM和Thumb中SWI的描述.
所有的系统调用号在arch/arm/include/asm/unistd.h
文件.
所以在得到一条SWI指令时,要解析出系统调用号得分两种情况:
这里的源程序直接按ARM指令集处理了,没有做判断thumb的处理.
拦截系统调用
整个思路是:
使被调试程序在下次次调用系统函数前后停下(SYSCALL),这时调试程序对被调试进行操作(PTRACE_PEEKTEXT/PTRACE_GETREGS…),随后使被调试程序继续运行(SYSCALL),调试程序等待(wait).
被调试程序:
|
|
调试程序:
|
|
结果:
修改函数参数
修改printf的参数:字符串及其长度.
|
|