下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

详解Android开源如何渗透测试框架Drozer中的反射交互机制教程

作者:课课家教育     来源: http://www.kokojia.com点击数:868发布时间: 2016-05-05 15:11:31

标签: Android反射Android虚拟机安卓

  对很多对计算机不熟悉的朋友来说,可能提到反射时第一反应应该是生理的神经反射,但是这里的反射是计算机的一种处理方式,它也是程序可以访问、检测和修改它本身状态或行为的一种能力。而程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。那么本文主要是介绍安卓开源渗透测试框架Drozer中的反射交互机制。

  一、简介

  Drozer是MWR Labs开发的一款开源Android渗透测试框架。它能够通过自身实现的协议,与Android虚拟机进行交互。一个良好的框架,也能够使得我们根据自身的需求,从而进行定制化的拓展模块开发,这样能够打造出更为强大的Drozer。

  二、Drozer的基本架构

  从本质上看,Drozer是一个C/S架构的程序。Drozer安装在PC端上可以处理用户的各种操作,且能将这些操作按照一定的格式进行封装,发送到手机端。手机端的Agent在收到请求后,可对请求进行解包,然后执行请求,并将结果返回到Drozer端。

  三、Drozer与Agent的交互

  Drozer使用了google的protobuf作为序列化数据交换的格式。在protobuf中,我们可以看到Drozer的消息格式,其中部分如下:

Drozer的消息格式

  Message描述了,Drozer与Agent交互中的消息的完整格式,也是protobuf对消息进行序列化和反序列化的依据。

  如图可见,消息的类型有REFLECTION_REQUEST、SYSTEM_REQUEST、SYSTEM_RESPONSE、REFLECTION_RESPONSE等四种。本文关注第三种,REFLECTION_REQUEST,即反射请求消息。

  据我们所知,Drozer是可以进行模块扩展的。然而Drozer的模块扩展可分为两类,分别是Python模块和dex模块,python模块是运行在PC端;dex模块在运行时会由Drozer端经protobuf协议传送到android端运行。这里面存在一个通过python调用android模块的机制。Drozer所采用的方法是:由控制端(Drozer)发送指定格式的请求到Agent。Agent对请求进行解析,使用反射机制,对dex模块进行调用。这也是Android端的程序被命名为Agent的原因。通过python调用dex模块的请求的类型即为REFLECTION_REQUEST。

  对于和一个特定设备的连接会话,Drozer使用一个具有唯一session_id的Session来标识。Drozer端和Agent端都会维护一个session的集合SessionCollection,其中包含了所有的已连接设备。Session的结构如下:

Session的结构

  其中session_id唯一标识一个session,也使得我们可以向多个受控设备发送消息。device是设备相关信息,而console则是与session关联的控制台。

  使用Drozer的类来处理Drozer端的所有消息,这个类通课过其中的frameReceived函数来将所有的消息分发到指定的handler或forwarder。该类位于drozerp.py中。

frameReceived函数

  如下图所示,Drozer的消息是封装在Frame中的,Frame中的payload便是没有经过序列化的Message。

Message

  无论是本地发送,还是远程接收的消息,这些都是以Frame形式封装,然后统一进入Drozer类进行分发处理。

  发送REFLECTION_REQUEST的代码位于reflection_request_forwarder.py中的handle方法,这个方法的主要功能是检查参数和异常处理,且这个方法最终会调用session中的write方法将序列化的消息写入指定的session中。而消息的构造位于ReflectionRequestFactory类中,该类用于根据特定的调用类型,构造指定的消息。消息的类型有:

eflectionRequestFactory

  很容易看出,从名称上就能够看出这些请求类型的意义。它们囊括了一个对象生命周期中的各种主要操作。通过这些操作,我们可以控制一个对象。而实际上,这些方法在ReflectionRequestFactory中都有一个对应的方法,这便是工厂类的作用。

  Drozer反射机制的核心在于其ReflectedType机制。Drozer将要反射调用的对象分为array,binary,object,primitive,string,null等类型,这些类均单独表示继承ReflectedType的类。ReflectedType中可实现了根据不同类型,将不同的反射请求分发到指定的反射类中。这些继承自ReflectedType的反射类,在其内部使用“映射”的方式,实现了将远程的各种对象映射到本地的方法,在这些类中实现了该对象所支持的操作,使得我们在使用反射操作远程对象时,就像操作本地对象一样。

Drozer反射机制的

  而在Agent端中,每一个session都有一个由SparseArray实现的对象池。它用来存储远程反射调用在本地生成的对象。

SparseArray

  每一个session中都需要设置ReflectionMessageHandler,当接收到REFLECTION_REQUEST时,该消息会被分发到ReflectionMessageHandler进行处理。而ReflectionMessageHandler实际上是一个对对象池进行操作的工具类:

ReflectionMessageHandler

  根据接收到消息的具体类型,从而决定执行不同的操作,而且要返回结果。重要的是,这里的对象池到drozer端的映射对于ARRAY和OBJECT类型是一一对应的,对于Agent端的对象,都有一个唯一的object reference被“映射”到drozer端,以保证能够操作正确的对象。而对于PRIMITIVE(内置)类型等简单类型,则是直接通过反射进行操作。

  四、总结

  实际上来说,使用Drozer,这是利用了一种简单的代理对象的思想。使用protobuf作为通信协议,将对象映射到远程,由代理实际控制对象。在drozer端的控制接口的抽象,使我们能够像操作本地对象一样操作远程对象。

  五、实例

  下面我们来单步跟踪一个命令的执行过程,了解一下反射调用的机制。

  run app.package.info –a (package name)命令为列出一个指定包的基本信息。

  键入命令后,程序会对命令行进行解析。如下:

程序会对命令行进行解析

  当命令被成功解析后,程序便会根据我们需要的功能将指令派发到特定的模块之中。然后调用模块的execute方法。

execute方法

  执行时,经过一系列的参数检查等过程,就来到了消息构造的过程。在此处,我们的程序调用到resolve方法。

resolve方法

  实际上,该请求由工厂方法处理并生成。

  该调用的反射类型为对象类型,

调用的反射类型

  最终到达本命令的功能执行处,

到达本命令的功能

  消息发送前,会由Frame进行封装:

Frame进行封装

  执行成功后,会再次发送反射请求,销毁对象。

发送反射请求

  需要注意的一个重点是,执行一个简单命令,通常都会有多次的反射调用,对象的生成、方法调用、获取(设置)属性、销毁对象等一系列的过程,都会生成反射调用,这个过程实际上与本地对象的生命周期相一致。

     我们再来总结一下上文,上文主要是Drozer的基本内容,简单介绍了Drozer的基本架构和Drozer与Agent的交互,在第五点使用案例详细介绍Android开源渗透测试框架Drozer中的反射交互机制,有几点是重要的,在小结这里就不一一列出来了,有兴趣的话看回原文,加深记忆。

赞(11)
踩(2)
分享到:
华为认证网络工程师 HCIE直播课视频教程