用于Android App安全检测Drozer工具安装使用教程

 更新时间:2016年9月20日 19:58  点击:1914
drozer是一款针对Android系统的安全测试框架,可以帮助Android app和设备变得更安全,其提供了很多Android平台下的渗透测试exploit供你使用和分享,本文我们来讲讲Drozer工具安装使用。

最近接到任务,让了解一下几款Android安全测试相关的软件,首先是Drozer。Drozer是一款综合的安全评估和攻击的android框架,据 产品介绍 里说,Drozer可以全面评估app的安全性,并帮助团队把app的安全风险保持在可控范围内。
使用方法

1、在 mwrinfosecurity 公司的这个网页上,提供了社区版本的下载(没错,还有收费的高级版),下载并安装之。并保证android的adb环境已经配置好,即cmd中输入adb devices不会报错。并在手机端安装下载包中的Agent.apk的包。

2、在PC端开启转发

adb forward tcp:31415 tcp:31415

adb forward tcp:31415 tcp:31415

3、在手机端打开安装好的apk程序。

4、在PC上开启Drozer console

drozer console connect

drozer console connect

这样,就进入了 dz> 的console界面,后面就参照说明书一步一步进行测试。
功能介绍

dz> run app.package.list -f example

dz> run app.package.list -f example
 

list命令用以列出所有包含“example”的手机中已安装package名称,记住目标应用的完整名称。

dz> run app.package.info -a com.example

dz> run app.package.info -a com.example
 
info命令用以通过完整名称,获取该package的详细信息,比如data路径、apk路径、声明的权限等等。

dz> run app.package.attacksurface com.example

dz> run app.package.attacksurface com.example

attacksurface即攻击面分析,分析Activity/Broadcast Receiver/Content Provider/Service的权限,即是否能被其他的的应用程序调用。会像下列示例一样列出数量:

    Attack Surface:
    3 activities exported
    0 broadcast receivers exported
    2 content providers exported
    2 services exported
    is debuggable

dz> run app.provider.info -a com.example

dz> run app.provider.info -a com.example
 

获取provider的信息,比如是否需要额外权限来读写app的数据库,等等。如果找到相关漏洞,就可以通过

dz> run scanner.provider.finduris -a com.example

dz> run scanner.provider.finduris -a com.example
 

来扫描一些可用的uri,比如userName、password、ID之类的,甚至可以修改值(如SQL注入什么的):

dz> run app.provider.query content://xxxxxx --preinjection "xxx"

dz> run app.provider.query content://xxxxxx --preinjection "xxx"
 

dz> run scanner.provider.injection -a com.example

dz> run scanner.provider.injection -a com.example

进行简单的SQL注入检查、文件遍历检查之类的。

其他:

service相关

查询service

dz> run app.service.info -a com.example

dz> run app.service.info -a com.example

shell.start

在设备上启动一个可交互的linux shell

tools.file.upload / tools.file.download

在android设备上上传/下载文件

tools.setup.busybox / tools.setup.minimalsu

往设备上安装busybox和minimalsu

其他功能

在收费版本中,Drozer还提供了攻击面的可视化界面,并在多设备支持、模拟传感器输入等方面进行了探索,但是介于收费功能,没有继续看下去。

总结

在测试app的安全性上,Drozer确实可以发挥一些作用,不过关键问题还是要了解Android app的整体结构和安全策略,才能游刃有余,而不是见招拆招,被动的很。

Smart Phones Dumb Apps是一款用perl语言开发的脚本集,可以分析android和分析iphone app的功能,下面我们来简单介绍一下。

这个是一个脚本集,可以帮助分析者分析app的安全性,用perl语言开发。由于只是一些脚本,所以用起来可能没那么智能,没有GUI界面,也不会有“优雅”的分析结果。所以基本上,就是类似“aapt加强版”的脚本。由于加入了分析android和分析iphone app的功能,所以用处的话还是有一些的。

项目地址 [GoogleCode] https://code.google.com/p/smartphonesdumbapps/
如何打不开就翻墙吧,唉

主要功能

Android

    解包apk;
    解码manifest.xml(用axml2lxml);
    获取app需要的权限;
    获取app的截屏(根据 Android manifest);
    反编译DEX,通过解析DEX来检查文件权限等;
    查找URL,主机名以及一些网络路径。

Iphone App

    解包iPhone IPA file或者破解XYZ.app/文件夹;
    把.plist转成XML以供浏览;
    通过查看.plist XMLs来查找app定义的一些URL;
    查找URLs,主机名和一些网络路径。

相关内容

