android手機root後的安全問題 (四) 禁止開機啓動和應用失效

導讀: 本文介紹瞭如何實現禁止開機啓動以及如何使應用失效。

希望大家不要製造各種流氓軟件或病毒

 

這一期我們來關注以下某些優化軟件的開機優化功能

禁止開機啓動和禁止

 

很多軟件都有開機優化功能,比如360,金山,海卓……

我覺得海卓頁面還不錯,所以就截一張海卓的圖片吧


點擊右邊的小旗,會有一些選項,這裏只說兩個

開機啓動

程序狀態

 

在android 4.1(jelly bean)版本中,settings中查看應用信息的地方有一個disable按鈕,如下圖


disable掉這個應用之後,在launcher列表中是查詢不到的,也就是說,你無法啓動這個應用了,也合理,但是如果你想enable就有些麻煩了。你得在settings中的應用列表中找到這個應用(一般出廠的手機,都有幾十個應用,再加上自己安裝的,應用數量很容易就100+了),然後再enable,這時候,launcher中就能再次看到這個應用了

(ps:還可以控制是否顯示通知,這個功能估計大家都喜歡)

 

但是4.0及其之前的版本是沒有disable這個功能的,但是如果root了手機,那麼我們是可以實現這個功能的。

首選我們先看看手機中應用哪些是enabled的

Shell代碼 複製代碼 收藏代碼
  1. $ pm list package -e   
  2. package:android   
  3. package:cn.buding.coupon   
  4. package:cn.buding.moviecoupon   
  5. package:cn.chinabus.main   
  6. package:cn.chinabus.metro.main   
  7. package:cn.com.fetion   
  8. ……  

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

Shell代碼 複製代碼 收藏代碼
  1. $ pm list package -e | busybox wc -l                            
  2. 249  

查看disabled的應用改下選項就可以了

Java代碼 複製代碼 收藏代碼
  1. $ pm list package -d  

我們先來看看pm都能做些什麼

Java代碼 複製代碼 收藏代碼
  1. pm list packages: prints all packages, optionally only   
  2.   those whose package name contains the text in FILTER.  Options:   
  3.     -f: see their associated file.   
  4.     -d: filter to only show disbled packages.   
  5.     -e: filter to only show enabled packages.   
  6.     -s: filter to only show system packages.   
  7.     -3: filter to only show third party packages.   
  8.     -u: also include uninstalled packages.   
  9.   
  10.   
  11. pm enable, disable, disable-user: these commands change the enabled state   
  12.   of a given package or component (written as "package/class").  

這裏只截取了一部分,詳情請自行查看pm幫助

 

大家可以拿一個無關緊要的程序試試,disable再enable,看看launcher有什麼變化(需要root權限,之前的查詢是不需要root權限的) ,比如:

Java代碼 複製代碼 收藏代碼
  1. pm disable cn.eoe.wiki   
  2. pm enable cn.eoe.wiki  

注:切換到root用戶時,執行pm可能會出現段錯誤(android 4.0+)

 

Shell代碼 複製代碼 收藏代碼
  1. shell@android:/ # pm   
  2. [1] + Stopped (signal)     pm    
  3. shell@android:/ # pm                                                              
  4. [2] + Stopped (signal)     pm    
  5. [1] - Segmentation fault   pm   

 

我們在執行pm之前,export一下LD_LIBRARY_PATH即可

 

Shell代碼 複製代碼 收藏代碼
  1. export LD_LIBRARY_PATH=/vendor/lib:/system/lib  

我們可以查看一下這個變量

 

Java代碼 複製代碼 收藏代碼
  1. echo $LD_LIBRARY_PATH  
echo $LD_LIBRARY_PATH

在我機器上面,普通用戶是設置了這個變量的,切換到root的時候,這個變量就空了,所以需要重新export一下

 

 

第一個功能程序狀態 講解就結束了。

 

其實大多數人關心的是第二個功能開機啓動 問題

首選,我們需要明確的是:我們需要知道哪些應用具有開機啓動功能。

其實精確到應用還不可以,因爲我們不是要把應用禁止掉,而是要把接收開機啓動的Intent的receiver禁止掉,所以我們需要精確到class

首先我們來看看接收BOOT_COMPLETED的receiver在manifest中如何註冊的

Xml代碼 複製代碼 收藏代碼
  1. <receiver android:name=".BootReceiver" android:enabled="true">  
  2.     <intent-filter>       
  3.         <action android:name="android.intent.action.BOOT_COMPLETED"/>    
  4.     </intent-filter>  
  5. </receiver>  

這裏有一點是需要特別注意的: android:enabled="true"

enabled這個屬性,大多數情況下我們是不顯式寫在這裏的,當然,默認值就爲true

禁止開機啓動,其實就是設置接收BOOT_COMPLETED的receiver狀態爲disabled,即android:enabled="false"

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

開始我也搜索了一下,發現網上的很多方法都不可用,這裏給大家說明一下:

錯誤方法1

 

Java代碼 複製代碼 收藏代碼
  1. Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);   
  2. List<ResolveInfo> resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_RESOLVED_FILTER);  

這裏返回的list都是enabled的receiver

 

錯誤方法2

Java代碼 複製代碼 收藏代碼
  1. List<ApplicationInfo> allAppsList = mPackageManager.getInstalledApplications(0);   
  2. int allAppsListSize = allAppsList.size();   
  3. for (int i = 0; i < allAppsListSize; i++) {   
  4.     ApplicationInfo applicationInfo = allAppsList.get(i);   
  5.     PackageInfo packageInfo = mPackageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_RECEIVERS);   
  6.     ActivityInfo[] receivers = packageInfo.receivers;   
  7.     if(receivers != null) {   
  8.             ……   
  9.     }   
  10. }  

這裏獲得的也都是enable的

 

錯誤方法3

有的人使用下面代碼片斷

 

Java代碼 複製代碼 收藏代碼
  1. 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.

 

這樣,我們使用如下代碼就可以了

Java代碼 複製代碼 收藏代碼
  1. Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);   
  2. List<ResolveInfo> resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_DISABLED_COMPONENTS);  

然後我們需要知道組件的狀態,disabled還是enabled

Java代碼 複製代碼 收藏代碼
  1. ComponentName mComponentName = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);   
  2. Log.d(TAG, "COMPONENT_ENABLED_STATE:" + mPackageManager.getComponentEnabledSetting(mComponentName) + "\tpackageName:" + resolveInfo.activityInfo.packageName);  

接下來的事情就簡單了,如果你想禁止包名爲package的應用開機啓動,那麼只需在上面list中,找到所有此包下的receiver,然後

Shell代碼 複製代碼 收藏代碼
  1. pm disable package/class   
  2. 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)

Java代碼 複製代碼 收藏代碼
  1. private void setComponentEnabled(Class<?> clazz, boolean enabled) {   
  2.     final ComponentName c = new ComponentName(this, clazz.getName());   
  3.     getPackageManager().setComponentEnabledSetting(c,   
  4.             enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED   
  5.                     : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,   
  6.             PackageManager.DONT_KILL_APP);   
  7. }  
 

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章