分享好友 移动开发首页 频道列表

揭秘360手机助手未经用户同意,自动开启辅助功能的“黑科技”

Android开发  2016-12-01 12:100

*本文原创作者:Venscor,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×00 概述

Android为正常使用手机有障碍的用户提供了辅助功能,即AccessibilityService。通俗的说,也就是为”残疾人”专门提供的服务。但近几年来,这个功能却被开发者和病毒厂商玩坏了,最典型的两个示例用途就是抢红包和静默安装,当然还有其他基于AccessibilityService的病毒程序, 具体可参见360移动安全的研究报告[1]。 按照Android开发文档,开发者开发AccessibilityService功能,必须要让用户手动在系统设置的”辅助功能”内打开对应的AccessibilityService。很多工具类软件也都使用了AccessibilityService,例如百度手机助手,腾讯应用宝,豌豆荚,pp助手,爱奇艺等。但是,这是App都没有自动开启辅助功能的能力。

我们发现,只有360手机助手能够不经过用户交互,自己启动AccessibilityService。为什么360手机助手可以做到?带着这样的好奇,我们来探寻其背后的“黑科技”。

0×01 必备知识

1.1 AccessibilityService的使用

这一部分属于开发的范畴,不想做过多的介绍。不会的可以参考我的个人博客: Android静默安装实现方案,仿360手机助手秒装和智能安装功能[2]. 由于AccessibilityService可以实现对手机上发生事件的监控,并且能够模拟用户点击等。所以还有许多其他用途,可以参考相关开发内容。正是由于AccessibilityService伴随很多安全行为,Android不允许App为自己开启这项服务,必须通过用户交互才能使用,这就给一些想恶意利用AccessibilityService的App带来了一些麻烦。

1.2 Android独立运行Java程序

网上关于这部分的资源也不在少数,可以参考我的博客 Android上app_process启动java进程[3]. 这里还是以demo形式简单说明下。

1.2.1 编写一个Java程序并编译成Dalvik可执行的jar/dex包。

public class Helloworld {
    public static void main(String[]args){
        System.out.println("Hello, I am started by app_process!");
    }
}
//编译,这里主要是Platform tool上用的是Java 7,所以显式指定1.7
javac -source 1.7 -target 1.7 C:\Users\Venscor\Desktop\app_process\dump.java
//生成dex,当然生成jar在Android上也是可执行的
dx --dex --output=C:\Users\Venscor\Desktop\app_process\Hellworld.dex Helloworld.class

将编译好的dex文件push到Android设备上,这时,面临一个问题。我们平时开发Android应用程序都是.apk文件,都运行在独立的Context下。缺乏Context的支持,我们如何才能启动独立的Java程序?

其实,这里需要普及一个知识点,就是Android apk执行的其实点并不是开发者认为的onCreate函数,其实启动点在Framework层中的ActivityThread.java的main()函数。更底层一点来说,每个apk都是由app_process间接启动起来的。使用app_process执行上述java代码,app_process命令如下:

app_process -Djava.class.path=Helloworld.dex /data/local/tmp Helloworld

可以看到,Java代码成功执行了,这里需要注意:app_process命令启动的Java程序需要shell权限才能执行,当使用普通app执行app_process命令时,对应的启动的Java程序的Uid不再是shell,所以不能修改对应的setting。

1.2.2 被启动的Java程序的Uid

通过ps命令查看app_process启动的Java的Uid,以及对应的权限。

揭秘360手机助手未经用户同意,自动开启辅助功能的“黑科技”

可以看出,app_process启动的Java程序运行在uid为shell的进程中。这就意味着,被启动的Java程序拥有很高的权限。

1.3 不通过用户交互修改系统设置

Android很多危险的系统设置,比如AccessibilityService,安装未知来源的app等都是不对第三方App开放的,也就是说修改这些权限都需要signature级别的权限。所以,第三方App想修改系统设置是不切实际的。

其实,用户修改系统设置,对用户可见的是设置状态的改变。在系统的背后,其实这些修改都是通过数据库实现的。Android于安全设置有关的Uri是:content://settings/secure。通过修改这个数据库就可以修改对应的系统设置,并且用户完全觉察不到。那么问题来了,对这个数据库的修改也是需要Signature级别权限的。

结合上面1.2.2知识,就给我们提供了一条路子:在apk中实现一段纯Java代码,然后在shell下用app_process启动这个Java代码。于是Java代码运行于uid为shell的进程,就可以修改系统设置对应的数据库,从而在用户好不察觉的情况下实现系统设置修改。例如:打开AccessibilityService。

简单实验一下,更新修改从而自动打开应用宝的辅助功能。

/*shell cmd 1*/ 
settings put secure enabled_accessibility_services com.tencent.android.qqdownloader/com.tencent.nucleus.manager.accessibility.YYBAccessibilityService /*shell cmd 2*/
settings put secure accessibility_enabled 1 

