Hook

来源:互联网 发布:dts音效软件 编辑:程序博客网 时间:2024/04/30 15:41

一、Hook工作原理

Hook技术无论对安全软件还是恶意软件都是十分关键的一项技术,其本质是劫持函数调用。但是由于处于linux用户态,每个进程都有自己的独立进程空间,所以必须先注入到所要的Hook的进程空间,修改其内存中的进程代码,替换其过程表中的符号地址。在Android中一般是通过ptrace去附加进程,然后向远程进程注入so库,从而达到监控以及远程进程关键函数挂钩。

Hook技术的难点并不在于hook技术。如何找到切入点、替换函数,这就涉及理解函数的链接与加载机制。

二、Hook工作历程

首先需要定义问题。有两个问题:

1、如何注入代码

2、如何注入动态链接库

注入代码我们就需要解决两个问题。

1.我们需要注入的代码存在哪里?

2、如何注入代码?

注入动态共享库我们也需要解决两个问题

1、我们不能只在自己的进程载入动态链接库,如何使进程附着上目标进程?

2、如何让目标进程调用我们的动态链接库函数?

目前对上述问题的解决办法是:

对于进程附着,Android的内核中有一个函数叫ptrace,它能动态地attach(跟踪一个目标进程)、detach(结束跟踪一个目标进程)、peektext(获取内存字节)、poketext(向内存写入地址)等,他能够满足我们的需求。而Android的另外一个内核函数dlopen,能够以指定模式打开指定的动态链接库文件。对于程序的指向流程,我们可以调用ptrace让pc指向LR堆栈。最后调用,对目标进程调用dlopen则能够将我们希望注入的动态链接库注入到目标进程中。

对于代码的注入(Hook API),我们可以使用mmap函数分配一段临时的内存来完成代码的存放。对于目标进程的mmap函数地址与Hook API函数地址的寻找都需要通过目标进程的虚拟地址空间解析与ELF文件解析来完成,具体算法如下:

1、通过读/proc/<PID>/maps文件找到链接库的基地址。

2、读取动态库,解析ELF文件,找到符合(需要对ELF文件格式的深入理解)。

3、就算目标函数的绝对地址。

上面说了这么多,向目标进程中注入代码总结后的步骤分为以下几步:

1、用ptrace函数attach上目标进程。

2、发现装载共享库so函数。

3、装载指定的so。

4、让目标进程的执行流程跳转到注入的代码执行。

5、使用ptrace函数的detach函数释放目标进程。




1 0
原创粉丝点击