iOS kernel初探

0x00 背景

在debug iOS App的时候,我发现什么StoreKit、UIKit之类的库在iOS设备上怎么也找不到,于是想探索一下这些库到底存储在了哪里。其实本文与iOS kernel并无太大关系。

0x01 现象

当我debug一个demo app的时候,在lldb中显示加载的image,发现UIKit的路径竟然是Mac上的路径,这不科学,我是在debug iOS的app呀。

(lldb) imlist UIKit
[  8] 0ACB1223-8243-3154-9D21-7A9941528BDF 0x000000018b53c000 /Users/nevermoe/Library/Developer/Xcode/iOS DeviceSupport/11.0.3 (15A432)/Symbols/System/Library/Frameworks/UIKit.framework/UIKit 
[ 20] 740D9A12-EDE8-3746-A3D7-24BC26C3CFA6 0x00000001016b4000 /private/var/containers/Bundle/Application/DD5D633B-EEF7-4512-9732-ECF61D86E973/App1.app/Frameworks/libswiftUIKit.dylib (0x00000001016b4000)
[176] 5B9452AE-2DBC-36D6-A9A0-6EE70CD5630F 0x000000018b4ea000 /Users/nevermoe/Library/Developer/Xcode/iOS DeviceSupport/11.0.3 (15A432)/Symbols/System/Library/Frameworks/UIKit.framework/Frameworks/DocumentManager.framework/DocumentManager 

在仔细看看UIKit被加载的地址:0x000000018b53c000。用J大神开发的procexp.universal来看一下:

iPhone:~ root# procexp.universal {pid}

Output:

...
Shared PMAP            0x00000000 0000000183000000-0000000190000000 [ 208M]r--/r-- NUL 
...

可以发现UIKit的地址位于一个Shared PMAP的内存中。我们要查出来这个内存是哪个文件映射的。

0x02 分析iOS 11的kernel

  1. 从iphonedevwiki上下载iOS 11的内核ipsw文件,并解压。
  2. iOS 10之后内核都没有加密了,解压后有一个超过1G的dmg文件,就是iOS的RootFS,如果你是Mac的话直接双击可以mount。
  3. /Users/nevermoe/Library/Developer/Xcode/iOS DeviceSupport/11.0.3 (15A432)/Symbols/System/Library/PrivateFrameworks/StoreServicesCore.framework/StoreServicesCore中随便找了个字符串setFileDirectoryPath,在RootFS里grep一下这个字符串,发现/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64这个文件里有这个字符串,切这个文件有1个G那么大,估计大概率就是所有大Framework库都保存在了这里。
  4. 再去iPhone上看一下,这个文件也是存在的。这个时候我再去谷歌一下这个文件,发现iphonedevwiki早有对这个文件的记录:http://iphonedevwiki.net/index.php/Dyld_shared_cache...到这里分析就结束了,如果还有兴趣可以自行按照iphonedevwiki对这个巨大对cache进行抽取分析。

0x03 misc

在找这个文件的时候,正好发现了kernel_cache,因为iOS 10之后kernel_cache没有加密,可以直接使用J大神的joker

./joker.universal  -dec kernelcache.release.iphone6

来解压出kernel_cache,解压后的文件路径为/tmp/kernel