xposed开发之清除应用数据(研究历程)

2023-11-19

    最近在研究xposed,有个需求要做到清除其他应用数据,xposed功能足够强大,应该可以实现这个功能,下面是基于android4.4.4研究的思路。

    google只能开放了清楚缓存的API,清除数据的API隐藏了,而调用清理数据的方法在“设置”中的“应用”里,找到设置功能的源码,代码位置 com.android.settings.applications.InstalledAppDetails ,点击事件在这

103842_bfxz_1786928.png

调用了initiateClearUserData,看看这里面怎么实现的

104013_lZCJ_1786928.png

调用了ActivityManager的clearApplicationUserData,参数是该应用的包名和一个ClearUserDataObserver的实例

104307_sfW8_1786928.png

IPackageDataObserver是有AIDL生成的,位于android.content.pm包内,我们可以新建一个相同的包名,把AIDL放在这里。

104552_hWSU_1786928.png

注:有些应用详情里该按钮不是清除数据,是管理空间,清除数据的按钮在应用自定义的界面里,但是最终实现清除数据还是调用的clearApplicationUserData

clearApplicationUserData是隐藏方法,直接调用了ActivityManagerNative的方法

105117_oiUR_1786928.png

ActivityManagerNative:

105443_QOQB_1786928.png

这里直接使用反射或者Xposed的callmethod调用这两个方法都会报错,缺少权限

android.permission.CLEAR_APP_USER_DATA

这里并没有实现具体的方法,真正的实现在ActivityManagerService中,参考http://www.jianshu.com/p/18517a4ef8e1

ActivityManagerService:

112417_eQWA_1786928.png

112625_AswM_1786928.png

该方法上面部分是获取pid、uid,给IPackageManager的对象赋值和权限检测,下面执行清除数据。最开始的思路是直接hook AppGlobals.getPackageManager()的clearApplicationUserData,但是仍旧报缺少权限错误。。。继续分析:

AppGlobals:

112941_TqUX_1786928.png

ActivityThread:

113033_lcgM_1786928.png

到这里遇到IPackageManager.aidl生成的Stub类,PackageManagerService继承了IPackageManager.Stub

PackageManagerService:

113701_9Dfv_1786928.png

又是权限检测,跳过,进入clearApplicationUserDataLI

113853_EbaY_1786928.png

int retCode = mInstaller.clearUserData(packageName, userId);

进入Installer方法

114039_im0I_1786928.png

114552_jDuv_1786928.png

134326_W8W9_1786928.png

该类大概是创建本地socket,执行linux命令行,进行各种应用的安装、移动、卸载、清除数据等

但是hook此方法,仍旧报错,空指针异常,而且hook connect也连接不上

Class installCls = XposedHelpers.findClass("com.android.server.pm.Installer",lpp.classLoader);
Object installObj = XposedHelpers.newInstance(installCls);
boolean lean = (boolean) XposedHelpers.callMethod(installObj,"ping");
boolean bo = (boolean) XposedHelpers.callMethod(installObj,"connect");
XposedBridge.log("lean:"+lean+"--bo:"+bo);

实例化Installer出的问题.查了资料,Installer在系统启动时由其他类调用,启动完成后用findAndHookMethod无法hook到。于是实现Xposed另一接口XposedHookZygoteInit 

@Override
public void initZygote(StartupParam startupParam) throws Throwable {
    Class installCls = XposedHelpers.findClass("com.android.server.pm.Installer",null);
    XposedHelpers.findAndHookMethod(installCls, "writeCommand",String.class, new XC_MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            String string = (String) param.args[0];
            XposedBridge.log("string:"+string);
            if(string.contains("com.google.android.gms"))
                param.args[0] = "rmuserdata com.google.android.gms 0";
        }

    });

}

以google play service为例,这种情况下可以清除此app的数据。但是这种方法不可控,必须放在initZygote中,而且Installer不能通过反射实例化,只能另想办法。

    郁闷两天后,想到既然从ActivityManager、PackageManagerService等类中不能调用是因为权限限制,那就hook检测权限的方法,让我的应用通过权限检测。最开始打算以外部调用的方式(在非Xposed中,例如activity,以反射的方式调用清除数据的方法,Xposed hook权限检测方法)从 ActivityManagerService入手,因为PackageManagerService的构造方法需要传多个参数,包括Installer的对象。ActivityManagerService里检测权限的是checkComponentPermission方法,但是通过反射获取ActivityManagerService对象时又报错,FileNotFoundException,引发异常的位置是mBatteryStatsService = new BatteryStatsService(new File( systemDir, "batterystats.bin").toString());

