abcc
(abcc)
2018 年11 月 8 日 12:24
1
unc0ver越狱,iOS 11.3.1(这个问题应该跟使用哪种越狱工具无关)
使用bfinject往一个root daemon注入了一个dylib,该dylib会使用MSHookFunction来hook一些c函数,比如time。
hook是成功的,没闪退,但程序本体调用到time的时候,就挂了
我redirect了stdout和stderr到文件,也没看到崩溃信息,也调用NSSetUncaughtExceptionHandler注册了异常处理并打log,结果也没打出来……不知道怎么诊断了。
hook的实现也试过使用frida-gum,也是一样的效果。hook本身是成功的,我特意在hook后调用了一遍,正常,就是在程序自己调用到被hook函数时就崩了。
abcc
(abcc)
2018 年11 月 13 日 07:31
2
看到异常了,是EXC_BAD_ACCESS (SIGKILL - CODESIGNING)
,看来被内核杀了?
是不是因为现在11上的jb都是KPPless的原因,导致没法hook root权限的进程?
bfinject的readme中有这么一段话,看上去能解释我这个现象,然而作为一个菜鸟,还是希望大神能来确认下,到底是不是这个原因,还是我自己哪里没弄对:
However, Electra and LiberiOS are KPPless, which means they don’t patch anything in the kernel; not a single byte. This is because of Kernel Patch Protection (“KPP”), an Apple security technology that does sophisticated kernel introspection to detect and thwart kernel patches. As a result, kernel codesigning checks are still intact.
abcc
(abcc)
2018 年11 月 14 日 04:00
3
又尝试了一下,SIGKILL - CODESIGNING
跟root还是mobile貌似没关系。
我搞了个最简单的命令行程序,名叫hello
,以及一个最简单的tweak,名叫hello.dylib
,其plist这样写的:
{
Filter = {
Executables = (
hello
);
};
}
做的尝试如下:
直接运行:./hello
,log显示hello.dylib并未加载,以mobile身份运行su mobile -c ./hello
,依然未加载
显式指定DYLD_INSERT_LIBRARIES方式运行DYLD_INSERT_LIBRARIES=/Library/MobileSubstrate/DynamicLibraries/hello.dylib su mobile -c ./hello
,依然未加载
换成DYLD_INSERT_LIBRARIES=/usr/lib/tweakloader.dylib su mobile -c ./hello
,模拟tweak的正常加载流程,依然未能被加载
用狗神提到的颅内炸弹insert_dylib
方式强行插入hello.dylib,log显示加载成功。但是一旦hello.dylib中使用了MSHookFunction,就被killed 9,无论root身份还是mobile身份运行
疑问:
DYLD_INSERT_LIBRARIES
为何不起作用呢?已经是mobile身份,且自己写的命令行程序,根本没有__RESTRICT
这玩意的
为何一旦hello.dylib中使用MSHookFunction,就被killed 9,难道MSHook只对AppStore程序有用,对命令行工具无效?应该不至于吧,iOS系统自带的各种daemon不也被照样hook的嘛,一定是我漏掉了什么东西吧。
1 个赞
abcc
(abcc)
2018 年11 月 15 日 14:18
5
不是这个原因,我当然签名了的,不签名首先连最基本的程序都跑不起来的,我现在的现象是:
不调用MSHookFunction,跑得好好的,一旦加上调用MSHookFunction的代码,运行到该行,就被killed 9,我逐行打log测试的
你需要的是启动后暂停进程, 然后/electra/jailbreakd_client <pid> 1
, 恢复运行, 然后才能MSHookFunction
2 个赞
abcc
(abcc)
2018 年11 月 16 日 03:09
7
感谢大佬回复,也就是说需要显式提权才行,我现在用的unc0ver,跟electra不太一样,似乎是没有jailbreakd_client的,还不知道有没有类似的接口给我,回头我换回electra再试试
再多问一句,我挺想知道原理的,为什么针对iOS自己的daemon(比如installed)的tweak里面可以直接使用MSHookFunction,是不是越狱工具会自动帮你提权?我大概跟踪了一下tweak的加载流程,先是通过DYLD_INSERT_LIBRARIES加载tweakloader,然后tweakloader会根据bundleid去dlopen对应的tweak dylib。似乎这个过程中没看到哪里有帮你提权的操作。
abcc
(abcc)
2018 年11 月 16 日 03:20
8
unc0ver虽然没有jailbreakd_client,但也是有libjailbreak.dylib的,回头我试试
opened 05:40AM - 20 Jan 18 UTC
closed 12:27AM - 20 Jul 18 UTC
If try to attach:
```
iPhone:/bootstrap/usr root# ./debugserver *:1234 -a AppS… tore
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-360.0.26.14
for arm64.
Attaching to process AppStore...
error: failed to attach to process named: "" (os/kern) invalid argument
Exiting.
```
If tried to launch:
```
iPhone:/bootstrap/usr root# ./debugserver *:1234 /Applications/AppStore.app/AppStore
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-360.0.26.14
for arm64.
error: failed to launch process ./debugserver: (os/kern) invalid argument
Exiting.
```
Some kernel log maybe helpful:
```
Jan 20 13:43:45 Xuans-iPhone debugserver[298] <Notice>: In completion handler, got pid for bundle id, pid: 299.
Jan 20 13:43:45 Xuans-iPhone debugserver[298] <Notice>: 1 +0.000000 sec [012a/0303]: error: ::task_set_exception_ports ( task = 0x2807, exception_mask = 0x000013fe, new_port = 0x200b, behavior = 0x80000001, new_flavor = 0x00000005 ) err = (os/kern) invalid argument (0x00000004)
Jan 20 13:43:45 Xuans-iPhone debugserver[298] <Notice>: Could not get inferior's Mach exception port, sending ptrace PT_KILL and exiting.
Jan 20 13:43:45 Xuans-iPhone debugserver[298] <Notice>: 2 +0.000221 sec [012a/0303]: RNBRunLoopLaunchInferior DNBProcessLaunch() returned error: '(os/kern) invalid argument'
Jan 20 13:43:45 Xuans-iPhone SpringBoard(FrontBoard)[230] <Notice>: [FBProcessManager] Removing: <FBProcess: 0x1c03093f0; debugserver; pid: -1>
```
I signed a copy of debugserver with below entitlements with jtool:
```
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>platform-application</key>
<true/>
<key>com.apple.backboardd.debugapplications</key>
<true/>
<key>com.apple.backboardd.launchapplications</key>
<true/>
<key>com.apple.diagnosticd.diagnostic</key>
<true/>
<key>com.apple.frontboard.debugapplications</key>
<true/>
<key>com.apple.frontboard.launchapplications</key>
<true/>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>com.apple.springboard.launchapplications</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.assertiond.app-state-monitor</key>
<true/>
<key>com.apple.private.network.socket-delegate</key>
<true/>
<key>com.apple.mobileactivationd.network-security-disabled</key>
<true/>
<key>com.apple.networkd_privileged</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>com.apple.system-task-ports</key>
<true/>
</dict>
</plist>
```
原理我也不清楚, 他们管这叫platformize
1 个赞
abcc
(abcc)
2018 年11 月 16 日 10:12
10
1 个赞
abcc
(abcc)
2019 年6 月 27 日 14:51
12
上面贴出来了啊,调用platformize手动提权。我记得Electra for iOS 11最新的版本不需要手动platformize了