您好,登錄后才能下訂單哦!
問題描述:使用xcode生成 app后,將它放置/Applications 目錄下,但調用系統目錄的權限不足,導致reboot等命令不能執行.
解決問題方向: 將app具有root 權限.
解決方法:
1.suid位,在unix上用于表示文件權限,用于標識其他用戶執行該文件時是以文件的所有者來運行.僅對二進制可執行文件有效,若該文件屬于root時,當其他用戶執行文件時,相應地也就具有了root權限.
修改 suid 權限:
chmod u+s filename 設置SUID
chmod u-s filename 去掉SUID設置
設置了suid位,則文件在原來的x位"x"變成了"s"
#ls -l a.txt
-rwxrwxrwx 777
#chmod 4777 a.txt
-rwsrwxrwx ======>注意s位置
操作:
(1)在項目的main.m文件修改以下代碼:
int main(int argc, char *argv[]) { setuid(0); setgid(0); @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
(2)將打包好的RebootApp.app放在/Applications 目錄下,并將RebootApp.app/RebootApp 的權限加上suid,并將其所有者改為 root
chmod u+s RebootApp
chown root RebootApp
2. 增加引導程序
在第一步完成后,重啟設備,發現一打開應用就閃退.后來查資料才知道原因在于用戶打開應用時通過SpringBoard來啟動應用的中,而iOS在用戶打開應用的時候會進行權限檢測,它如果檢查到將以root運行應用程序時就不會執行.
解決方法:設置引導程序,通過引導程序打開應用, 就可以眺過SpringBoard的安全檢查,而引導程序是普通用戶權限,用戶可以直接打開.
操作:
(1) 將設備里的/Applications/RebootApp.app/RebootApp 文件改名為RebootApp_
(2) 在項目的main.m文件修改以下代碼:
int main(int argc, char *argv[]) { @autoreleasepool { NSString* string = [[NSBundle mainBundle] pathForResource:@"RebootApp_" ofType:nil];//RebootApp_是所要啟動的名字二進制文件名 argv[0] = (char*)[string UTF8String]; execve([string UTF8String], argv, NULL); return 0; } }
(3) 再編譯一次生成RebootApp.app,將RebootApp.app包里的RebootApp 通過ssh放到設備的 /Applications/RebootApp.app/目錄,重啟設備,打開應用,完成,程序具有root權限
參考文章:
http://blog.csdn.net/longhuihu/article/details/8907004
http://hi.baidu.com/lm382304817/item/4aa87eaa87c7f2746dd455ad
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。