最近时间比较充足,想找点事情来做做。再说Drozer这工具整天在手头用得着,只知其玄乎,又听大B哥说其架构是如何的NB。所以,就趁着这份热尽,体会了Drozer的神乎。确实挺神乎的,本人小菜一枚,求各位大神轻虐,在此放过了;如有想体会Drozer的神乎的朋友,在这抛砖引玉,不求感激,只求不坑了各位,哈哈、、、、
1. Drozer简介
Drozer是一个由MWR安全团队维护开源的软件,该软件可以说是针对Android平台的安全测试框架。安全人员可以通过Drozer自身提供的一些module完成一些基础的安全测试功能,同时也可以根据需求实现自己的module,甚至可以在利用Drozer提供的框架实现一些自动化审计功能。于目标设备上安装Agent,可以通过Agent接收PC端传来的指令或者代码并与Dalvik VM,其他app以及操作系统进行交互以达到某些安全审计功能。关于Drozer的源码可以从Github(https://github.com/mwrlabs)上获取:
drozer: 包含了控制台与服务端代码;
drozer-agent: 包含了运行于Android设备的Agent代码;
jdiesel:反射和通信协议的核心jar工程;
mwr-tls:安全通信jar工程;
mwr-android: 移动端界面jar工程;
2. Drozer通信协议
Drozer和Agent之间的通信采用google protocol buffer协议,这种协议是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。完整协议可以参见github(https://github.com/mwrlabs/mercury-common/blob/master/protobuf.proto)上的源码,该协议是两者协作的核心。
下面是对这个协议的简单介绍:
该协议中包含4种消息类型,其中包括SYSTEM_REQUEST、SYSTEM_RESPONSE、REFLECTION_REQUEST、REFLECTION_RESPONSE
message Message {
enum MessageType { SYSTEM_REQUEST= 1; SYSTEM_RESPONSE= 2; REFLECTION_REQUEST= 3; REFLECTION_RESPONSE= 4; } } |
---|
SystemRequest:包含设备信息,会话信息,连接控制
message SystemRequest {
enum RequestType { PING= 1; BIND_DEVICE= 2; UNBIND_DEVICE= 3; LIST_DEVICES= 4; START_SESSION= 5; STOP_SESSION= 6; RESTART_SESSION= 7; LIST_SESSIONS= 8; } required RequestType type = 1 [default = PING]; optional Device device = 5; optional string session_id = 7; optional string password = 8; } |
---|
SystemResponse:主要包括响应的类型(绑定服务,设备列表,会话列表等)状态信息
message SystemResponse {
enum ResponseType { PONG= 1; BOUND= 2; UNBOUND= 3; DEVICE_LIST= 4; SESSION_ID= 5; SESSION_LIST= 6; } enum ResponseStatus { SUCCESS= 1; ERROR= 2; } required ResponseType type = 1; required ResponseStatus status = 2; repeated Device devices = 6; optional string session_id = 7; optional string error_message = 8; repeated Session sessions = 9; } |
---|
ReflectionRequest:java反射请求,主要有Resolve(所反射的classname),Construct(对象引用ObjectReference(int32类型),方法对象method,和方法参数Argument),Invoke调用方法(同样包括对象引用ObjectReference(int32类型),方法对象method,和方法参数Argument),以及对Property的get与set,还有Delete(对象引用ObjectReference(int32类型))
message ReflectionRequest {
enum RequestType { RESOLVE= 1; CONSTRUCT= 2; INVOKE= 3; SET_PROPERTY= 4; GET_PROPERTY= 5; DELETE= 6; DELETE_ALL= 7; } required string session_id = 1; required RequestType type = 2; message Resolve { optional string classname = 1; } message Construct { optional ObjectReference object = 1; repeated Argument argument = 2; } message Invoke { optional ObjectReference object = 1; optional string method = 2; repeated Argument argument = 3; } message SetProperty { optional ObjectReference object = 1; optional string property = 2; optional Argument value = 3; } message GetProperty { optional ObjectReference object = 1; optional string property = 2; } message Delete { optional ObjectReference object = 1; } optional Resolve resolve = 3; optional Construct construct = 4; optional Invoke invoke = 5; optional SetProperty set_property = 6; optional GetProperty get_property = 7; optional Delete delete = 8; } |
---|
ReflectionResponse:主要是反射响应后的状态和参数,还有一些错误信息
message ReflectionResponse {
enum ResponseStatus { SUCCESS= 1; ERROR= 2; FATAL= 3; } required string session_id = 1; required ResponseStatus status = 2; optional Argument result = 3; optional string errormessage = 8; } |
---|
3. Drozer源码解析
由于Drozer存在很多命令,在源码中会存在很多分支路径,本文不打算全部分析,主要侧重点在于我们常用的命令(连接Agent,运行模块)代码的分析,一般处理指令如下:
drozer console connect
run module_name argv
下面的内容就这两类命令的执行流程进行源码分析。
3.1 Drozer consoleconnect命令执行过程
首先以drozer console connect为切入点。这条命令是Drozer端与Agent建立console会话。
Drozer端:
找到运行这条命令的入口点,入口点在drozer\cli\console.py
from mwr.common import logger from drozer.console import Console logger.setLevel(logging.DEBUG) |
---|