Smart Phones Dumb Apps这个脚本集的初衷在于“智能手机意外丢失,‘别有用心’的人通过你的app都能获取到什么信息”这个假设来的(想必是有类似惨痛经历),所以内容是在分析AndroidManifest.xml、res/文件夹中的其他XML文件、classes.dex 这个DEX的二进制文件,通过这些文件,都能看到什么信息,或者有什么隐含的攻击点。

在解码xml文件的时候,用到了 axml2xml,在解DEX的时候,用的是 dedexer,都是比较常用的工具。之后,通过 dex2jar 转换成可读的java代码。

通过以上几步,攻击者甚至可以看到许多程序的数据流程、调用方式、调取的第三方服务等敏感信息,通过一些分析,就能得到程序的薄弱点并加以攻击。

当然,这个只提供了前面解析的部分,攻击的事还是得交给metasploit之类的来……

最新更新了Android 5.0 的 SDK ,发现附带的工具比如uiautomatorviewer时提示“‘-v’ 不是内部或外部命令,也不是可运行的程序”,杯具了,幸好可以有google,问题终于解决。

作为日常工作,常常要使用Android SDK附带的hierarchyviewer、uiautomatorviewer、ddms等工具,刚好碰上Android L发布,并且更新了Android Stutio 1.0,SDK也伴随着进行了大幅度更新,包括uiautomatorviewer等在内的工具都有了新版本。于是昨天下了新版本过来,安装上去,接着重新设置了环境变量等一系列东西,然后打开uiautomatorviewer,竟然提示出错:

    ‘-v’ 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    无效路径
    ERROR: SWT folder ” does not exist.
    Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.

莫非是我环境配置有问题?Google了一下,发现大部分答案都是让设置ANDROID_SWT的环境变量,或者吧jdk移动到PATH的第一个云云的奇怪办法,所以试了半天放弃了,还是安心调试调试看看咋回事。

把uiautomatorviewer.bat的第一行@echo off加冒号”:”注释掉,然后运新一下,看输出:

C:Usersxxx.xxx>rem Copyright (C) 2012 The Android Open Source Project ...... C:Usersxxx.xxxAppDataLocalAndroidsdktools>rem Check we have a valid Java.exe in the path. C:Usersxxx.xxxAppDataLocalAndroidsdktools>set java_exe= C:Usersxxx.xxxAppDataLocalAndroidsdktools>call libfind_java.bat SWT folder '' does not exist. Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.

C:Usersxxx.xxx>rem Copyright (C) 2012 The Android Open Source Project
......
C:Usersxxx.xxxAppDataLocalAndroidsdktools>rem Check we have a valid Java.exe in the path.
C:Usersxxx.xxxAppDataLocalAndroidsdktools>set java_exe=
C:Usersxxx.xxxAppDataLocalAndroidsdktools>call libfind_java.bat
SWT folder '' does not exist.
Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
 

运行到call libfind_java.bat这一行出问题鸟~~

接着摸出来find_java.bat,注释掉第一行的 @echo off,看输出:

...... for /F "delims=" %a in ('"C:Usersxxx.xxxAppDataLocalAndroidsdktoolslibfind_java32 .exe" -s') do set java_exe=%a ......

......
for /F "delims=" %a in ('"C:Usersxxx.xxxAppDataLocalAndroidsdktoolslibfind_java32 .exe" -s') do set java_exe=%a
......
 

find_java32 .exe是什么鬼……

打开find_java.bat的代码,可以看到27行这里

for /f "delims=" %%a in ('"%~dps0find_java%arch_ext%.exe" -s -w') do set javaw_exe=%%a

for /f "delims=" %%a in ('"%~dps0find_java%arch_ext%.exe" -s -w') do set javaw_exe=%%a
 

就是本尊了,往上翻到arch_ext:

find /i "x86" > NUL && set arch_ext=32 || set arch_ext=64

find /i "x86" > NUL && set arch_ext=32 || set arch_ext=64
 

那个空格应该是这里了,可能是工程师们java写多了,bat里手也瓢了,把前后的空格去掉试试~~

find /i "x86" > NUL && set arch_ext=32||set arch_ext=64

find /i "x86" > NUL && set arch_ext=32||set arch_ext=64
 

关掉cmd,重新打开,新版的uiautomatorviewer出现鸟~~接着测试一下其他需要用到call libfind_java.bat的工具(tools里的几乎都要用吧),都没问题了。

Android开发有时我们要将干突然类库打包成jar方便合作协同的人调用,现在我们来谈谈Android如何打包Jar的常见问题及解决方案。

