iOS 11.3.1上使用bfinject注入dylib后的问题

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函数时就崩了。

看到异常了,是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.

又尝试了一下,SIGKILL - CODESIGNING跟root还是mobile貌似没关系。
我搞了个最简单的命令行程序,名叫hello,以及一个最简单的tweak,名叫hello.dylib,其plist这样写的:

{
	Filter = {
		Executables = (
			hello
		);
	};
}

做的尝试如下:

  1. 直接运行:./hello,log显示hello.dylib并未加载,以mobile身份运行su mobile -c ./hello,依然未加载
  2. 显式指定DYLD_INSERT_LIBRARIES方式运行DYLD_INSERT_LIBRARIES=/Library/MobileSubstrate/DynamicLibraries/hello.dylib su mobile -c ./hello,依然未加载
  3. 换成DYLD_INSERT_LIBRARIES=/usr/lib/tweakloader.dylib su mobile -c ./hello,模拟tweak的正常加载流程,依然未能被加载
  4. 用狗神提到的颅内炸弹insert_dylib方式强行插入hello.dylib,log显示加载成功。但是一旦hello.dylib中使用了MSHookFunction,就被killed 9,无论root身份还是mobile身份运行

疑问:

  1. DYLD_INSERT_LIBRARIES为何不起作用呢?已经是mobile身份,且自己写的命令行程序,根本没有__RESTRICT这玩意的
  2. 为何一旦hello.dylib中使用MSHookFunction,就被killed 9,难道MSHook只对AppStore程序有用,对命令行工具无效?应该不至于吧,iOS系统自带的各种daemon不也被照样hook的嘛,一定是我漏掉了什么东西吧。
1 个赞

签名下试试。

不是这个原因,我当然签名了的,不签名首先连最基本的程序都跑不起来的,我现在的现象是:
不调用MSHookFunction,跑得好好的,一旦加上调用MSHookFunction的代码,运行到该行,就被killed 9,我逐行打log测试的

你需要的是启动后暂停进程, 然后/electra/jailbreakd_client <pid> 1, 恢复运行, 然后才能MSHookFunction

2 个赞

感谢大佬回复,也就是说需要显式提权才行,我现在用的unc0ver,跟electra不太一样,似乎是没有jailbreakd_client的,还不知道有没有类似的接口给我,回头我换回electra再试试

再多问一句,我挺想知道原理的,为什么针对iOS自己的daemon(比如installed)的tweak里面可以直接使用MSHookFunction,是不是越狱工具会自动帮你提权?我大概跟踪了一下tweak的加载流程,先是通过DYLD_INSERT_LIBRARIES加载tweakloader,然后tweakloader会根据bundleid去dlopen对应的tweak dylib。似乎这个过程中没看到哪里有帮你提权的操作。

unc0ver虽然没有jailbreakd_client,但也是有libjailbreak.dylib的,回头我试试

原理我也不清楚, 他们管这叫platformize

1 个赞

试过了,Our大佬说的对,platformize后MSHookFunction就能用了
https://github.com/coolstar/electra/blob/master/docs/getting-started.md#platformizing-a-binary

1 个赞

楼主怎么解决的分享一下呗

上面贴出来了啊,调用platformize手动提权。我记得Electra for iOS 11最新的版本不需要手动platformize了