iphone 软解那点事 (二)

本文深入剖析了超雪解锁工具的核心代码实现细节,包括AT命令构造、堆栈溢出利用、寄存器状态篡改及基带软件的运行机制等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

超雪核心代码  

 

  核心代码部分,相对来说比较难懂,需要有一定的 ARM 汇编, C 语言的基础才行,首先我们来看看 ultraSn0w 解锁所用的 at 命令的详细内容,我们用一个二进制工具打开 ultraSn0w 的主程序,检索“ at+xapp , 可以看到如下内容。虽然 at 命令都需要是可见的字符,但是我们的注入代码并不能这样,所以有一部分还是 hex 码。

 

  这么看比较难懂,那么我把这部分内容用 C 语言进行描述,大概如下。

 

溢出用的 at 命令大概分为 6 部分:

1 at_cmd :

   这部分是 at 命令的起始部分,也就是前面我们说的 at+xapp 命令。

2 padding_data

   这部分数据没有实际的意义,只是为了让执行 at+xapp 命令函数堆栈溢出的填充代码。

3 exploit_data

   这部分是一个关键的部分,其中主要填充了溢出后要给寄存器, r4 r5, r6,pc 的地址,以及 Inject code 部分的内存地址。其中还有一些未知的部分,这部分在后续的解锁过程中都要攻克。那么这部分怎么溢出的呢 ?

先看一段汇编指令。一般 ARM 的函数调用返回时候的反汇编代码大概如下。

 

   关键的是对堆栈操作的代码 PUSH POP ,程序返回的时候会把堆栈的内容,返回到寄存器 R4-R7 PC

当然这里面存的应该是上一个函数使用的中间值,可是如果我们溢出之后,他就是我们想要的内容喽, PC 将跳转到我们想要的地方。如果是一个 B  [SP] (不符合语法)就是最理想的了,因为这样我们可以马上跳回堆栈执行我们溢出部分的代码了,可是事情不会有那么好地,所以我们要寻觅一个类似这样功能的代码,去哪里找,只能在基带原有的代码里面找,看看我们的程序调到了那里?看上面的溢出结构就知道了是 0x20283c01 一个奇数的地址,说明这里应该是 thumb 指令,那这部分是啥呢,我们需要解密基带的代码!基带的代码在那里呢?且听下回分解。

 

4 payload_code

   这部分是一个装载器,他将在溢出之后被 cpu 执行,主要作用是用来对后续的 Inject code 进行解码,并跳转到 Inject Code 处继续执行。我直接贴出了程序的二进制编码和汇编代码的注释,可以参考一下。反汇编我是使用 IDA Pro ,一个神器啊,当年不知道帮助我破解了多少 WindowMobile 的程序,嘿嘿 ~

   大家仔细看这部分二进制码,有没有发现其中没有一个字节是 0 ,为什么要这样呢?因为 at 指令是一个字符串,那么字符串的默认约定就是 0 代表字符串的结束。如果我们在发给基带的命令中夹有了 0 ,那么就会被程序无情了认为字符串结束而达不到溢出的目的了,所以这部分代码要写的非常精巧。要对汇编的二进制编码很熟悉才行。而且这部分也写不了太大,因为我们很难避免一个程序不写出一个 0 出来。可以看出大神门的功底了得。这部分代码是 thumb 代码,因为 ARM 代码都是 4 字节的,遍地都是 0 ~

   大家说了,汇编也很难懂,那好我翻译成 C 语言大概就是类似下面的代码。如果你说 c 语言也很难懂,那对不起了,先学学再过来看。

 

 

哈哈,一下子变得这么精炼了,高级语言的诞生绝对是程序届的革命啊。内容很容易懂了吧,就是把 Inject 代码两个字符串分别减去 A 然后拼成一个字节,最终所有的字符串全部转换为二进制代码了。解码之后, payload 部分完成了使命,跳转到 Inject 部分继续执行。

 

6 Inject_code

   一大堆字符串,看起来来好像没啥规律,不过仔细看看有规律哦,没有大于 V 的字符,嘿嘿 ~ 如果上面的说明你看懂了,你也就知道为什么了! 通过 payload 部分解码之后,出场的将是 ultraSn0w 的核心解锁的代码了。就好比一个绝色美女,已经脱光了所有的外衣,接下来的事情就非常让人期待了 ~~~ 那我们来看看金玉其外的里面是什么?  

……

……

……

……

……

一大堆不知所云的汇编代码。

 

 

 

  哈哈,贴了这么长的代码,有点骗稿费的嫌疑啊,没事接下来马上将其变成美丽的 C 妹妹。不过在这之前先来点前奏,用语言叙述一下原理,据大神的 wiki 上介绍,基带里面运行了一个完整的操作系统名字叫 Nucleus ,是由 ATI 公司开发的,实时嵌入式操作系统,据说相当的稳定安全(苹果是不是图这个来的,可惜自己代码漏洞太多。)。我也没有用过,因为这个是一个商业系统,只对授权的公司开放源代码,但是如果你想找源码,还是有滴! ultrasn0w 的解锁代码,实际上创建了一个截获解锁事件监视 task (通过调用 Nucleus API )。经过处理之后,替换掉你 SIM 卡的传递过来的数据,将可以通过验证的数据向下传递,让基带认为你这个是一个合法的可以使用的 SIM 卡。从而达到软解的目的。站在了前人的肩膀上来看这个过程很简单吧,可以想象当初一穷二白的时候,大神们突破重围是会有多么艰辛。

  讲道这里可能有人会说,那这部分代码不是每回都一样了?为何每次解锁都要等那么久,其实这部分核心代码是不会有大变化了,但是每次基带升级之后其中的一些地址会发生变化,因为苹果为了修复漏洞重新编译了代码,所有函数的 link 地址都将发生细微的变化,而我们必须找出当初一一对应的关系。才能保证系统调用是好用的。好了,说了这么多现在看翻译后的解锁 C 代码。

 

  

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值