在Android开发过程中,我们经常会有这种需求,需要将自己开发一个类库打包成jar包以供他人(其他人一般指开发者)调用,而不是直接打包apk文件供最终用户使用。在打包成jar后,你往往会自己先测试一下看jar包能不能直接使用,这时就会常常有如下的几个问题:

1) Error…..Found duplicate file for APK:res/drawable-xxx/xxx.xx

2) res.Resources$NotFoundException:XXX ID#0x7f090015

3) java.lang.NullPointerException

4) java.lang.NoClassDefFoundError: com.xxx.xxx.R$layout

几个问题常见的原因是因为资源文件在作怪。

在第一个问你中,资源文件被打包进jar,在目标使用project中,也有相同id的资源文件,引起了冲突,解决方案是别打包资源文件啦,打包进去也不用的,后面会提到。或许你提到可能改变src project(提供jar包的project)里面的资源id可以表面上解决这个问题。

不打包资源文件,但src project中又引用了res的资源文件,即便你把相应的layout的xml啊String.xml啊等copy到目标project中,也会造成如res.Resources$NotFoundException或者java.lang.NullPointerException,原因是在src中的一些activity调用xml中的资源时,控件id找不到,例如一个btn = findViewById(R.id.btnXXX);这个btn为空,就会NullPointerException.这个问题原因还是在stackoverflow上有人给出了合理的解释.

As you want to import the resources,Since Android makes R class automatically with resources files under /res folder, using R class as final static is impossible.in your source code which will be exported in jar file, DON’T USE R variable because it will be replaced with final static memory address in compile time. Instead of using R use method below……

src项目中导出src文件夹成jar,不包含资源文件,资源文件copy到要引用的的其他项目中,但src中不能通过R.id.XXX 获取xml中的布局等。因为打包成class的时候,final int 等死了(具体可以看看gen/xxx.xx.R.java),在新项目中是不对应的。解决方案就是用反射的方法.代码如下.
   
public static int getResourseIdByName(String packageName, String className, String name)
{
    Class r = null;
    int id = 0;
    try
    {
        r = Class.forName(packageName + ".R");

        Class[] classes = r.getClasses();
        Class desireClass = null;

        for (int i = 0; i < classes.length; i++)
        {
            if (classes[i].getName().split("$")[1].equals(className))
            {
                desireClass = classes[i];
                break;
            }
        }

        if (desireClass != null)
            id = desireClass.getField(name).getInt(desireClass);
    } catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    } catch (IllegalArgumentException e)
    {
        e.printStackTrace();
    } catch (SecurityException e)
    {
        e.printStackTrace();
    } catch (IllegalAccessException e)
    {
        e.printStackTrace();
    } catch (NoSuchFieldException e)
    {
        e.printStackTrace();
    }

    return id;

}

然后利用int id = getResourceIdByName(context.getPackageName(), “layout”, “main”);获取layout文件夹下main.xml的配置layout,通过int id = getResourceIdByName(context.getPackageName(), “string”, “text1″);获取string.xml下key为text1的字符串,通过int id = getResourceIdByName(context.getPackageName(), “id”, “btn”)获得id为btn的控件等。这个代码利用反射运行时找的。
当然具体应用过程中你可以根据上面的这个方法重构一下去掉循环找配置而修改成单独的一些id(key),dimen(key),color(key)之类的方法.这里就不便(工作需要)将源码给出当然也没必要给出了.

网上说使用library方法加载资源文件可以解决,即将src project作为library,目标project引用src project.然后说这个方法解决了通过R.XX.XX获取资源的问题,但还有一个问题是不可能把这个源码发布出去让其他人使用。我试了试,在我的项目中貌似通过R.XX.XX获取的控件仍然为null,让人会报空指针异常。

但这个给我提供了一个思路解决了一个比较方便的提供SDK的方式。因为上面的提到的那种需要手动copy layout等xml文件.如果利用library的话可以避免copy这个操作。具体方案就是,同样src project打包成lib.jar,然后自己手动建一个library project作为中间project,这个project添加lib.jar并将相应的xml文件copy到此project.如下图中的nebula_sdk,然后再发布nebula_sdk这个项目给其他人用,这样既满足了功能需求同样也使代码不易泄漏(打包过程仍然可以使用一定的代码混淆技术).

新建一个类库项目,如命名nebula_sdk.



发布出去后,开发者需要将上面提到的nebula_sdk作为library引用进来。如下图.

clip_image006

因此得到了两种android下发布sdk方案:

生成jar,发布jar包同时提供layout xml等配置资源文件.这也是现在很多sdk发布的方式,比如一下广告的SDKdomob_android_sdk,统计分析的SDK等.

