Root高版本闪退问题


#1

请教个问题,就是狗神的root方式是sh脚本去启动二进制文件在ios8和9上面没问题,但是在ios10.3.3越狱机器上面出现闪退,似乎已经不适用了。
至于代码见http://iosre.com/t/run-an-app-as-root-on-ios/239/62 帖子。


#2

@Ouroboros 请教下


#3

@Micro_yangs 我也遇到相同的问题(也是iOS 10.3.3),场景是想APP提权调用系统命令,NSTask的方式试过不能,才想到试试直接提权APP的方式,结果和也是直接被kill,查看日志猜想是SpringBoard发送launch app request的过程中增加了某种机制,禁止了带有UI界面的APP以root方式运行(类似Windows中的以管理员身份运行)。所以以前的方法不支持iOS 10(其他版本未测试过)。最后想到的办法是用Daemon
方式提权调用系统命令.


#4

题外话,如果场景只是调用很简单的系统命令,比如 ps 之类的,NSTask还是可以用的。而我的情况是比较复杂,NSTask不能满足要求


#5

能具体点么,Daemon如何让sp启动我的二进制不出意外?


#6

我的做法是把需要root权限执行的代码放到daemon中执行,APP执行不需要root权限的代码。至于APP直接root方式启动,没成功。


#7

没成功么?


#8

做成 daemon 的话就是root全新了,app的提权没有成功


#9

确实sh不行了,以前icleaner就是这么干的,更新后的版本里直接变成一个二进制程序了,所以App直接root是可以的。直接在代码里加 setuid(0),然后app放到/Applications/下,然后在10.3.3下需要正确的entitlement,我的做法是ldid -e 从cydia运行文件里抽出 entitlement,然后把这个entitlement,ldid -S到你的二进制文件中,这样就可以运行。


#10

您好,尝试了您的说法,没有成功呢,方便发下详细点的步骤和脚本吗?


#11

我下面的方法是针对64位的,没有32位机器不清楚情况,是个简单的在GUI界面调用shell脚本的程序,在10.3.3 越狱工具下是 doubleH3lix

假设GUI程序 差不多是这样
int main(int argc, char *argv[]){
@autoreleasepool
{
// Set uid and gid
if (!(setuid(0) == 0))
{
NSLog(@“Failed to gain root privileges, aborting…”);
exit(EXIT_FAILURE);
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
}
}
假设你最终开发的程序是 test.app,如果你是直接xcode开发部署到机器上,一开始的安装地址应该是在/var/containers/Bundle/Application/xxx-xxx下,当然此时运行就会闪退,因为不允许调用setuid(0),然后把这个xxx-xxx下的test.app拷贝出来,放进 /Applications/test.app,在桌面上删除原来的用户程序test,进入test.app设置运行的主程序test 运行者为root:wheel,在/Applications/下的程序都是需要root用户的,不能是mobile,之前我好像忘记提这步了
一般是这个命令,设置运行权限
chown root:wheel +二进制文件
chmod 4755 + 二进制文件
最后重新加上 entitlement,因为默认有一项原来的en’titlement里面没有,但我忘记是哪个了,看g0blin的越狱开发者曾经提到,ldid -e cydia > my.ent, 然后拷贝my.ent到你的test.app文件夹中,ldid -Smy.ent test , -S后面不要加空格,我的一个程序就是这个步骤,没有自动脚本。有个叫 autoentitle的包好像会做自动entitlement的事情,你可以搜搜,不过那个针对ios11的,调用的是jtool,和ldid功能差不多,ldid更简单一点