首页
社区
课程
招聘
【OSG】joker-使用joker抽取iOS 11的kernelcache
发表于: 2017-9-18 22:31 19308

【OSG】joker-使用joker抽取iOS 11的kernelcache

2017-9-18 22:31
19308

joker是一个iOS kernelcache处理工具。Apple尽可能的使kernel的逆向变得困难:每一个新版本发布时,都会有更多的符号被移除。预链接的kernelcache需要少量的符号来开始,而且kernelcache是被加密的。在@xerub和其他人的努力下,32位的kernelcache可以被解密,但是64位的kernelcache由于没有公开的key,唯一的方式就是dump kernelcache。

这些困难并没有阻止越狱者,而且以后也不会。Joker是我向社区和逆向者提供的另一个贡献,它使用与jtool相同的machlib,实际上他们可以很好的一起使用。

joker主要是为iOS开发的,但由于iOS与OS X的XNU数据结果几乎相同,它也可以通过一些参数(-m,-s)对OS X kernel进行处理。

译者注: iOS10以后kernelcache不再被加密

#用法示例

joker会显示一些帮助信息

-m: 导出Mach陷阱与MIG表

-a: 导出所有信息

-k: 导出kext信息

-K: 导出特定或全部kext bundle

-S: 导出sysctl

-s: 导出UNIX系统调用

-j: 与jtool协作使用

不使用参数,joker可以通过LC_SOURCE_VERSION为你提供文件的简要标示和sysent表地址

由于在LINKEDIT和PRELINK_INFO被移除之前,可以完全获取32位kernelcache,joker可以同时列出和提取kexts bundle:

只需要指定kext名称就可以提取对应的kext bundle。

使用-S选项可以获取到完整的__sysctl_set的dump。这个很有用,因为sysctl描述符包含很多有用的内核地址、变量、处理程序:

译者注: 导出sysctl应使用-S选项,而原文使用的是-s,译文已更正

-S 同时适用于OS X。

最有效的符号化的参数是"-m",它会符号化Mach陷阱和UN*X系统调用。joker会自动压缩enosys和旧的系统调用,但仍然会提供对应的地址。

译者注: enosys 为UNIX的一种系统错误名称

joker最新和最强大的特性是对JTool的支持。使用joker -j 来生成一个简单的规则文本文件(0xaddress:symbol:comment),在JTool中可以直接调用这个文件。

Mach使用消息、MIG来序列化消息。 Mach Interface Generator生成解析消息所需要的样本代码,这就会留下容易识别的特征。joker现在可以识别dispatch表,定位符号化的函数。

注意这些符号化的函数是一种代理,真正执行的函数是通过他们来进行调用的。但是我们可以很容易的找出真正执行的函数,因为基本上代理都会去调用消息检查函数。

这对iOS很有用,但是所有的符号都是被去掉了。在OS X xnu中可以更容易的看到被调用的真实函数,因为在OS X xnu函数都是被导出的,

译者注: 样本代码 = boilerplate code

再次注意,我在这里使用x86_64就是为了说明这点,你可以看到内部被调用的真实函数是_thread_swap_mach_voucher,这表示joker得到了当前的MIG调度内容。在iOS上,你可以通过交叉编译ARM64和x86_64来达到这个目的。

随着iOS10和OS X 12的发布,内核段布局被修改,是时候更新joker了。v3.0得到大幅度修改,通过与我的machlib集成,可以使用joker进行反汇编来找到函数。目前我已经实现了简单的功能(functions taking in strings),但可以被扩展到复杂情况和智能匹配模式。

由于Apple提供了不加密的kernelcache,你可能想知道joker没有被放弃的原因。

反编译并不是你想要的最有用的功能,而且它有点慢,因此尝试使用-j,然后你会看到:

在有些情况下,joker比实际的符号表更准确,因为其导出的符号是真实实现的一个包装,能够经常被使用到。

joker3.0也做了一些只适用于sandbox.kext的MACF策略,AMFI现在已经从代码中加载了。这可以在sandbox 570中得到新的hooks。如下:

V3.0的其他增强是JTOOLDIR=...和几个令人兴奋的功能(如IOUserClients的自动检测),但是直到最终版本才会出现,第二个Beta版本会增加安全监视器(SMC)检测和ARM异常向量

正如你所看到的,machlib可以跟踪寄存器,找出地址。因此,只要是X16导出的符号,你都可以快速的找到它。

你为什么还要自己做这些呢??joker现在可以自动完成这些

一些次要的但有用的改动:如果你提供给joker一个未压缩(未加密)的kernelcache,joker依然会抱怨,但是会在最后把KPP Mach-O 提取到/tmp中。

Joker gets in the zone - Mach zones, that is:

不是4.0。因为USerClients还不能工作。同时更新对iOS 11 β的支持,sandbox decomp出现了问题(待修复)。

joker

 
 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (2)
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
2017-9-19 12:02
0
雪    币: 487
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
时光啊
2021-12-4 23:26
0
游客
登录 | 注册 方可回帖
返回
//