0×02 实验

其实到这里,360的黑科技的基本原理已经说明完了,没有代码怎么感觉有点不完整。所以,这节主要是实前面过程的代码。在Android手机上执行以下代码,轻松展现360黑科技。

package com.venscor.helloworld;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class Helloworld { 
	public static void main(String[]args){
		System.out.println("Hello, I am started by app_process!");
		String cmd1="settings put secure enabled_accessibility_services com.qihoo.appstore/com.qihoo.appstore.accessibility.AppstoreAccessibility";
		String cmd2="settings put secure accessibility_enabled 1";
		execShell(cmd1);
		execShell(cmd2);
	}

	private  static void execShell(String cmd){
		try {
			Process p=Runtime.getRuntime().exec(cmd);
			BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
			String readLine=br.readLine();
			while(readLine!=null){
				System.out.println(readLine);
				readLine=br.readLine();
			}
			if(br!=null){
				br.close();
			}
			p.destroy();
			p=null;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

0×03 360手机助手的做法

360这项黑科技的做法和我上面说的基本一致,这里有一个问题:Java程序是需要shell下来开启的,对于Android设备上的app,是没有此权限的。那么360上的Java程序是怎么启动的?

其实,是你手机对你电脑的信任关系出卖了你。国内绝大多数用户在Windows PC上都安全了360的杀毒软件,这些杀毒软件其实都内置了adb工具。也就是说,PC上的360杀毒软件使用adb运行shell的app_process命令来启动Java程序来自动打开了AccessibilityService。这也解释了你为什么一把手机插上电脑,就被自动被安装app的原因,并且全程都是静默安装。

好了,空口无凭。我们看360手机助手的代码,其通过两种方式实现,而且方式2粗心的程序员还打错字了,把accessibility_enabled打成了enabled_accessibility_services.代码路径:\com\qihoo\appstore\rootcommand\accessibility\AppStoreAccessibilityServiceEnableCommand.class

揭秘360手机助手未经用户同意,自动开启辅助功能的“黑科技”

揭秘360手机助手未经用户同意,自动开启辅助功能的“黑科技”

查看更多关于【Android开发】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
SDK热更之如何在SDK代码中自动插桩及如何生成补丁包
写在前面本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接:SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.htmlSDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix这篇文章主要介绍一下SDK热更

0评论2017-02-05358

ASimpleCache
ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。1、它可以缓存什么东西?普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 byte数据。2、它有什么特色?特色主要是

0评论2017-02-05376

原生App与javascript交互之JSBridge接口原理、设计与实现
前期调研调研对象:支付宝,微信,云之家调研文档:Android中JS与Java的极简交互库 SimpleJavaJsBridge设计需求阅读类型的业务功能页面需要由前端H5实现,需要做到服务端可控;页面界面更改减少重新发布新版本的频率;功能页面部分原型需求无法实现,需要原生

0评论2017-01-063119

RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
之前写过一系列RxJava1的文章,也承诺过会尽快有RxJava2的介绍。无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨。所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家在使用RxJava的时候有一点点启发。对RxJava还不了解的同学可以先去看看

0评论2017-01-06508

使用Smalidea对无源码APK调试简介
阅读:8最近正好也用了Smalidea,就ZZ的原贴做一些补充。可调试APP如果Android的系统属性ro.debuggable等于1(用getprop ro.debuggable验证),则所有APP都可调试。如果ro.debuggable等于0,某APP的AndroidManifest.xml中有android:debuggable=”true”,该APP

0评论2017-01-06295

[Java] Retrofit2.0 如何进行GBK编码
对Retrofit + OkHttp还不熟悉的人可以点传送门,先看下这两个东西的使用。Retrofit:https://github.com/square/retrofitOkHttp:https://github.com/square/okhttp分析接口文档要求Post请求,字段使用GBK编码我们先按照Retrofit的规范和接口文档来写接口: @PO

0评论2016-12-231093

深入理解 final 在 Java 和 Android 中修饰局部变量的意义
在Android的日常编程中,我们会经常使用匿名内部类,比如给Button设置点击事件时,setOnClickListener(new OnClickListener(){...})。如果此时,我们需要在匿名内部类中外部方法中的局部变量,我们必须手动对将这个局部变量用final关键字修饰(在JDK1.8之后不

0评论2016-11-2371

从 Retrofit 源码学习 Java 的动态代理的使用
Retrofit 是当前 Android 最流行的 HTTP 网络库之一了,其使用方式比较特殊,是通过定义一个接口类,通过给接口中方法和方法参数添加注解的方式来定义网络请求接口。这种风格下定义一个网络接口变得很简单。不过 Retrofit 是如何使用一个接口的 Class 创建出

0评论2016-11-13181

更多推荐