源码下载:https://github.com/mwrlabs/drozer;模块的源码位于src.drozer.modules,根据模块名来划分文件夹:

app、auxiliary、exploit、information、scanner、shell、tools。今天我们先分析app;以下PackageManagerService简称PMS。在分析模块原理之前稍微讲解下一些基础知识:

PackageInfo:包含app的一系列属性,对应于app的AndroidManifest.xml。可由PMS get,但get到的packageInfo中信息取决于get函数中的flags参数,见activity.info模块

Intents:在与drozer交互中时常需要构造intent,构造intent与adb中的命令有所不同,请”help intents”命令查看参数

Activity:

info:列出exported activity的信息,-a指定package;

指定package:      PMS.getpackageinfo(package,GET_ACTIVITIES)返回packageInfo; packageInfo.activities(包含package中所有activity,但只有GET_ACTIVITIES属性才会给packageInfo返回activities)

没有指定package:       PMS.getInstallPackages(GET_ACTIVITIES)  返回list<packageInfo>

PackageInfo.activities就是List<ActivityInfo>,根据ActivityInfo(父类是ComponentInfo->父类PackageItemInfo)的属性name、exported值来得到我们需要的activity。

start:启动activity

通过startActivity(intent)来启动,利用start的参数来构造intent

forintent:找出能处理特定intent的activity

利用forintent参数构造intent,然后PMS. queryIntentActivities(intent,flags)查找符合intent的activity,并显示package和activity的名称。

Broadcast:

Info:       列出exported broadcast的信息,-a指定package。

指定package:PMS.getPackageInfo(package,flags)    ,注意这次的flag包括broadcast和permission表示返回的packageInfo中包含broadcast和permission(但貌似中没用到package的permission哎,只用到broadcast的permission)

无指定package:PMS.getPackages(flag),返回list< packageInfo > 过滤Info参数后剩余的broadcast显示receiver和对应的permission

Send:     用intent启动广播

利用send参数来构造intent,然后sendBroadcast(intent)。

Sniff:  注册广播接收器接收特定的intent,源码位于:src.drozer.modules.common.RegisterReceiver.java。

加载一个类,类中包含broadcast的注册代码且broadcast的intentFilter参数是通过sniff参数构建出来的(service.send类同操作)。

Service:

info:列出exported service的信息

类同操作,通过PMS返回packageInfo,过滤参数后输出对应的service信息

start:用intent启动service-> startService(intent)

stop:用intent停止service

注意:使用的是Context().stopService这个api,上面startService()也是Context。

send:      绑定一个service并发送信息,如果service有返回信息会接收。  这是在不同app之间传递msg哦;但在这个send需要attcked app的配合。因为绑定service需要app的service在onbind()返回binder。这个有源代码在src.drozer.modules.common.ServiceBinder.java。需要注意的是参数 –bundle-as-obj它决定是否将bundle赋值给msg.obj;否则msg.setData(bundle)。再说一点,参数—extra的值由bundle来构造。

Package:

attacksurface:     列出package中可被attack的各组件的个数

实际上这条命令是列出package中exproted的组件;通过PMS get 到PacakgeInfo,再过滤出exproted的packageInfo。

backup:                列出使用backup的package

PMS get packageInfo,找到属性applicationInfo的FLAG_ALLOW_BACKUP对应位为1

debuggable:        列出可被调试的package

PMS get packageInfo,找到属性applicationInfo的FLAG_DEBUGGABLE对应位为1

info:                     列出设备上安装好的所有package的详细信息,但可使用参数来选定特定的package,详情”help”;PMS get到packageInfo(注意configuration flag),输出UID、gid、path等

launchintent:       列出package中launch intent的信息(可以获知main activity)

PMS的queryIntentActivities函数去get,但与activity.forintent不同的是,这里指定intent为ACTION_MAIN

list:                      列出设备上的所有的package(只有name),可指定参数;PMS get

manifest:                    列出package的manifest文件内容

创建package的context得到资源从中获取到manifest文件,然后利用XmlAssetReader读取信息并显示,代码位于(createPackageContext(package,0)??)src.drozer.modules.common. XmlAssetReader.java。

native:                 列出package包含的so文件

PMS get到packageInfo,然后得到application的apk地址(/data/app;为什么不直接去/data/app-lib/下找呢?),在文件地址下查找后缀名为”.so”的文件(源码位于src.drozer.modules.common.Native.java;在此我们也可以看到apk格式实际就是zip压缩)

shareduid:           列出共享uid的package

PMS getPackagesForUid(UID)去找到uid=UID的package

Provider:             主要的函数体执行在\common\provider.py

columns:       列出provider的列名

contentResolver去利用uri得到ContentProviderClient,client去负责query后直接getColumnNames

delete:          删除provider中符合参数的行

同上,ContentProviderClient去执行delete操作

download:    下载provider文件

首先getContentResolver()得到contentResolver,再利用uri得到

ContentProviderClient①,然后用client去读取provider并写到本地文件;若①失败,直接openInputStream(URI)来读取provider。

finduri:         列出package中的content uri

PMS get packageInfo,跟info命令没区别啊,但它只输出provider authority

info:              列出package中的详细信息

PMS get到packageInfo信息;注意不加-u参数输出的是exproted的provider;4.2之前provider默认是exproted。

insert:           在provider插入数据;同delete操作

query:           在provider查询;同delete操作

read:             从provider中读数据

与download命令相同,少了写数据到本地文件的操作,直接输出

update:         更新provider的数据;同delete操作

       在provider中,主要是利用contentResolver去操作。

我们看到上述模块用到功能都是PMS来完成的,实际代码:

getContext().getPackageManager().getPackageInfo()èApplicationPackageManager.getPackageInfo():

