天天看點

android安全漏洞(二) 程式鎖

導讀:本文介紹如何實作對應用加鎖的功能,無須root權限

某些人有時候會有這樣一種需求,小A下載下傳了個軟體,隻是軟體中的美女過于誘惑與暴露,是以他不想讓别人知道這是個什麼軟體,起碼不想讓别人打開浏覽。而這款軟體又沒有鎖,任何人都可以打開,腫麼辦呢?如果打開它的時候需要輸入密碼,那該多好阿!于是,程式鎖這種應用就産生了

程式鎖不是最近才有的,很久之前android就有這種apk了

這一期我們來苛刻如何實作程式加鎖功能

首先,我們先明确一下我們要做的程式具有什麼功能

1可以選擇需要加鎖的程式

2可以設定密碼

3可以關閉程式鎖

這裡作為示範,我們就盡量簡化代碼

我們先說最關鍵的部分

最關鍵的地方在于:當使用者打開一個應用的時候,怎麼彈出密碼頁面?

這裡沒有什麼太好的辦法,需要掃描task中的topActivity

首先,我們先獲得運作的task

Java代碼  

android安全漏洞(二) 程式鎖
  1. mActivityManager = (ActivityManager) context.getSystemService("activity");  
  2. //mActivityManager.getRunningTasks(1);//List<RunningTaskInfo>  

getRunningTasks方法傳回一個List,我們來看看這個List是什麼

getRunningTasks 寫道 Return a list of the tasks that are currently running, with the most recent being first and older ones after in order.

…… 

傳回的List是有序的,第一個是最近的,是以我們取出第一個即可,然後得到此task中的最上層的Activity

Java代碼  

android安全漏洞(二) 程式鎖
  1. ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;  

topActivity居然是ComponentName類型,下面的事情就好辦了,獲得包名和類名

Java代碼  

android安全漏洞(二) 程式鎖
ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;  
    String packageName = topActivity.getPackageName();  
    String className = topActivity.getClassName();  
    Log.v(TAG, "packageName" + packageName);  
    Log.v(TAG, "className" + className);  
      
    if (testPackageName.equals(packageName)  
            && testClassName.equals(className)) {  
        Intent intent = new Intent();  
        intent.setClassName("com.example.locktest", "com.example.locktest.PasswordActivity");  
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        mContext.startActivity(intent);  
    }  
           

由于我沒有選擇程式這一步,是以我就固定一個應用做測試,這裡選擇的是htc的note應用

Java代碼  

android安全漏洞(二) 程式鎖
  1. String testPackageName = "com.htc.notes";  
  2. String testClassName = "com.htc.notes.collection.NotesGridViewActivity";  

下面我們該想,這段代碼何時執行了

打開一個應用程式,系統不會發送廣播,我們無法直接監聽,是以這裡我們采取定時掃描的政策

這裡隻是一個簡單的實作,之後我們再讨論優化

我們采取每秒中檢查一次task的方式,這裡使用Timer吧,用Handler也一樣可以實作

Java代碼  

android安全漏洞(二) 程式鎖
private Timer mTimer;  
    private void startTimer() {  
        if (mTimer == null) {  
            mTimer = new Timer();  
            LockTask lockTask = new LockTask(this);  
            mTimer.schedule(lockTask, 0L, 1000L);  
        }  
    }  
           

到這裡,其實我們的關鍵代碼就已經完成了

下面貼出完整帶代碼,注意:我們隻關注彈出鎖界面這部分,其他部分自行實作(比如文章末尾提到的)

Task,負責檢查task,并在适當的時候彈出密碼頁面

Java代碼  

android安全漏洞(二) 程式鎖
public class LockTask extends TimerTask {  
        public static final String TAG = "LockTask";  
        private Context mContext;  
        String testPackageName = "com.htc.notes";  
        String testClassName = "com.htc.notes.collection.NotesGridViewActivity";  
      
        private ActivityManager mActivityManager;  
      
        public LockTask(Context context) {  
            mContext = context;  
            mActivityManager = (ActivityManager) context.getSystemService("activity");  
        }  
      
        @Override  
        public void run() {  
            ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;  
            String packageName = topActivity.getPackageName();  
            String className = topActivity.getClassName();  
            Log.v(TAG, "packageName" + packageName);  
            Log.v(TAG, "className" + className);  
      
            if (testPackageName.equals(packageName)  
                    && testClassName.equals(className)) {  
                Intent intent = new Intent();  
                intent.setClassName("com.example.locktest", "com.example.locktest.PasswordActivity");  
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                mContext.startActivity(intent);  
            }  
        }  
    }  

 
           

