1.前言
Linux hook技术一直是linux技术爱好者们研究的一个热点问题,Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3, ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之,以此类推。
拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。
Linux的hook一般发生在ring0和ring3层,其中ring0层通常是hook Linux系统调用表中的系统调用,而ring3层则一般hook的动态链接库中的函数,接下来我们将会分类讨论。
2.ring3 hook
2.1inject
当我们需要hook某个应用程序时,我们需要往目标程序中添加自己的代码,这种添加代码的方式就被称之为inject,inject方式又一般分为两种:
动态注入
静态注入
所谓静态注入就是在程序还未运行时,去修改其so文件,以达到注入函数的目的,由于没具体研究过,所以此处仅提一下,有兴趣的同学可以看一些这个项目,而动态注入一般是使用ptrace来实现的,一般流程为: