[原创]解密iOS内核镜像kernelcache以及dump内核数据结构
解密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上查到固件对应key和iv,然后执行如下命令进行解密。
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要依赖key和iv,有些固件是查不到对应的key和iv的。这种情况可以考虑从越狱的设备上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;
kr = task_for_pid(target_tport, pid, kernel_task);
if ( kr )
{
printf("[ERROR] %s Line %d, result=%08x: \n","task_for_pid",__LINE__,kr);
kr = host_get_special_port(mach_host_self(),0,4,kernel_task);
if ( kr )
{
printf("[ERROR] %s Line %d, result=%08x: \n","host_get_special_port",__LINE__,kr);
}
else
{
printf("Calling host_get_special_port(mach_host_self(),0,4,kernel_task),sucess!\n");
}
}
return kr;
}
本文附件是开源的ios-kern-utils工具,但是该工具在iOS9下不能正常工作的,本人进行了上述修改,能让它顺利工作了。利用它里面的kmem,kmap,kdump等几个程序可以dump内核分析。
