吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2591|回复: 44
收起左侧

[iOS 原创] 倩女幽魂之-教师招聘考试 一剑碎虚空

  [复制链接]
HackXK 发表于 2026-1-11 19:57

「前言」
偶遇道友,故送一本教师招聘以解路上烦闷。
“世间万物,皆有法理。而在那由 0 与 1 构成的‘太虚幻境’(iOS App)中,App Store 便是掌管生杀予夺的天条,而‘VIP’则是凡人梦寐以求的长生果。
今日,不论你是初入仙途的炼气期修士,还是早已辟谷的大能,贫道都愿倾囊相授。不以此为恶,只求在面对那名为‘教师招聘’的守关魔将时,诸位能祭出手中那把名为 IDA Pro 的上古神剑,纯凭神识(静态分析),一剑破万法!”


b4fa4887-d39b-4651-bf58-2216a1911ed9.png

📜 卷一:祭剑入定(环境与准备)

在一切开始之前,需得净手焚香。我们要面对的,是一个没有任何调试信息、被高墙(沙盒)围困的 Mach-O 妖兽。

法宝准备(Tools):

  1. IDA Pro 9.3:这是我们的本命飞剑,越锋利越好(版本越新越好)。
  2. Hex Fiend / 010 Editor:这是雕刻符文的刻刀,用于直接修改二进制(Patch)。
  3. 目标文件:从砸壳后的 IPA 中提取出的 教师招聘考试 可执行文件(Mach-O)。

610f9c124495f2e8f0544b077115566b.png

入定(Load):
启动 IDA,将文件拖入其中。

  • 弹出的 Load a new file 窗口中,选择 ARM64 架构(如今的移动端皆为此架构)。
  • 点击 OK,静静等待下方的进度条(Analysis Queue)走完。需得等到左下角的 AU: idle 出现,方为“剑意充盈”。

📜 卷二:天眼通幽(关键字定位法)

魔将藏身于茫茫代码海中,如何寻得?修真者讲究“气机牵引”。

1. 寻踪(Search Strategy)

普通人只知胡乱翻找,而我们寻找的是 “权益” 的命门。在开发者的语境(ObjC Runtime)中,这些命门通常有着固定的名字:

  • isVIP / isMember(是否是会员?)
  • vipEndTime / expireDate(何时渡劫失败/到期?)
  • userInfo / account(户口本/用户信息)

2. 施法(Functions Window)

按下 Shift + F3 打开 Functions Window(函数名册)。
在底部的过滤器中输入真言:isVIP

“刹那间,灵光乍现!”

屏幕上显现出两个关键坐标:

  1. -[MainBaseModel isVIP] @ 0x100067B84
  2. -[MainBaseUserModel isVIP] @ 0x100069654

贫道掐指一算,通常 MainBaseModel 乃是万物之基类,修改它,往往能通过继承关系影响全局。这里便是我们的第一战场


📜 卷三:洞垣之术(汇编深度解析)

双击 -[MainBaseModel isVIP],元神进入代码深处。我们看到的不再是函数名,而是赤裸裸的 ARM64 汇编指令

莫慌,贫道为你逐行解签:

__text:100067B84                 SUB             SP, SP, #0x20
; [解析]这是每一场战斗的起手式。开辟 0x20 大小的栈空间,用来存放临时数据。
__text:100067B88                 STP             X29, X30, [SP,#0x10+var_s0]
; [解析]保存上一层函数的现场(FP和LR),为了打完怪还能找回家。
...
__text:100067B90                 MOV             X8, X1
__text:100067BA0                 BL              _objc_msgSend$vip
; [解析] ➤ 关键一击!
; 这里调用了 objc_msgSend,向 self 发送了 "vip" 消息。
; 翻译成人话: "喂,把你的 vip 属性值交出来放在 X0 寄存器里!"

__text:100067BA4                 SUBS            X8, X0, #1
; [解析] ➤ 判词!
; 取回的 vip 值 (在 X0 中) 减去 1。
; 如果 X0 是 1 (1-1=0),状态寄存器(PSTATE)的 Z 标志位变红(置1)。

__text:100067BA8                 CSET            W0, EQ
; [解析] ➤ 宣判!
; EQ (Equal) 意味着刚才减法的结果是0。
; 如果是 EQ,就把 W0 设为 1;否则设为 0。
; 此时,W0 里存放的就是最终结果:是(1) 还是 否(0)。

__text:100067BB4                 RET
; [解析] 回家。

按下 F5,IDA 的“照妖镜”功能将其还原为伪代码:

bool -[MainBaseModel isVIP](MainBaseModel *self, SEL a2) {
  // 简单粗暴:如果 vip 属性等于 1,就返回 True
  return (void *)-[MainBaseModel vip](self, "vip", a2, self) == (void *)1;
}

📜 卷四:逆天改命(Hex Patch 实战)

既已看破,那便要改写天命。我们不需要它去查属性,也不需要判断。
我们要让它:只要被问起,永远回答“是”(返回 1)。

1. 拟定符文(Assembly Patch)

我们需要将函数开头的指令直接修改。
ARM64 中,返回值存放在 X0/W0 寄存器。

  • 目标指令
    MOV W0, #1   ; 把 1 放入 W0
    RET          ; 返回

2. 刻画符文(Machine Code)

在 IDA 中点击 Options -> General -> Disassembly,勾选 Opcode bytes(显示机器码)。
我们可以查阅 ARM64 指令手册,或者使用在线 Assembler:

  • MOV W0, #1  对应机器码: 20 00 80 52
  • RET         对应机器码: C0 03 5F D6

3. 施法(Apply Patch)

  1. 鼠标点击 0x100067B84 (函数首行)。
  2. 点击 Edit -> Patch program -> Change byte
  3. 将原来的字节改为:
    20 00 80 52 C0 03 5F D6
  4. 点击 OK

此时汇编窗口瞬间变样:

__text:100067B84                 MOV             W0, #1
__text:100067B88                 RET
__text:100067B8C                 ... (后面的代码已成死尸,不再执行)

至此,身份伪造完成!


📜 卷五:虚空之劫(Null 时间问题)

道友们,若此时重新打包运行,你会发现虽然那个金灿灿的“VIP”图标亮了,但旁边原本显示日期的地方却是一片漆黑的 (null)

为何?
这名为“教师招聘”的妖怪,虽然被骗过了身份,但它去查询你的“寿数”(vipEndTime)时,数据库里依然是空的。它如实地显示了空,导致 UI 异常。

要想尽善尽美,我们必须连“寿数”一起伪造!

寻踪
找到 -[MainBaseModel vipEndTime] @ 0x100068EBC

观微

__text:100068ECC                 LDR             X0, [X8,#0x1A8]

它直接读取了内存偏移 0x1A8 的成员变量。

难点
这里返回的是一个 NSString *(指针)。
在汇编里,我们不能像写代码一样直接写 return @"2099-01-01". 我们必须返回一个已经存在于内存中的字符串对象的地址。


📜 卷六:借尸还魂(静态字符串引用与ADRP)

这是本教程最硬核的部分。我们要利用 IDA 在静态文件里找到一个无主的字符串,然后让函数返回它的地址。

第一步:寻找躯壳(Find String)

  1. 打开 Strings Window (Shift + F12)。
  2. 我们随便找一个长得像日期的,或者干脆找一个很长的现有字符串。
  3. 假设我们搜索到了字符串:"20"... 运气不好,没找到日期的。
  4. 借尸技巧:我们可以找一个大概率存在的字符串,比如版本号、或者其他的固定文本。
    • 搜索"VIP"
    • 发现:在地址 0x10015A3C0 有个字符串 "VIP会员" (举例)。
    • 或者:找 CFString 段。
    • 假设:我们在 0x100188880 找到了一个字符串 "2099-01-01" (如果运气好有的话)。
    • 若没有:我们可以找任意一个看起来顺眼的字符串,比如 "Forever",或者复用系统里的某个长字符串。

假设我们找到了一个完美的字符串地址:0x100180000

第二步:计算坐标(ADRP & ADD)

ARM64 中,要将一个远处的绝对地址加载到寄存器 X0,通常用 ADRP + ADD 两条指令。

假设:

  • 当前指令地址 (PC):0x100068EBC (vipEndTime 函数开头)
  • 目标字符串地址:0x100180000

计算过程

  1. ADRP (Address Page):计算页偏移。
    • 当前页:0x100068000
    • 目标页:0x100180000
    • 差值:0x118000
  2. ADD (Offset inside page)
    • 目标在页内的偏移:0x000 (正好在页首,方便计算)。

构造指令
我们需要构造出如下汇编:

ADRP  X0, #0x118000   ; 指向目标页
ADD   X0, X0, #0      ; 加上页内偏移
RET

(注:实战中如果不想手算,可以使用 IDA 的 Keypatch 插件,直接输入汇编 MOV X0, 0x100180000,它会自动帮你转换成 ADRP/ADD 组合!)

第三步:注入神识(Patch)

使用 Keypatch 在 0x100068EBC 处写入:

; 伪代码,实际由 Keypatch 自动计算
LDR X0, =0x100180000  ; Keypatch会自动把这行伪指令转成 ADRP+ADD
RET

打上补丁后,IDA 就会显示:

__text:100068EBC                 ADRP            X0, #0x100180000
__text:100068EC0                 ADD             X0, X0, #0
__text:100068EC4                 RET

至此,每当 App 询问“到期时间”,函数就会指着那个位于 0x100180000 的字符串说:“看,这就是我的寿数!”


c9a01002a471ee0e29627ebd12d93d75.png

🍵 结语:飞升之后

最后,别忘了 Edit -> Patch program -> Apply patches to input file,将这些修改真正写入到二进制文件中。
将修改后的文件替换至 App 包内(重签名),安装运行。

你将看到:

  • 身份:至尊 VIP(由卷四 MOV W0, #1 赐予)。
  • 寿数:2099-01-01(由卷六 ADRP 借尸还魂赐予)。

不动如山,动则惊雷。
不借外物,直指本源。

这,便是静态逆向的“道”


Created by MacXK for 52Pojie

免费评分

参与人数 16吾爱币 +14 热心值 +16 收起 理由
seamusyang + 1 + 1 谢谢@Thanks!
阿清 + 1 + 1 6666666
小m真2 + 1 + 1 我很赞同!
刺心 + 1 + 1 谢谢@Thanks!
suyuewen + 1 + 1 我很赞同!
WhitecatC36 + 1 + 1 我很赞同!
丶老衲徒伤悲 + 2 + 1 --------
qin17 + 1 我很赞同!
HiLinux + 1 + 1 我很赞同!
5196 + 1 + 1 谢谢@Thanks!
chzhy1986 + 1 这文采也是给力
52rap + 1 + 1 谢谢@Thanks!
kingbackgo + 1 + 1 谢谢@Thanks!
小小小小小抹茶 + 1 + 1 我很赞同!
zhongzhi72 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
whereismy + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

happin1982 发表于 2026-1-11 20:30
非常感谢
xianhug 发表于 2026-1-11 20:41
kefadn88 发表于 2026-1-11 20:53
yybaoyymmm 发表于 2026-1-11 20:56
本来云里雾里的,其实逻辑很清晰
lingdo 发表于 2026-1-11 21:03
很精彩,值得学习。
跌宕起伏 发表于 2026-1-11 21:04
岩壁机遇助道果
奈何采集需攀岩
仙门飞剑需充值
赋值true放光芒
取得道果登天道

zhongzhi72 发表于 2026-1-11 21:32
小白羡慕,有没有成品,谢谢
jspx 发表于 2026-1-11 21:34
还得是老哥 牛奔
zhongzhi72 发表于 2026-1-11 21:40
zhongzhi72 发表于 2026-1-11 21:32
小白羡慕,有没有成品,谢谢

怎么悬赏?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-1-13 09:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表