首页
社区
课程
招聘
[原创]解密iOS内核镜像kernelcache以及dump内核数据结构
发表于: 2017-3-31 23:53 27147

[原创]解密iOS内核镜像kernelcache以及dump内核数据结构

2017-3-31 23:53
27147

解密iOS内核镜像kernelcache以及dump内核数据结构

zhuliang

前言

我们知道很长的一段时间固件内的iOS内核都是加密的,这不方便我们的研究分析,本文介绍几种方法解密iOS内核以能拖进ida pro分析。有时仅仅ida pro静态分析远远不够,如想了解kernel_pmap结构,还需要dump内核,本文介绍一种读内核任意地址,也就是dump内核的方法。

解密kernelcache

直到iOS10,内核kernelcache都是加密的,要分析它,就要先进行解密。有以下三种方法。

1.  OTA更新固件解压,OTA固件(https://ipsw.me/otas)里的kernecache是不加密的。下载解压便能拖到ida里进行分析。

2.  解密再解压。由于img3的解密网上已有很多例子,这里以iPhone5s设备iOS9的固件为例子。先到https://www.theiphonewiki.com查到固件对应keyiv,然后执行如下命令进行解密。

dd if=kernelcache.release bs=52 skip=1 | openssl aes-256-cbc -iv 06ae5b6dce2bc7c7299d0f55b066d680 -K 13c4bd389af426285e68d22c396e208f51c5d02b3dd5d3d42e01a3ce905d2c4b -nopad -d > kernelcache.d

再进行解压,如下

./lzssdec -o 0x180 < kernelcache.d > kernelcache.d.bin

至此,便可拖进ida pro进行分析。

3.  从越狱设备上dump

上面方法2要依赖keyiv,有些固件是查不到对应的keyiv的。这种情况可以考虑从越狱的设备上dump内核。要读写内核先要调用task_for_pid函数获取内核的消息端口,这需要相关的越狱工具在内核打了task_for_pid对应的patch。这就是为什么在越狱的iOS9下调用task_for_pid不能成功的原因,因于启用了KPP保护,盘古越狱没有打task_for_pid的补丁。

是不是意味着在iOS9下没法dump内核呢?上帝关上一扇门,盘古却打开了一扇窗。经研究发现,盘古越狱虽然没有打task_for_pid的补丁。但是却把内核的消息端口放到了数值为4的特别端口。见如下的代码:

kern_return_t task_for_ios9_pid(mach_port_name_t target_tport,int pid,mach_port_name_t *kernel_task)

{

    kern_return_t kr;


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
打赏 + 51.00雪花
打赏次数 2 雪花 + 51.00
 
赞赏  iPhone-ios   +50.00 2022/07/07
赞赏  CCkicker   +1.00 2017/05/22
最新回复 (7)
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
感谢zhuliang大神,已收录进资源导航帖。
2017-4-1 09:28
0
雪    币: 2735
活跃值: (2171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
ios10的固件都不加密了。。。。
2017-4-1 16:40
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
kdump 在iOS8.1下执行失败
2017-4-1 22:56
0
雪    币: 320
活跃值: (104)
能力值: (RANK:180 )
在线值:
发帖
回帖
粉丝
5

因為我的  xcode  不是放在  /Applications  編譯時會出現  ld:  warning:  directory  not  found  for  option  訊息
Makefile  修正  自動找尋  gcc  跟  sdk  路
IGCC_SDKROOT  =  $(shell  xcrun  -sdk  iphoneos  -show-sdk-path)

2017-5-2 08:24
0
雪    币: 371
活跃值: (67)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
6
确认第一种方法可以直接放到ida里边分析吗?下载还是需要走第二步才可以的。
2017-7-4 21:18
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
我用的iOS9..1越狱环境,执行kdump失败。
[ERROR] task_for_pid Line 21, result=00000005:
Calling host_get_special_port(mach_host_self(),0,4,kernel_task),sucess!
[ERROR] task_for_pid Line 21, result=00000005:
Calling host_get_special_port(mach_host_self(),0,4,kernel_task),sucess!
[*] found kernel base at address 0xffffff8010802000
[*] reading kernel header...
[ERROR] task_for_pid Line 21, result=00000005:
Calling host_get_special_port(mach_host_self(),0,4,kernel_task),sucess!
[*] restoring segments...
Segmentation fault: 11
楼主,如果看到了,麻烦提点下,谢谢!
2020-2-13 17:47
0
雪    币: 487
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
码一下
2021-12-4 23:36
0
游客
登录 | 注册 方可回帖
返回
//