batterystats.bin文件位于/data/system/下,但即使我获得了root权限依然触发异常,不知道什么原因。这样只能在handleLoadPackage中调用清除数据,在Xposed外部设置个合适方法触发清理数据,比如获得IMEI、杀掉某个进程等,通过hook这些方法,然后调用清除数据的方法:

XposedHelpers.findAndHookMethod("android.app.ActivityManager", lpp.classLoader, "killBackgroundProcesses",String.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                String process = (String) param.args[0];
                XposedBridge.log("process:"+process);
                if("com.google.android.gsf".equals(process)){
                    ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
                    XposedHelpers.callMethod(manager,"clearApplicationUserData",packageName,clearDataUserData);

                }

            }
        });

这是以杀死com.google.android.gsf为例。

    权限检测这里有两部分,就是ActivityManagerService 的checkComponentPermission了:

XposedHelpers.findAndHookMethod("com.android.server.am.ActivityManagerService", lpp.classLoader, "checkComponentPermission", String.class, int.class, int.class, int.class, boolean.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                if(Manifest.permission.CLEAR_APP_USER_DATA.equals(param.args[0])) {
                    int re = (int) param.getResult();
                    XposedBridge.log("ActivityManagerService re:"+re);
                    param.setResult(0);//PackageManager.PERMISSION_GRANTED

                }
            }
        });

    总结:最终实现的方法很简单,但是过程分析花费的时间很长,一方面源于对源码的不了解,比如AIDL原理,系统启动的顺序等等。好在源码结构好,容易看懂,不然还没分析完就歇菜放弃了。这里主要是为学习做个笔记,清除其他应用的数据是很危险的行为,一定要慎用!慎用

转载于:https://my.oschina.net/u/1786928/blog/983476

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xposed开发之清除应用数据(研究历程) 的相关文章

