最新消息:本站技术交流 QQ 群:28124927

[iOS Hacker] 分析盘古的代码保护

iOS/MacOSX/移动安全 exchen 572浏览 0评论

分析盘古的代码保护

盘古是国内的越狱先驱,首次发布 iOS 9 的越狱工具。最近遇到一个问题,修改 SystemVersion.plist 文件,将版本号改成 10.3.3 会遇到不能越狱的情况,由于 9.3.1 不是完美越狱,重启之后需要再次越狱,这时问题来了,重启前修改了版本号,再次运行盘古时会提示版本号不支持,导致不能越狱,如下图所示:


网上搜索相关方法,找到这篇文章 手残改掉SystemVersion.plist导致无法越狱修复办法, 这篇文章的原理是对系统版本号获取的函数进行 Hook,修改成真实的版本,看起来是靠谱的,但实际操作并不顺利,因为盘古是有代码保护的,如果注入动态库会闪退,下面我们来分析一下盘古用了哪些代码保护的方法,只要把这些方法绕过,就能注入代码进行 hook,解决提示版本号不支持的问题。

尝试使用 MonkeyDev 运行盘古,运行之后程序自动退出,在 main 函数中有三处是用于防护的代码,分别是 sub_10000EE30、 sub_10000EE80、 sub_10000EE80,下图中已经标识清楚。

sub_10000EE30 这个函数调用 ptrace 防止调试器挂载。

然后在 sub_10000EE80 这个函数中调用了 sysctl 检测到有调试则调用 exit 函数退出程序。

MonkeyDev 默认有一个 AntiAntiDebug.m 文件,里面有绕过反调试的实例,稍加修改就可以绕过。绕过反调试之后运行盘古还是会闪退,即使不在调试器运行,也会闪退,于是尝试将 MonkeyDev 的配置 MONKEYDEV_INSERT_DYLIB 修改成 NO,代表不注入动态库,如下图所示:

此时在手机上点击盘古运行不会闪退,说明如果不注入是正常的,接着 MONKEYDEV_INSERT_DYLIB 改回 YES,然后在 iOS 10.3.3 设备上运行,是不闪退的,这时想到会不会是文件中插入了 RESTRICT 段来限制加载动态库,这种防护方法在 iOS 9 是有效的,但是 iOS 10 及以上是无效的,使用 MachOView 打开盘古的可执行文件(NvwaStone),发现 RESTRICT 段确实是存在,如下图所示:

但是 MonkeyDev 已经帮我们处理了,修改成 monkeyparser,按理说已经绕过了这种防护方法,为什么还是不行呢?如下图所示:

MonkeyDev 处理 RESTRICT 段的过程可以在 /opt/MonkeyDev/Tools/pack.sh 脚本里看到,调用的是 monkeyparser 这个程序完成的注入和处理 RESTRICT 段,核心代码如下:

继续再分析发现在 main 函数里的 sub_10000EE80 调用了 open 会打开自动文件,然后调用 mmap 将文件数据映射到内存,判断字符串 __RESTRICT__restrict ,如果数据被修改则返回 0xFFFFFFFFLL。对于这种情况我们怎么绕过呢?我想的一个方法是将原始的可执行文件 NvwaStone 复制一份,比如名称是 NvwaStoneX,然后 hook open,判断 path 参数如果是自身文件路径则修改成 NvwaStoneX 的路径,代码如下:

由于原始的 NvwaStoneX 文件未被做任何修改,所以能够绕过文件的校验。此时我们可以愉快地注入动态库,对相应的方法进行 Hook,修改成真实的版本号,盘古越狱的流程正常。最后附上修改版本号 Hook 的代码。

转载请注明:exchen's blog » [iOS Hacker] 分析盘古的代码保护

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址