2015年3月2日 星期一

讓app具有root權限 using iOSOpenDev


首先在這之前要先將Xcode專案轉成iOSOpenDev,這篇~

SpringBoard在開啟app的時候如果發現設定了管理者權限就會閃退,所以直接編譯過去的app正常來說會閃退,只要拿編譯出來的deb檔案在另外安裝就好了



先拿之前Xcode專案轉iOSOpenDev的專案來修改,一般正常情況下在iDevice上的user id和group id都是501

首先在main.m設定權限
setuid(0); setgid(0);

2015/11/28

增加這個會造成一些一鍵關閉所有app的tweak權限錯誤,讓springboard當機,就"別加setuid()和setgid()"。

如果要判斷權限的話,使用geteuid(),root權限傳回0,mobile傳回501。


接著要講一下要跑root權限的原理,首先要安裝在root的Applications資料夾底下(/Applications),只要打包成deb就好了,接著在執行app時,是SpringBoard執行在app資料夾底下的可執行文件,而這個可執行文件可以是普通的Script,所以我們可以用這個普通的Script去執行我們app真正的可執行文件來達到root權限,大概也很難懂所以直接來動手做


到這個位置Package->DEBIAN

在這邊可以新增四個檔案,「preinst」、「postinst」、「prerm」和「postrm」
看名字可以猜出功能,pre就是之前、post是之後、inst是安裝、rm是移除,這四個檔案就是可以在安裝前後或是移除前後執行的Script,這邊需要安裝後和移除前(當然也可以硬幹自己打包deb,可是根據之前經驗,很麻煩而且不一定會成功)

touch postinst
chmod +x postinst
touch prerm
chmod +x prerm

因為是可執行文件,所以記得要chmod增加執行權限

新增完後這兩個檔案拉進Xcode專案對應的位置裡面


將以下貼到postinst,然後app名字要修改成自己app的名字
#!/bin/bash

cd "/Applications/rootApp.app/"

# process origin binary
mv rootApp rootApp_
chown root.wheel rootApp_
chmod +s         rootApp_

cont=`cat <<"EOF"
#!/bin/bash
dir=$(dirname "$0")
exec "${dir}"/rootApp_ "$@"
EOF
`
# create new fake binary
echo -e "$cont" > rootApp
chown root.wheel  rootApp
chmod +x          rootApp

#如果需要安裝完讓cydia提示重新啟動springBoard
declare -a cydia
cydia=($CYDIA)

if [[ $1 == install || $1 == upgrade ]]; then
if [[ ${CYDIA+@} ]]; then
eval "echo 'finish:restart' >&${cydia[0]}"
fi
fi

exit

簡單簡單講一下這些指令的作用

1. 首先將原本可執行文件「rootApp」改名「rootApp_」
2. 將「rootApp_」權限改成root擁有,群組為wheel
3. 將「rootApp_」加上「s」的權限,讓權限可以保持(這個我不清楚,關鍵字suid、sgid)
4. 將「rootApp」內容改成執行「rootApp_」的Script
5. 將「rootApp」權限改成root擁有,群組為wheel
6. 將「rootApp」加上可執行權限「x」

當然這些步驟可以自己硬幹啦,不過我上面也講了很容易失敗就是了,還要小心.DS_Store檔案被包進去...

接著在prerm裡面新增
#!/bin/bash
rm -f "/Applications/rootApp.app/rootApp_"

因為「rootApp_」是在安裝後被新增出來的,所以如果用一般移除的話這個檔案會被留下來

接著完成後要用「Product」->「Build For」->「Profiling」(Shift+Command+I),接著在兩個地方都會有打包好的deb檔案
1. iDevice上的「/var/root/iOSOpenDevPackages」
2. 專案底下的「Packages」





那既然iDevice上有就直接安裝吧省著用ssh(記得不能打開cydia),只要返回值是0就代表安裝完成了,不過安裝完後不一定會馬上出現,要respring
或者指令(以mobile使用者權限執行uicache指令):
su mobile -c /usr/bin/uicache

另外要確定的方法就是到「/Applications/你的app.app」下確認有沒有檔案


UID和GID都是0表示成功,要移除app要到cydia上移除



用iOSOpenDev真的方便很多,之前只能全部手動非常麻煩

這個專案的github: rootApp



參考
iOSOpenDev-root-app: 'https://github.com/kivlara/iOSOpenDev-root-app'

沒有留言:

張貼留言