完整的各个iOS版本系统函数实现地址提取?

很久没玩iOS了,看这标题应该猜得到我要干什么?:smirk: 会开源的啦
目前思路:

  • 静态获取RootFS并解密后手动Parse dyld_shared_cache. 但是这个的问题是从iOS10开始固件的RootFS才不再加密,之前的固件版本很多缺少RootFS的解密Key
  • 找到某个网站/人在老版本手动提取的dyld cache
2 个赞

目测0 imports

不明觉厉5个字

x不明觉厉5个字

留名 万一火了呢

不明觉厉 开搞吧

是类似这个东西吗?iOS-System-Symbols
我收集了一份各版本的系统库,都已经从dyld_shared_cache里解压出来了。

目前还差这几个arm64版本的系统库:
11.2 (15C113)
11.1 (15B101)
10.0 (14A346)
9.3 (13E237)
8.0.1 (12A402)
8.0 (12A365)
7.1.2 (11D257)
7.0.2 (11A501)
7.0.1 (11A470a)

被你提醒我才发现,原来iOS10开始固件不加密了啊,那11.2和11.1那两个也能拿到了。

另外这里也有一个收集的网站iOS Symbol Pool,不过它上面的系统库好像只有符号,没有代码段。

2 个赞

感谢。其实我找这玩意儿是为了做加固:man_facepalming:

又看了一下,那几个缺失的arm64固件也已经有RootFS key了,抽空把它们都补上。
不过10.0 (14A346)固件没有提供下载,拿不到了。

这些东西我是用来符号化crash日志,或者分析crash日志时看看汇编代码。

还能提供什么加固方面的作用?

我在想哈,具体我也不很久不搞iOS了思路可能不一定对哈。
知道相对偏移。运行时拿到基地址,加起来是不是能获得函数的实现地址。接下来搞一个编译器流程把原来的函数调用都换算成对地址的调用。当然初始化这些是一个巨大的性能开销,不过只用执行一次倒还好

留名,伸手了,万一给了呢?:stuck_out_tongue_closed_eyes:

好像有点意思,可以防hook,大佬厉害了。
不过每个方法的相对偏移在每个系统版本上都不一样,需要根据运行时的系统版本进行区分,所以需要维护一张系统版本和偏移量的映射表?如果表太大,估计就只能先处理一部分关键函数了。

是的,本来就是个脑洞。macOS上之前搞了个poc,但是由于macOS的dyld cache可以重新生成,稳定性几乎为0

反hook倒不会有多少效果: P,主要是基于现在Hikari的fco之上进一步恶心攻击者 : P

张总,你这个思路实现个跳转表吧,这个在看雪上的Windows pe crackme 我记着是16年还是17年有人实现的,最开始这个思路也是 病毒先用的。主要是提醒下,如果想做保护的话,Windows上面的那一套有很多可以借鉴的,各种奇技淫巧,你可以去看下看雪那边看下crackme

跳转表我早就做过啦

哎呀,没表达清楚,说的是导入表动态获取函数的跳转表,这个就是你开头说的 模块基址加偏移,还有通过 取 基址+名称 哈希 后取导入地址的,说的就是你主贴提的 函数地址 这个表。你说的混淆的这个跳转表膜拜过啊

这个考虑过,没有客户懒得做这么麻烦的玩意