随机推荐

  • 某度翻译最新版Acs-Token逆向分析

    某度翻译最新版Acs Token逆向分析 免责声明 本文章中所有内容仅供学习交流使用 不用于其他任何目的 不提供完整代码 抓包内容 敏感网址 数据接口等均已做脱敏处理 严禁用于商业用途和非法用途 否则由此产生的一切后果均与作者无关 擅自使用
  • MySQL题库(4)

    301 考虑 Web 项目的安全性 MD5 算法的不可逆性可以保证加密数据的绝对安全 判断 题 A 正确 B 错误 正确答案 B 302 符合范式的数据表设计比反范式的数据表查询性能更高 判断题 A 正确 B 错误 正确答案 B 303 相
  • 关于文件描述符的close-on-exec标志位

    引言 我们在使用一些系统调用对文件描述符进行操作时 常常会碰到是否为文件描述符赋予CLOEXEC属性的情况 例如 open函数中的flags参数可指定O CLOEXEC标志 int open const char pathname int
  • 基于TF-IDF算法个人文件管理系统——机器学习+人工智能+神经网络(附Python工程全部源码)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 模块实现 1 数据预处理 2 词频计算与数据处理 3 数据计算与对比验证 系统测试 工程源代码下载 其它资料下载 前言 本项目旨在通过应用TF IDF算法 将新下载的课件进行自动分
  • SQL中使用IN关键字时,因空数组替换参数导致了SQL语法错误

    场景 在近期的工作中 发现了这么一个问题 在某一搜索页面 需要同时查询多种订单类型 但在页面中未选择任何订单类型 API通过UI端传来的空订单类型数组进行查询时 抛出了SQL的语法错误 原SQL SELECT FROM dbo order
  • go get 下载包时提示 could not read Username

    问题 在下载公司内部的包时 出现如下提示 go get module example com somepkg common git ls remote q origin in somepath xxxxxxxxxxxxxxxxxxxxxxx
  • python 线程锁

    目录 1 线程安全介绍 2 threading5种常见锁 2 1 同步锁 互斥锁 Lock 1 基本介绍及相关方法 2 给案例加lock锁 3 with语句 2 2 递归锁Rlock 1 基本介绍及相关方法 2 给案例加递归锁 3 with
  • tensorflow InceptionNet

    InceptionNet 即 GoogLeNet 诞生于 2015 年 旨在通过增加网络的宽度来提升网络的能 力 与 VGGNet 通过卷积层堆叠的方式 纵向 相比 是一个不同的方向 横向 显然 InceptionNet 模型的构建与 VG
  • react之纯函数、函数组件、类组件、纯组件

    一 纯函数 Pure Function 定义 一个函数的返回结果只依赖于它的参数 并且在执行的过程中没有副作用 我们就把该函数称作纯函数 特点 1 函数的返回结果只依赖与它的参数 同一个输入只能有同一个输出 let foo a b gt a
  • numpy模块中axis的理解——以np.argmax为例

    numpy模块中axis的理解 以np argmax为例 np argmax参数数量及其作用 axis不同情况的示例 np argmax参数数量及其作用 np argmax是用于取得数组中每一行或者每一列的的最大值 常用于机器学习中获取分类
  • 注意力机制的分类

    目录 1 什么是注意力机制 2 注意力机制分类 3 代表算法 1 空间域代表算法 2 通道域代表算法 3 混合域代表算法 DANet CBAM 4 注意力机制的应用 1 什么是注意力机制 注意力机制通俗的讲就是把注意力集中放在重要的点上 而
  • linux内核驱动开发笔试题

    linux内核驱动开发笔试题 一 一些常规中举的C考题 第一题 写出下述程序结果 int m 3 1 4 7 2 5 8 3 6 9 int i j k 2 for i 0 i lt 3 i printf d m k i 问题所在 本题考点
  • redis默认过期时间:redis默认的是永不过期

    今天同事问我redis默认过期时间是多久 突然想起几年前想查一下redis默认过期时间是多久 搜到的博文全是打着 redis默认过期时间是多久 的标题在讲redis过期原理 正好闲来没事 又搜了下 几年过去了 还是一样 哪来那么多文不对题的
  • StackExchange.redis 实现模糊匹配批量查询

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net Helloantoherday article details 81286685 如果
  • 一、C++中queue和deque的区别

    1 先明白队尾和队首 back和front的联系 无论从哪个方向看 插入的地方就是队尾 所有的操作名字都与back有联系 插入端的另一端就是队首 所有的操作名字都与front有联系 其中queue的操作是 queue
  • jdbc连接mysql数据库,设置字符集编码

    jdbc连接mysql数据库 设置字符集编码 1 第一种方法 JDBC连接数据库时常会出现乱码的情况 那是因为我们的字符级与数据库的字符级不一样 我们通过定义url地址的时候定义字符级 sql代表你的数据库名称 所以当这种情况遇到乱码的时候
  • 交叉编译arm Linux环境下的android-tools-adb

    前言 项目使用Rockchip的3399挖掘机demo板 使用官方提供的Debian Linux SDK 官方github源码链接 https github com rockchip linux 进行开发定制 当前需要将Android上的调
  • 阿辉闯编程(Java入门)

    故事背景 hello 大家好 我叫阿辉 在某一个风雨交加的夜晚 我也不知道干了什么惹怒了老天爷 可能是嫉妒我帅气的颜值吧 一道闪电轰然劈下 我便晕死了过去 等我再次睁开眼睛的时候 我发现我来到了一个不知名的地方 于是我问向了一旁的人 这里是
  • 豪华股东阵容加持,九方财富有望成港股“大肉签”

    经过一段时间的盘整 曾经因行业冷却而沉寂的港股打新正在重回投资者偏好之中 2月28日启动正式招股的新股 九方财富 就受到了投资者的广泛关注 自去年底以来 港股随全球资本市场大势好转 逐渐脱离底部 也提升了市场对新股的热情 同时 九方财富与其
  • xposed开发之清除应用数据(研究历程)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在研究xposed 有个需求要做到清除其他应用数据 xposed功能足够强大 应该可以实现这个功能 下面是基于android4 4 4研究的思路 google只能开放了