生成jar包,先将library project并将此library project发布出去.这个方法可以省了让开发者copy 资源文件这一个过程.

当然如果src project中只涉及图片之类的(R.drawable.xx)文件(不涉及通过R.ID.xxx得到布局等控件)的话也可以按照网上所说的方法把图片copy到assert目录下然后通过File IO的方式获取原本应该放在drawable下的资源文件.当然如果涉及布局等控件外,还有另外一个解决方案然后布局的话可以用硬coding的方式编码(不读取xml布局),不过这个应该比较繁琐吧。

在学Android开发时,自己开发了一个实现自动定时切换飞行模式的功能,这个功能作用应该不大,不过也是为了学习。

整个功能要实现的话思路很清晰,只要改变一下系统配置(System.AIRPLANE_MODE_ON),发送一个通知即可。但发现Android的权限设置没有以前那么开放了。从Android 4.2开始(SDK API 17),设备的这些属性是只读的,官网上说:

Some device settings defined by Settings.System are now read-only. If your app attempts to write changes to settings defined in Settings.System that have moved to Settings.Global, the write operation will silently fail when running on Android 4.2 and higher.

所以对于Android4.2及其以上版本的手机来说就悲剧了~

刚开始在代码里面试图去修改System.AIRPLANE_MODE_ON 的属性,UI上貌似没有什么反映,log看到说缺少android.permission.WRITE_SECURE_SETTINGS 权限,在manifest里面声明,eclipse 又编译不过提示 Permission is only System Apps,说是必须得是系统应用才行。网上也有讨论各种解决方案,有说要写成系统应用,需要一个跟固件一起打包编译或者跟固件有相同的签名才行。同样也有人说通过反射可以实现。第一种方式应该很麻烦,得下某源码包编啊之类的,第二种方案有人说可以尝试下,但具体我也没试~不知道是否靠谱。

后来的后来,还是从网上找到了解决方案,不过device必须得root,不然没办法搞定。原文来自这里,虽然不知道是哪国语言~但代码还是认识。

//开启飞行模式
settings put global airplane_mode_on 1
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
//关闭飞行模式
settings put global airplane_mode_on 0
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

通过adb shell,输入以上两句命令,可以将切换飞行模式。核心问题解决了~剩下的就是需要通过Java代码去调用shell命令,这个不难~不过得注意需要通过root去调用,另外得防止程序卡死~

再后来在stackoverflow上也有人提到了这个解决方案,并且还给了另外一个解决方案,即通过sqlite去直接改变Android的系统配置。数据库位置在/data/data/com.android.providers.settings/databases/settings.db

sqlite3 /data/data/com.android.providers.settings/databases/settings.db
insert into global values(null, 'airplane_mode_on', 1); //相应的插入0值,即是取消飞行模式

当然上面的数据库修改之后要生效,还是必须得发上面的那个broadcast才能生效。

下面是我写的小程序的界面:

android自动切换飞行模式

使用方法如下:

分别设定好需要开启、关闭飞行模式的时间,默认情况下为凌晨12点30分开启飞行模式,早上7点关闭飞行模式。然后打开当前状态的按钮即可,打开后会提示下次切换飞行模式的时间。

设定的时间到之后,App会自动尝试去启用飞行模式状态,如上图第二副图所示,当然得允许了(最好添加到信任程序列表,不然每次弹框)。另外,设定的时间到之后,有可能你还正在使用手机而不想马上切换飞行模式,App会给你5s的时间考虑,5秒之后你没有操作,app就会自动启用飞行模式了。当然你取消之后,这次就不会切换了,不过当你通过按手机返回键(Home键不会)或者杀掉这个进程再重新启动这个App的时候,会根据时间设定满足规则则自动切换。

切换”关闭”状态即取消设定功能,若当前手机正处于飞行模式状态,也会切换为正常状态。

注意:针对Android4.2及其以上的版本,手机需要ROOT才OK,且建议添加到信任程序列表。4.2之前的版本是木有问题的。

欢迎有兴趣的同学下载1 下载2试用,有建议/意见欢迎留言反馈~

TODO:

Android 各个版本UI风格的统一

增加多个时间段的设置,支持晚上睡觉和中午睡觉都转飞行模式,既省电又防打扰

自己写着瞎玩,应该有不少Bug

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • 安全地关闭MySQL服务的教程

    普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysql入门的同学们共享:)正确方法是,进入mysql的bin目录下,然后执行./mysqladmin -uroot -p shut...2015-11-24
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • 用Intel HAXM给Android模拟器Emulator加速

    Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20
  • Android判断当前屏幕是全屏还是非全屏

    在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20