public PackageInfo getPackageInfo(String packageName, int flags)

104            throws NameNotFoundException {

105        try {

106            PackageInfo pi = mPM.getPackageInfo(packageName, flags, mContext.getUserId());

107            if (pi != null) {

108                return pi;

109            }

110        } catch (RemoteException e) {

111            throw new RuntimeException("Package manager has died", e);

112        }

114        throw new NameNotFoundException(packageName);

115    }

我们看到getPackageInfo是调用mPM.getPackageInfo来完成操作的,而mPM是PackageManagerService在applicationPackageManager的binder代理。故最终的操作还是由PMS来执行,PMS管理package的所有信息。那PMS是根据什么来获取信息呢,manifest(安装apk时,会解析此文件并将info保存在/data/system/package.xml)?如果不是动态的话attackSurface是否会有遗漏(动态注册的broadcast)

当drozer进行复杂或者需要与app交互的操作时,会直接加载特定功能的类到VM来达到交互:下面这个问题待解答

self.loadClass("common/XmlAssetReader.apk", "XmlAssetReader")

分析上述drozer模块我们发现,其实drozer做的是找到attacSurface然后人工组合特定intent(这个很关键)。但要达到attack的目的,需要我们根据app源码来构造特定intent,这需要我们掌握apk的反汇编和反编译工具并熟悉smail及java;IDE工具:Apk改之理、androidKiller、JEB

至于app的attackSurface,请参考下图,但包含intent-filter的组件默认是exproted(安全性:保护等级-签名相同;权限要求:特定自己申明的权限(权限也是有等级:normal、dangerous、system、signature))。

官方文档翻译:http://yunpan.cn/ccvBxd5XpQZ4P  访问密码 429e;不足之处还请见谅

参考资料:

1 the_mobile_hackers_handbook.pdf

版权声明:本文为博主原创文章,未经博主允许不得转载。

drozer源码学习:app的更多相关文章

  1. drozer源码学习二:info+scanner

    Information: datetime:    输出android中当前日期:time. setToNow() deviceinfo:   输出设备信息 deviceinfo做了三件事: 1.  ...

  2. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  3. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  4. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  5. ddms(基于 Express 的表单管理系统)源码学习

    ddms是基于express的一个表单管理系统,今天抽时间看了下它的代码,其实算不上源码学习,只是对它其中一些小的开发技巧做一些记录,希望以后在项目开发中能够实践下. 数据层封装 模块只对外暴露mod ...

  6. 【iScroll源码学习02】分解iScroll三个核心事件点

    前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...

  7. 【iScroll源码学习00】模拟iScroll

    前言 相信对移动端有了解的朋友对iScroll这个库非常熟悉吧,今天我们就来说下我们移动页面的iScroll化 iScroll是我们必学框架之一,我们这次先根据iScroll功能自己实现其功能,然后再 ...

  8. Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习

    package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...

  9. metamask源码学习-ui/index.js

    The UI-即上图左下角metamask-ui部分,即其图形化界面 The MetaMask UI is essentially just a website that can be configu ...

随机推荐

  1. 该死的端口占用!教你用 Shell 脚本一键干掉它!

    1. 前言 大家好,我是安果! 在 Web 开发中,经常会遇到「端口被占用」的场景 常规解决方案是: 使用 lsof -i 命令查询占用端口的进程 PID 利用 kill -9 PID 干掉目标进程 ...

  2. Java 获取小程序openid(基于SpringBoot)

    Java 获取小程序openid(基于SpringBoot) 官方文档 wx.login 1.引入Request封装依赖 <!--Request依赖--> <dependency&g ...

  3. python面试题总结

    Python语言特性 1. Python的函数参数传递 ​ 看两个如下例子,分析运行结果 #代码1 a = 1 def fun(a): a = 2 fun(a) print(a) #1 #代码2 a ...

  4. 如何使用excel制作查分系统

    在工作学习中,我们经常会遇到使用excel制作查分系统这样的问题.培根说过:读书足以恬情,足以博采,足以长才.因此,面对使用excel制作查分系统我们应该有努力探索的精神.书到用时方恨少,事非经过不知 ...

  5. WDN302国产化网络存储控制模块

    WDN302是一款网络存储控制模块,实现对NAS和IP-SAN的混合支持,通过以太网对海量存储的访问,实现数据的存储.共享.恢复和防丢失. 飞腾 FT1500A/16处理器,主频 1.5GHz: 支持 ...

  6. C# 基础 - Enum 的一些操作

    1. int 转换成 enum public enum Suit { Spades, Hearts, Clubs, Diamonds } Suit spades = (Suit)0; Suit hea ...

  7. C语言知识汇总,史上最全面总结,没有之一

    C语言基础 C语言学习路线 C语言入门笔记 初识C语言 简单的C程序示例 我们编写的C代码是怎样跑起来的? 简单示例,VS2019调试C语言程序 C语言基础-数据类型 深入理解变量,变量的声明,定义, ...

  8. Django之Auth认证模块

    一.Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发网站的时候,无可避免的需要设计实现网站的用户系统,此时我们需要实现包括用户注册,用户登陆,用户认证,注销修改密码等功能 ...

  9. JVM笔记--如果你写JVM,最需要考虑的重要结构是什么?

    开局一张图,前面已经从每一部分解析过JVM的内存结构了,现在按照顺序来分析: 整体上来看:类文件从类加载子系统,加载完成之后,主要存放在方法区(JRockit和H9没有方法区,这里指的是HotSpot ...

  10. Benjio0-Curriculum Learning 2009

    Curriculum Learning 2009 核心思想: 相比于随机选取训练样本对模型进行训练,使用由易到难的样本(更加复杂,包含更多信息)训练模型可以取得更好的训练效果. 由于这种训练模式类似于 ...