android 핸드폰 루트 후의 안전 문제 (4)

안내: 본고는 어떻게 작동 금지를 실현하고 응용을 실효시키는지 소개한다.
각종 불량 소프트웨어나 바이러스를 만들지 않았으면 좋겠습니다.
이번 호에서는 다음과 같은 최적화 소프트웨어의 작동 최적화 기능에 주목한다.
부팅 금지 및 부팅 금지
많은 소프트웨어들이 모두 켜기 최적화 기능을 가지고 있는데, 예를 들면 360, 금산, 해탁......
저는 해탁 페이지가 괜찮은 것 같아서 해탁 사진 한 장만 캡처할게요.
오른쪽에 있는 작은 깃발을 클릭하면 몇 가지 옵션이 있습니다. 여기는 두 개만 말합니다.
전원 켜기 시작
프로그램 상태
android4.1(jelly bean)버전에서settings에서 응용 정보를 볼 수 있는 곳에disable 단추가 있습니다. 아래 그림과 같습니다.
disable에서 이 앱을 떨어뜨린 후, launcher 목록에서 조회할 수 없습니다. 즉, 이 앱을 시작할 수 없고, 합리적이지만, enable를 생각하면 좀 번거롭습니다.너는 settings의 응용 프로그램 목록에서 이 응용 프로그램을 찾아야 한다(일반적으로 출하된 휴대전화는 모두 몇 십 개의 응용 프로그램이 있는데 여기에 자신이 설치한 것을 더하면 응용 프로그램 수량이 100+가 되기 쉽다). 그리고enable를 찾아야 한다. 이때 launcher에서 이 응용 프로그램을 다시 볼 수 있다.
(ps: 알림 표시 여부도 조절할 수 있는데, 이 기능은 모두가 좋아할 것 같다)
그러나 4.0과 그 이전 버전에는 디스플레이라는 기능이 없었지만 루트가 핸드폰을 사용하면 우리는 이 기능을 실현할 수 있다.
일단 핸드폰에 뭐가 적용되는지 엔블러드인지 한번 볼게요.
$ 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가 어떤 변화가 있는지 보십시오. (루트 권한이 필요합니다. 이전의 검색은 루트 권한이 필요하지 않습니다.) 예를 들어:
pm disable cn.eoe.wiki
pm enable cn.eoe.wiki

주: 루트 사용자로 전환할 때pm을 실행하면 세그먼트 오류가 발생할 수 있습니다 (android 4.0+)
shell@android:/ # pm
[1] + Stopped (signal)     pm 
shell@android:/ # pm                                                           
[2] + Stopped (signal)     pm 
[1] - Segmentation fault   pm 

pm을 실행하기 전에 export LDLIBRARY_PATH
export LD_LIBRARY_PATH=/vendor/lib:/system/lib

저희가 이 변수를 한번 볼 수 있어요.
echo $LD_LIBRARY_PATH

내 기계 위에서 일반 사용자는 이 변수를 설정했는데 루트로 전환할 때 이 변수가 비었기 때문에 다시 export를 해야 한다
첫 번째 기능 프로그램 상태 설명이 끝났습니다.
사실 대부분의 사람들은 두 번째 기능의 작동 문제에 관심을 가지고 있다
우선, 우리가 명확하게 알아야 할 것은, 우리는 어떤 응용 프로그램이 부팅 기능을 가지고 있는지 알아야 한다는 것이다.
사실 응용까지 정확해서는 안 된다. 왜냐하면 우리는 응용을 금지하는 것이 아니라, 켜서 시작하는 Intent의receiver를 수신하는 것을 금지해야 하기 때문에class까지 정확해야 한다
일단 저희가 BOOT을 받는걸로...COMPLETED의receiver가 manfest에 어떻게 등록되었는지

        
         
    

여기에 특별히 주의해야 할 것이 하나 있다: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 resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_RESOLVED_FILTER);

여기 되돌아오는 리스트는 모두 enabled의receiver입니다.
잘못된 방법2
List 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) {
            ……
	}
}

여기서 얻은 것도 다 엔블이에요.
잘못된 방법3
어떤 사람은 아래의 코드 단편을 사용한다
if (PackageManager.PERMISSION_GRANTED == mPackageManager.checkPermission("android.permission.RECEIVE_BOOT_COMPLETED", app.packageName))

패키지는 왜 검사해?!
사실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 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);

다음 일은 간단합니다. 패키지라는 앱의 시작을 금지하려면 위의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 명령을 사용할 수 없습니다
원본 이메일(4.0) 응용 프로그램에서 이전에 이 기능이 있었다. 이메일 코드를 살펴보자.
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) 방법에도 참조 코드가 있음
이로써
전원 켜기 시작
프로그램 비활성화
다 설명했어.
우리는 해탁이라는 앱이 이렇게 많은 변태 기능을 가지고 있다는 것을 발견했다. 뜻밖에도 모든 사건을 금지할 수 있다니...이것은 좀 지나친 것 아닙니까? 그러나 프로그램의 원리는 모두 제 블로그에 있을 것입니다. 저는 모든 사건을 금지하는 이런 기능이 있기를 원하지 않습니다. 차라리 이 앱을 삭제하는 것이 낫습니다. 구태여 괴롭힐 필요가 있겠습니까?!
여러분 루트의 휴대전화로 소프트웨어를 마음대로 다운로드하지 마십시오. 더욱이 어떤 핑계로도 바이러스를 만들지 마십시오.
android 핸드폰 루트 후의 안전 문제 (1)
android 핸드폰 루트 후의 안전 문제 (2)
android 핸드폰 루트 후의 안전 문제 (3)
android 핸드폰 루트 후의 안전 문제 (4)
android 안전 문제 (1) 음소거 사진 및 찍기
android 보안 문제 (2) 시퀀스 자물쇠
안드로이드 보안 문제 (3) 낚시 프로그램
포스트잇은 아래 링크를 보존하십시오
본인
http://su1216.iteye.com/
http://blog.csdn.net/su1216/

좋은 웹페이지 즐겨찾기