LockService,負責執行定時任務,取消任務等

Java代碼  

android安全漏洞(二) 程式鎖
public class LockService extends Service {  
        private Timer mTimer;  
        public static final int FOREGROUND_ID = 0;  
      
        private void startTimer() {  
            if (mTimer == null) {  
                mTimer = new Timer();  
                LockTask lockTask = new LockTask(this);  
                mTimer.schedule(lockTask, 0L, 1000L);  
            }  
        }  
      
        public IBinder onBind(Intent intent) {  
            return null;  
        }  
      
        public void onCreate() {  
            super.onCreate();  
            startForeground(FOREGROUND_ID, new Notification());  
        }  
      
        public int onStartCommand(Intent intent, int flags, int startId) {  
            startTimer();  
            return super.onStartCommand(intent, flags, startId);  
        }  
      
        public void onDestroy() {  
            stopForeground(true);  
            mTimer.cancel();  
            mTimer.purge();  
            mTimer = null;  
            super.onDestroy();  
        }  
    }  
           

MainActivity,測試用,作為應用入口,啟動service(産品中,我們可以在receiver中啟動service)。

Java代碼  

android安全漏洞(二) 程式鎖
public class MainActivity extends Activity {  
      
        public void onCreate(Bundle savedInstanceState){  
            super.onCreate(savedInstanceState);  
            startService(new Intent(this, LockService.class));  
        }  
    }  
           

PasswordActivity,密碼頁面,很粗糙,沒有核對密碼邏輯,自行實作

記得重寫onBackPressed函數,不然按傳回鍵的時候……你懂的

Java代碼  

android安全漏洞(二) 程式鎖
public class PasswordActivity extends Activity {  
      
        private static final String TAG = "PasswordActivity";  
        Button okButton;  
        EditText passwordEditText;  
        private boolean mFinish = false;  
          
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.password);  
            passwordEditText = (EditText) findViewById(R.id.password);  
             okButton = (Button) findViewById(R.id.ok);  
             okButton.setOnClickListener(new View.OnClickListener() {  
                public void onClick(View v) {  
                    String password = passwordEditText.getText().toString();  
                    Log.v(TAG, "password" + password);  
                    mFinish = true;  
                    finish();  
                }  
            });  
        }  
      
        public void onBackPressed(){}  
          
        public void onPause(){  
            super.onPause();  
            if(!mFinish){  
                finish();  
            }  
        }  
    }  
           

xml這裡就不貼了,記得添權重限

Xml代碼  

android安全漏洞(二) 程式鎖
  1. <uses-permission android:name="android.permission.GET_TASKS"/>  

關于程式的其他部分,這裡隻做簡要說明

選擇應用對其進行加鎖部分

1列出系統中所有程式(你也可以自由發揮,比如過濾掉原始應用)

2選擇,然後存入資料庫(當然,最好也有取消功能,記得從資料庫中删除資料)

程式鎖總開關

可以使用sharedPreference,設定一個boolean開關

現在,當我想要打開htc的note應用的時候,就會彈出密碼頁面當我解鎖,按home會回到桌面,長按home,點選note,還是會彈出密碼框

因為是每秒檢查一次,是以可能會有一點點延遲,你可以設定為500毫秒,但是越頻繁,占用資源就越多

上面的代碼我取得topActivity後檢查了其包名行和類名,是以隻有當打開指定的頁面的時候,才會彈出密碼鎖

比如我對Gallery應用加密了,但是使用者正在編輯短信,這時候它想發彩信,于是他通過短信進入到了Gallery……

對于某些使用者的某些需求來說,這是不能容忍的,這時,我們隻需簡單修改下判斷邏輯即可:隻檢查包名,包名一緻就彈出密碼鎖,這樣就完美了

程式鎖我就分析到這裡

最後一句

當使用程式鎖的時候,你長按home,發現程式鎖也出現在“最近的任務”中,腫麼辦……給此activity設定android:excludeFromRecents="true"即可

android手機root後的安全問題 (一)

android手機root後的安全問題 (二)

android手機root後的安全問題 (三)

android手機root後的安全問題 (四)

android安全問題(一) 靜音拍照與被拍

android安全問題(二) 程式鎖

android安全問題(三) 釣魚程式

請大家不要用root的手機随意下載下傳軟體,更不要以任何借口制造任何病毒!

轉貼請保留以下連結

本人blog位址

http://su1216.iteye.com/

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

繼續閱讀