记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

动态的注入共享库到android平台的运行进程中

2015-05-06 14:10

动态的注入共享库到android平台的运行进程中

如果你了解windows的动态注入,那么肯定会熟悉CreateRemoteThread这个api。CreateRemoteThread可以调用LoadLibrary动态的将dll进程的运行地址空间中。

不幸的是linux平台没有一个类似于CreateReomteThread的系统调用或接口,那么要做到同样的效果就只有依赖ptrace和我们万能的大脑了。要动态注入第一步要解决的就是aslr的问题。

绕过aslr:

当调用ptrace的时候,我们的首要任务就是获得所需要的函数的地址,比如:

  • dlopen
  • dlsym(如果想远程调用注入库的函数)
  • calloc/malloc (在进程中开辟内存空间)
  • free (释放内存空间)

众所周知,一个给定的函数在不同的进程中相对于基地址的偏移是相同的。我们可以通过分析/proc/-pid-/maps文件来得到目标进程的基地址。

知道了当前进程和远程进程的基地址,由于偏远相同,又知道当前进程的地址,所以就可以得到远程进程的地址。

获得远程地址的代码如下:

arm的call规范:

接下来,我们怎样才能让进程执行我们注入的函数呢? 待小生慢慢道来。首先来了解下call的规范。

arm中的call, 用r0-r3 来传递call的前4个参数,如果有更多参数用堆栈来传递。call所调用的地址保存在pc(r15)中,返回地址保存在r14中,返回值保持在r0中。

详细arm语法规范说明,请看官移步这里:http://www.xipiter.com/uploads/2/4/4/8/24485815/arm_lab_manual_sample.pdf

接下来要做的事如下:

  • 用PTRACE_GETREGS来保存当前进程的所有寄存器。
  • 把需要的参数分别赋值给R0-R3, 如果需要可以push 栈。
  • 把返回地址R14赋值为0, 这样在调用完返回时可以被捕捉到这个异常,来判断函数的执行结束。
  • R15赋值函数的地址,(由前面得出的远程地址)
  • 根据当前模式(thumb 或者arm)来设定pc 和 cpsr.
  • 用PTRACE_SETREGS来更新寄存器。
  • 用PTRACE_CONT来触发函数调用,等待接受异常(第3步提到的返回地址为0的异常)
  • 从R0得到函数的返回。
  • 恢复寄存器状态到第一步之前。

具体实现如下:

把以上的代码组合下:

  •  得到需要的地址
  • 用远程函数中的malloc/calloc把动态库名复制到远程进程地址空间中。
  • 用远程函数中的dlopen来加载动态库。
  • 如果需要可以用dlsym

一旦你可以动态注入远程进程,就可以做很多事了,比如,api hook/tracing,  进程监控, 内存打补丁等。

arminject地址:https://github.com/evilsocket/arminject

参考链接:

http://www.evilsocket.net/2015/05/01/dynamically-inject-a-shared-library-into-a-running-process-on-androidarm

知识来源: www.jianzhen-lab.com/617.html

阅读:108138 | 评论:0 | 标签:文章 注入 Android

想收藏或者和大家分享这篇好文章→复制链接地址

“动态的注入共享库到android平台的运行进程中”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云

本页关键词