Jailbreak Development please go easy on me

好久没有做过iOS上的越狱开发了,昨天偶然看到Cee说支付宝越狱状态下 Reveal 都没法主动加载进去。

然后看了一下,果然是加了个__RESTRICT,然后手动改了下Segment和Section区,丢进设备跑了一下,就可以加载Reveal了。几年前的支付宝还可以随意玩耍,甚至获取手势密码233(BlueCocoa/DamnAlipay)

update: 现在也还是可以自由的获取233,详见后文

记得这个__RESTRICT的手法,国内首先使用的是美团,后来很多App就都用上了,在一定程度上防住了第三方对自己App的注入。

后来就干脆写了个小工具(早就想写了,不过懒癌晚期233),去掉MachO文件里的__RESTRICT,顺便也把ASLR关了,某些情况下,用lldb调试时会很方便。

screenshot-injectable-3

代码在BlueCocoa/injectable

整体思路就很简单了,按照MachO的标准来读取可执行文件, 先通过读取文件前4字节的magic,看看是不是FAT,然后是Big Endian还是Little Endian。iOS上的可执行文件都是Little Endian,不过有时macOS上的程序也可以这么破233,所以就没有判断是否是iOS上的程序。

如果不是FAT类型的MachO,那么就直接开始读mach header,mach header的magic会表明自己是32bit的还是64bit的。flags成员中会记录该可执行文件是否开启了PIE(或ASLR),这个flag的掩码为0x200000,宏则是MH_PIE。这里可以先将PIE掩码和flag与运算判断一下,也可直接flags &= ~MH_PIE;关掉。

在有了mach header的信息之后,就开始读load command,需要注意的是,在这篇post里提到的有关MachO的结构体中,只有struct load_command这个结构体本身没有32位/64位的区分,而是保存在了load_command.cmd这个成员里,当cmd的值为LC_SEGMENT_64时,就是一条64位的load command,当它为LC_SEGMENT时,就是32位的。

读到一条load_command之后,就可以根据cmd的值开始读取segment command,接下来就可以根据segname成员的值判断是否是__RESTRICT的段,如果是的话,就可以开始读这个segment下的sections;若不是,则继续loop

对于一个segment而言,可以有多个section。在现在破除dylib加载限制时,我们只关心__RESTRICT段下,名为__restrict的section。找到之后修改sectname成员和segname成员的值就好。

修改前,使用cycript会产生错误,如下图

screenshot-injectable-1

然后我们把设备上对应的可执行文件保存到电脑上(实际上,你在iOS设备上编译好这个程序就不用复制到电脑上了,不过一般都是在Mac上做插件开发的时候才会来移除ASLR/__RESTRICT),执行injectable

screenshot-injectable-2

可以看到arm arch实际上是没有ASLR/PIE的,然后arm和arm64均有__RESTRICT, __restrict

之后再将生成的AlipayWallet.injectable覆盖掉原来设备上的可执行文件即可以了。

此时cycript也好,还是Reveal也好,都可以正常玩耍了(某些时候你需要使用ldid签名新生成可执行文件)

screenshot-injectable-3

 

screenshot-injectable-4

 

update: 

post开头获取支付宝手势密码

稍微试了一下就知道了ww

screenshot-injectable-5

声明: 本文为0xBBC原创, 转载注明出处喵~

《Jailbreak Development please go easy on me》有3个想法

  1. 博主你好,我按照你的步骤做了下,发现最新版的“支付宝”在替换掉原来的文件后打开出现闪退的问题,不知道是不是支付宝做了校验。测试的支付宝版本是9.9.5,请问一下博主是不是做了什么其他操作。

  2. 替换回去支付宝crash了,已经对可执行文件执行了ldid -S 签名,请问是什么原因呢。

    并且越狱机已经安装appsync,没有理由闪退的啊(≖ ‿ ≖)✧

发表评论

电子邮件地址不会被公开。 必填项已用*标注