`
su1216
  • 浏览: 668509 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:71722
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:128452
社区版块
存档分类
最新评论

android手机root后的安全问题 (四)

阅读更多

导读: 本文介绍了如何实现禁止开机启动以及如何使应用失效。

希望大家不要制造各种流氓软件或病毒

 

这一期我们来关注以下某些优化软件的开机优化功能

禁止开机启动和禁止

 

很多软件都有开机优化功能,比如360,金山,海卓……

我觉得海卓页面还不错,所以就截一张海卓的图片吧


点击右边的小旗,会有一些选项,这里只说两个

开机启动

程序状态

 

在android 4.1(jelly bean)版本中,settings中查看应用信息的地方有一个disable按钮,如下图


disable掉这个应用之后,在launcher列表中是查询不到的,也就是说,你无法启动这个应用了,也合理,但是如果你想enable就有些麻烦了。你得在settings中的应用列表中找到这个应用(一般出厂的手机,都有几十个应用,再加上自己安装的,应用数量很容易就100+了),然后再enable,这时候,launcher中就能再次看到这个应用了

(ps:还可以控制是否显示通知,这个功能估计大家都喜欢)

 

但是4.0及其之前的版本是没有disable这个功能的,但是如果root了手机,那么我们是可以实现这个功能的。

首选我们先看看手机中应用哪些是enabled的

$ pm list package -e
package:android
package:cn.buding.coupon
package:cn.buding.moviecoupon
package:cn.chinabus.main
package:cn.chinabus.metro.main
package:cn.com.fetion
……

我看了一下我的手机,居然有249个enabled的程序,汗!

$ pm list package -e | busybox wc -l                         
249

查看disabled的应用改下选项就可以了

$ pm list package -d

我们先来看看pm都能做些什么

pm list packages: prints all packages, optionally only
  those whose package name contains the text in FILTER.  Options:
    -f: see their associated file.
    -d: filter to only show disbled packages.
    -e: filter to only show enabled packages.
    -s: filter to only show system packages.
    -3: filter to only show third party packages.
    -u: also include uninstalled packages.


pm enable, disable, disable-user: these commands change the enabled state
  of a given package or component (written as "package/class").

这里只截取了一部分,详情请自行查看pm帮助

 

大家可以拿一个无关紧要的程序试试,disable再enable,看看launcher有什么变化(需要root权限,之前的查询是不需要root权限的) ,比如:

pm disable cn.eoe.wiki
pm enable cn.eoe.wiki

注:切换到root用户时,执行pm可能会出现段错误(android 4.0+)

 

shell@android:/ # pm
[1] + Stopped (signal)     pm 
shell@android:/ # pm                                                           
[2] + Stopped (signal)     pm 
[1] - Segmentation fault   pm 

 

我们在执行pm之前,export一下LD_LIBRARY_PATH即可

 

export LD_LIBRARY_PATH=/vendor/lib:/system/lib

 

我们可以查看一下这个变量

 

echo $LD_LIBRARY_PATH

在我机器上面,普通用户是设置了这个变量的,切换到root的时候,这个变量就空了,所以需要重新export一下

 

 

第一个功能程序状态 讲解就结束了。

 

其实大多数人关心的是第二个功能开机启动 问题

首选,我们需要明确的是:我们需要知道哪些应用具有开机启动功能。

其实精确到应用还不可以,因为我们不是要把应用禁止掉,而是要把接收开机启动的Intent的receiver禁止掉,所以我们需要精确到class

首先我们来看看接收BOOT_COMPLETED的receiver在manifest中如何注册的

<receiver android:name=".BootReceiver" android:enabled="true">
    <intent-filter>    
        <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter>
</receiver>

这里有一点是需要特别注意的: android:enabled="true"

enabled这个属性,大多数情况下我们是不显式写在这里的,当然,默认值就为true

禁止开机启动,其实就是设置接收BOOT_COMPLETED的receiver状态为disabled,即android:enabled="false"

首先要解决的就是如何获得所有接收BOOT_COMPLETED的receiver

开始我也搜索了一下,发现网上的很多方法都不可用,这里给大家说明一下:

错误方法1

 

Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);
List<ResolveInfo> resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_RESOLVED_FILTER);

这里返回的list都是enabled的receiver

 

错误方法2

List<ApplicationInfo> allAppsList = mPackageManager.getInstalledApplications(0);
int allAppsListSize = allAppsList.size();
for (int i = 0; i < allAppsListSize; i++) {
	ApplicationInfo applicationInfo = allAppsList.get(i);
	PackageInfo packageInfo = mPackageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_RECEIVERS);
	ActivityInfo[] receivers = packageInfo.receivers;
	if(receivers != null) {
            ……
	}
}

这里获得的也都是enable的

 

错误方法3

有的人使用下面代码片断

 

if (PackageManager.PERMISSION_GRANTED == mPackageManager.checkPermission("android.permission.RECEIVE_BOOT_COMPLETED", app.packageName))

检查package干什么?!

 

其实android原生给我们提供了如何获得所有component的api(enabled+disabled)

int android.content.pm.PackageManager.GET_DISABLED_COMPONENTS = 512 [0x200]

PackageInfo flag: include disabled components in the returned info.

 

这样,我们使用如下代码就可以了

Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);
List<ResolveInfo> resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_DISABLED_COMPONENTS);

然后我们需要知道组件的状态,disabled还是enabled

ComponentName mComponentName = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
Log.d(TAG, "COMPONENT_ENABLED_STATE:" + mPackageManager.getComponentEnabledSetting(mComponentName) + "\tpackageName:" + resolveInfo.activityInfo.packageName);

接下来的事情就简单了,如果你想禁止包名为package的应用开机启动,那么只需在上面list中,找到所有此包下的receiver,然后

pm disable package/class
pm enable package/class

即可

 

我们需要关注下面几个COMPONENT_ENABLED_STATE

 

 写道
public static final int COMPONENT_ENABLED_STATE_DEFAULT

Since: API Level 1
Flag for setApplicationEnabledSetting(String, int, int) and setComponentEnabledSetting(ComponentName, int, int): This component or application is in its default enabled state (as specified in its manifest).

Constant Value: 0 (0x00000000)
public static final int COMPONENT_ENABLED_STATE_DISABLED

Since: API Level 1
Flag for setApplicationEnabledSetting(String, int, int) and setComponentEnabledSetting(ComponentName, int, int): This component or application has been explicitly disabled, regardless of what it has specified in its manifest.

Constant Value: 2 (0x00000002)
public static final int COMPONENT_ENABLED_STATE_DISABLED_USER

Since: API Level 14
Flag for setApplicationEnabledSetting(String, int, int) only: The user has explicitly disabled the application, regardless of what it has specified in its manifest. Because this is due to the user's request, they may re-enable it if desired through the appropriate system UI. This option currently can not be used with setComponentEnabledSetting(ComponentName, int, int).

Constant Value: 3 (0x00000003)
public static final int COMPONENT_ENABLED_STATE_ENABLED

Since: API Level 1
Flag for setApplicationEnabledSetting(String, int, int) and setComponentEnabledSetting(ComponentName, int, int): This component or application has been explictily enabled, regardless of what it has specified in its manifest.

Constant Value: 1 (0x00000001)
public static final int DONT_KILL_APP

Since: API Level 1
Flag parameter for setComponentEnabledSetting(android.content.ComponentName, int, int) to indicate that you don't want to kill the app containing the component. Be careful when you set this since changing component states can make the containing application's behavior unpredictable.

Constant Value: 1 (0x00000001)

 

 

如果是自己应用中想disable或者enable自己的组件,那么是不需要任何权限的,当然不能使用pm命令

在原生email(4.0)应用中,旧有此功能,我们来看看email的代码

void com.android.email.service.EmailBroadcastProcessorService.setComponentEnabled(Class<?> clazz, boolean enabled)

private void setComponentEnabled(Class<?> clazz, boolean enabled) {
    final ComponentName c = new ComponentName(this, clazz.getName());
    getPackageManager().setComponentEnabledSetting(c,
            enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                    : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
}

 

void com.android.email.Email.setServicesEnabled(Context context, boolean enabled)方法中也有参考代码

 

至此,开机启动、禁用程序 就全部讲解完了。

我们发现,海卓这个应用居然有这么多变态功能,居然可以禁止所有事件。。。这是不是过分了点,不过程序的原理应该都在我这篇博客之中了,我不太希望有禁止所有事件这种功能,那还不如把这个app删掉呢,何必折磨它呢?!

 

 

请大家不要用root的手机随意下载软件,更不要以任何借口制造任何病毒!

 

 

 

android手机root后的安全问题 (一)

android手机root后的安全问题 (二)

android手机root后的安全问题 (三)

android手机root后的安全问题 (四)

 

 

android安全问题(一) 静音拍照与被拍

android安全问题(二) 程序锁

android安全问题(三) 钓鱼程序

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

3
0
分享到:
评论
4 楼 N_HH 2013-01-08  
su1216 写道
N_HH 写道
那个,请问,pm是什么。。不懂。

shell@android:/ $ pm --help
Error: unknown command '--help'
usage: pm list packages [-f] [-d] [-e] [-s] [-e] [-u] [FILTER]
       pm list permission-groups
       pm list permissions [-g] [-f] [-d] [-u] [GROUP]
       pm list instrumentation [-f] [TARGET-PACKAGE]
       pm list features
       pm list libraries
       pm path PACKAGE
       pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH
       pm uninstall [-k] PACKAGE
       pm clear PACKAGE
       pm enable PACKAGE_OR_COMPONENT
       pm disable PACKAGE_OR_COMPONENT
       pm disable-user PACKAGE_OR_COMPONENT
       pm set-install-location [0/auto] [1/internal] [2/external]
       pm get-install-location
       pm createUser USER_NAME
       pm removeUser USER_ID

pm list packages: prints all packages, optionally only
  those whose package name contains the text in FILTER.  Options:
    -f: see their associated file.
    -d: filter to only show disbled packages.
    -e: filter to only show enabled packages.
    -s: filter to only show system packages.
    -3: filter to only show third party packages.
    -u: also include uninstalled packages.

pm list permission-groups: prints all known permission groups.

pm list permissions: prints all known permissions, optionally only
  those in GROUP.  Options:
    -g: organize by group.
    -f: print all information.
    -s: short summary.
    -d: only list dangerous permissions.
    -u: list only the permissions users will see.

pm list instrumentation: use to list all test packages; optionally
  supply <TARGET-PACKAGE> to list the test packages for a particular
  application.  Options:
    -f: list the .apk file for the test package.

pm list features: prints all features of the system.

pm path: print the path to the .apk of the given PACKAGE.

pm install: installs a package to the system.  Options:
    -l: install the package with FORWARD_LOCK.
    -r: reinstall an exisiting app, keeping its data.
    -t: allow test .apks to be installed.
    -i: specify the installer package name.
    -s: install package on sdcard.
    -f: install package on internal flash.

pm uninstall: removes a package from the system. Options:
    -k: keep the data and cache directories around after package removal.

pm clear: deletes all data associated with a package.

pm enable, disable, disable-user: these commands change the enabled state
  of a given package or component (written as "package/class").

pm get-install-location: returns the current install location.
    0 [auto]: Let system decide the best location
    1 [internal]: Install on internal device storage
    2 [external]: Install on external media

pm set-install-location: changes the default install location.
  NOTE: this is only intended for debugging; using this can cause
  applications to break and other undersireable behavior.
    0 [auto]: Let system decide the best location
    1 [internal]: Install on internal device storage
    2 [external]: Install on external media

很详细。。谢了哈
3 楼 su1216 2013-01-07  
N_HH 写道
那个,请问,pm是什么。。不懂。

shell@android:/ $ pm --help
Error: unknown command '--help'
usage: pm list packages [-f] [-d] [-e] [-s] [-e] [-u] [FILTER]
       pm list permission-groups
       pm list permissions [-g] [-f] [-d] [-u] [GROUP]
       pm list instrumentation [-f] [TARGET-PACKAGE]
       pm list features
       pm list libraries
       pm path PACKAGE
       pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH
       pm uninstall [-k] PACKAGE
       pm clear PACKAGE
       pm enable PACKAGE_OR_COMPONENT
       pm disable PACKAGE_OR_COMPONENT
       pm disable-user PACKAGE_OR_COMPONENT
       pm set-install-location [0/auto] [1/internal] [2/external]
       pm get-install-location
       pm createUser USER_NAME
       pm removeUser USER_ID

pm list packages: prints all packages, optionally only
  those whose package name contains the text in FILTER.  Options:
    -f: see their associated file.
    -d: filter to only show disbled packages.
    -e: filter to only show enabled packages.
    -s: filter to only show system packages.
    -3: filter to only show third party packages.
    -u: also include uninstalled packages.

pm list permission-groups: prints all known permission groups.

pm list permissions: prints all known permissions, optionally only
  those in GROUP.  Options:
    -g: organize by group.
    -f: print all information.
    -s: short summary.
    -d: only list dangerous permissions.
    -u: list only the permissions users will see.

pm list instrumentation: use to list all test packages; optionally
  supply <TARGET-PACKAGE> to list the test packages for a particular
  application.  Options:
    -f: list the .apk file for the test package.

pm list features: prints all features of the system.

pm path: print the path to the .apk of the given PACKAGE.

pm install: installs a package to the system.  Options:
    -l: install the package with FORWARD_LOCK.
    -r: reinstall an exisiting app, keeping its data.
    -t: allow test .apks to be installed.
    -i: specify the installer package name.
    -s: install package on sdcard.
    -f: install package on internal flash.

pm uninstall: removes a package from the system. Options:
    -k: keep the data and cache directories around after package removal.

pm clear: deletes all data associated with a package.

pm enable, disable, disable-user: these commands change the enabled state
  of a given package or component (written as "package/class").

pm get-install-location: returns the current install location.
    0 [auto]: Let system decide the best location
    1 [internal]: Install on internal device storage
    2 [external]: Install on external media

pm set-install-location: changes the default install location.
  NOTE: this is only intended for debugging; using this can cause
  applications to break and other undersireable behavior.
    0 [auto]: Let system decide the best location
    1 [internal]: Install on internal device storage
    2 [external]: Install on external media
2 楼 N_HH 2013-01-07  
那个,请问,pm是什么。。不懂。
1 楼 Lovic 2012-09-11  
ooooooooooooooooooo

相关推荐

    android手机root检测

    标题提到的"android手机root检测"是指检查Android设备是否已经获取了root权限的过程。这个过程对于应用开发者和安全专家来说尤其重要,因为他们需要确保其应用不会在被root的设备上运行,因为这可能会导致数据泄露或...

    android手机root后的安全问题 (一)

    NULL 博文链接:https://su1216.iteye.com/blog/1668734

    中兴U880 Android手机root工具 SuperOneClick

    【中兴U880 Android手机root工具 SuperOneClick】是一种专门为中兴U880智能手机设计的便捷Root工具,其主要目标是帮助用户获取设备的最高管理权限,即所谓的Root权限。在Android系统中,Root权限相当于Windows系统中...

    android手机root工具

    这是一个工具,帮你获取android手机的root权限。让你不受控制,当然,这可能也给你手机带来一些安全问题,所以请慎重。

    Android root下修改设备分辨率

    5. **恢复方法**:如果修改后出现问题,可以尝试恢复备份的系统镜像,或者使用一些Root管理工具如SuperSU或Magisk进行系统还原。如果设备因错误修改而无法启动,可能需要通过fastboot模式或ODIN工具刷入新的系统固件...

    Android设备上非root的抓包实现方法(Tcpdump方法)

    由于Android系统的安全机制,大多数应用程序没有root权限,因此不能直接使用tcpdump工具进行抓包。然而,通过一些特殊的技术手段,我们可以在非root的Android设备上实现抓包功能。 首先,理解tcpdump的运行需求。...

    索尼 android手机 无痛root

    【标题】"索尼Android手机无痛root"涉及的是在不造成设备损坏或数据丢失的情况下,对索尼Android手机进行超级用户权限获取的过程。Root是Android系统中的一个术语,它指的是允许用户获得系统的最高权限,以便可以...

    android手机获取root权限详细教程资料.pdf

    Android手机获取root权限是许多高级用户为了更深度定制和优化设备所采取的步骤。Root权限类似于Linux系统中的超级管理员账户,允许用户访问和修改手机的底层文件,包括系统核心和设置。这种权限通常由手机制造商限制...

    android智能手机百分百 root成功软件

    在Android操作系统的世界里,"root"一词代表着...root后,手机的安全性可能会降低,容易受到恶意软件攻击。此外,root可能违反手机厂商的保修政策,导致保修失效。因此,在决定root前,请充分了解其利弊,谨慎操作。

    Android-root.rar_ROOT_android root_root android

    下面我们将详细探讨Android手机终端上的root用户命令合辑及其用法。 1. **获取Root权限**:首先,获取root权限是整个过程的基础。这通常需要通过第三方工具或服务,如Magisk、SuperSU等。每个工具都有其特定的流程...

    Android手机ROOT权限详细说明.doc

    Android手机的ROOT权限是一个关键的概念,尤其对于那些喜欢深入探索和自定义设备的用户来说。在Android系统中,"ROOT"是指获取手机操作系统最高级别的权限,相当于Linux系统中的超级管理员用户账户,也就是root用户...

    Android获取root权限工具

    3. **安全更新**: 获取root权限后,可能无法接收官方的安全更新,需要自行保持警惕,防范潜在的安全威胁。 4. **恢复出厂设置**: 如果root过程失败或遇到问题,可能需要将设备恢复出厂设置,这将清除所有数据。 ...

    android获取root权限

    在Android操作系统中,获取root权限是一项关键操作,它允许用户超越默认的系统限制,访问和修改系统的底层组件。...对于想要深入定制手机或解决特定问题的用户,掌握如何安全有效地获取和管理root权限至关重要。

    mtk6577 android4.0 root工具

    5. **后root维护**:成功root后,用户应安装一个如SuperSU这样的管理应用来控制各个应用的root权限,并定期更新以防止已知的安全漏洞。 6. **恢复原状**:如果用户不再需要root权限或遇到问题,可以通过unroot工具...

    Android例子源码不弹框手机是否Root检测例子

    现在,我们来看判断Android手机是否已Root的三种方法: 1. **检查已知Root应用是否存在**:这种方法简单直接,通过查找已知的Root管理应用(如SuperSU、Magisk等)的系统文件或服务来判断。例如,可以检查/system/...

    华为手机root软件

    【华为手机root软件】 华为手机root工具是一种专为华为设备设计的软件,旨在获取手机的最高权限,即root权限。root是Android系统中的一个概念,代表着用户能够对系统进行深层次的定制和修改,不受厂商预装应用和...

    AndroidROOT教程

    这篇"Android ROOT教程"旨在帮助安卓手机用户了解并实现ROOT权限的获取。 首先,我们要明确ROOT的风险。虽然ROOT可以带来诸多便利,如删除预装应用、优化电池性能等,但也可能导致系统不稳定,甚至丢失保修。因此,...

    android手机获取root权限教程

    ### Android手机获取Root权限教程详解 #### Root权限概念与重要性 **Root权限**,对于Android设备来说,意味着用户能够获得对其操作系统最高级别的控制权。这一权限赋予了用户修改或替换设备操作系统的能力,几乎...

    KSP8000手机root

    【KSP8000手机Root详解】 Root是Android系统中的一个术语,指的是获取设备的最高权限,类似于Windows系统的管理员权限。Root后,用户可以访问并修改系统级别的文件,安装自定义固件、删除预装应用,优化系统性能,...

    android root提权原理

    对于Android用户而言,Root意味着对设备控制的极大增强,但也需谨慎对待,以免因不当操作导致设备不稳定或安全问题。而对于Android开发者和安全研究人员,深入理解Root的原理和技术细节,有助于构建更加安全、稳定的...

Global site tag (gtag.js) - Google Analytics