android里面本身如果这个进程有相应的权限,是可以给别的进程注入自己设计好的so的。


注入的整体思路如下:


1. 关联到目标进程;
简单的调用ptrace(PTRACE_ATTACH,...)即可以关联到目标进程,但此后我们还需调用waitpid()函数等待目标进程暂停,以便我们进行后续操作。详见中给出的ptrace_attach()函数。
2. 发现装载共享库的函数;一般是_dl_open调用,我们将使用它装载我们的.so共享库
通过遍历动态连接器使用的link_map结构及其指向的相关链表,我们可以完成_dl_open的符号解析工作;
3. 装载指定的.so;
由于在2中我们已经找到_dl_open的地址,所以我们只需将此函数使用的参数添入相应的寄存器,并将进程的eip指向_dl_open即可,在此过程中还需做一些其它操作,具体内容见中的call_dl_open和ptrace_call函数。
4. 做我们想做的,一般是通过函数重定向来完成我们需要的功能;
我们需要做的仅仅是找到相关的函数地址,用新函数替换旧函数,并将旧函数的地址保存。其中涉及到了PLT和RELOCATION,关于它们的详细内容你应该看ELF规范中的介绍,在中的函数中有PLT和RELOCATION的相关操作,而且在最后的例子中,我们将实现函数重定向。关于函数重定向,相关资料很多,这里不再多介绍。
5. 脱离进程;
简单的调用ptrace(PTRACE_DETACH,...)可以脱离目标进程。


上面很好的将so注入的过程进行了阐述,是一个整体的思路,当然里面还有很多的细节,以及相应的理论知识的补充。

今天还有点事情,先记录到这里,等有空了再根据源码将详细的过程和步骤说一下 呵呵