脫殼時寫patch補丁時Native代碼並無過高的權限,以致於如文件IO、網絡IO等基本的C函數都沒法使用,提示權限不足。在網上搜索了資料大體進行如下幾種嘗試:html
一、APK在安裝時會在/data/system/packages.xml記錄當前app須要申請的權限,以下:java
<package name="com.example.unpacker" codePath="/data/app/com.example.unpacker-1.apk" nativeLibraryPath="/data/app-lib/com.example.unpacker-1" flags="572998" ft="1504bc58f90" it="1504bad7c65" ut="1504bc5913e" version="1" userId="10078"> <sigs count="1"> <cert index="9" key="xxx" /> </sigs> <perms> <item name="android.permission.ACCESS_WIFI_STATE" /> <item name="android.permission.CHANGE_NETWORK_STATE" /> <item name="android.permission.ACCESS_NETWORK_STATE" /> <item name="android.permission.INTERNET" /> <item name="android.permission.CHANGE_WIFI_STATE" /> </perms> <signing-keyset identifier="1" /> </package>
嘗試將全部權限添加到此packages.xml裏沒有做用,測試失敗,具體緣由之後再看android
二、直接繞過permission驗證修改framework代碼,相關參考http://www.cnblogs.com/GnagWang/archive/2011/03/21/1990507.html 網絡
ActivityManagerService.java (frameworks\base\services\java\com\android\server\am)中將checkPermission、checkCallingPermission、enforceCallingPermission函數返回值修改成PERMISSION_GRANTED,修改後編譯framework.jar、framework2.jar、services.jar而後刷入機器測試發現此修改容易形成系統起不來,不穩定,具體緣由之後再看;app
三、修改zygote fork後的進程的權限,zygote fork進程最終會調用forkAndSpecializeCommon函數,在forkAndSpecializeCommon中會判斷是否是啓動systemserver進程仍是其它app進程,其它進程的話permittedCapabilities和effectiveCapabilities將設置成0ide
文件名:/dalvik/vm/native/dalvik_system_Zygote.cpp函數
if (isSystemServer) { /* * Don't use GET_ARG_LONG here for now. gcc is generating code * that uses register d8 as a temporary, and that's coming out * scrambled in the child process. b/3138621 */ //permittedCapabilities = GET_ARG_LONG(args, 5); //effectiveCapabilities = GET_ARG_LONG(args, 7); permittedCapabilities = args[5] | (int64_t) args[6] << 32; effectiveCapabilities = args[7] | (int64_t) args[8] << 32; } else { mountMode = args[5]; permittedCapabilities = effectiveCapabilities = 0; //其它app進程則容許權限和有將權限清o //將上一行修改成 permittedCapabilities = effectiveCapabilities = 125910048; StringObject* seInfoObj = (StringObject*)args[6]; if (seInfoObj) { seInfo = dvmCreateCstrFromString(seInfoObj); if (!seInfo) { ALOGE("seInfo dvmCreateCstrFromString failed"); dvmAbort(); } } StringObject* niceNameObj = (StringObject*)args[7]; if (niceNameObj) { niceName = dvmCreateCstrFromString(niceNameObj); if (!niceName) { ALOGE("niceName dvmCreateCstrFromString failed"); dvmAbort(); } } }
所以直接強制將app啓動進程時的容許權限和有效權限全設置成固定的就能夠實現權限繞過:測試
編譯Libdvm.so拷貝到手機發現如今進程權限已經和system_server權限同樣了。spa