⚠️ 免责声明
本教程仅供学习和技术交流使用,请勿用于任何违法用途。
工具说明
本教程完全基于 Hopper Disassembler 进行分析和修改:
特此说明
本文档是我用Ai生成的文档,DeepSeek是免费的,不要问,不喜勿喷。
喜欢就请点个赞,基本有时间就会更新一点教程分享,当然了,如果你也是爱好者,可以一起交流讨论学习。谢谢。
感谢列表
因为这个iPA需要高系统,我系统是14.8.1的测试机,没法测试,所以感谢小果子帮忙测试。
应用信息
付费检查机制分析
1. 付费检查流程概述
TrollAgent的AI聊天功能包含以下付费检查流程:
[ol]
[/ol]
2. 关键函数分析
付费状态检查函数 (sub_100078EC8)
地址: 0x100078EC8
功能: 从iOS钥匙串(Keychain)读取付费状态
CFTypeRef sub_100078EC8()
{
// 构建钥匙串查询参数
// kSecClass = kSecClassGenericPassword
// kSecAttrService = "特定服务名"
// kSecAttrAccount = "charlieleung"
// kSecReturnData = kCFBooleanTrue
// kSecMatchLimit = kSecMatchLimitOne
// 调用SecItemCopyMatching查询钥匙串
OSStatus status = SecItemCopyMatching(query, &result);
if (status == errSecSuccess && result != NULL) {
// 解析返回的数据,检查付费状态
// 返回布尔值表示是否已付费
return boolValue;
}
return 0; // 未找到记录或查询失败,返回未付费状态
}
工作原理:
主要聊天逻辑函数 (sub_10004C27C)
地址: 0x10004C27C
功能: 处理AI聊天的主要逻辑,包含付费检查
这个函数包含了完整的AI聊天处理流程:
[ol]
[/ol]
关键修改点分析
在Hopper中分析发现,付费检查逻辑包含三个关键的条件跳转指令,这些指令决定了是否显示付费弹窗:
修改点1: 地址 0x10004ccf8
原始指令: cbz w0, 0x10004c96c
指令含义: Compare and Branch if Zero - 如果w0寄存器的值为0,则跳转到付费弹窗地址
十六进制: a0 e3 ff 34
修改后指令: nop
指令含义: No Operation - 空操作,不执行任何动作
十六进制: 1f 20 03 d5
修改原因:
修改点2: 地址 0x10004cd00
原始指令: tbz w8, 0, 0x10004c96c
指令含义: Test Bit and Branch if Zero - 测试w8寄存器的第0位,如果为0则跳转
十六进制: 68 e3 07 36
修改后指令: nop
指令含义: No Operation - 空操作
十六进制: 1f 20 03 d5
修改原因:
修改点3: 地址 0x10004cd14
原始指令: tbnz w0, 0, 0x10004c96c
指令含义: Test Bit and Branch if Not Zero - 测试w0寄存器的第0位,如果不为0则跳转
十六进制: 1f 40 03 d5 (注意:这个可能已经被修改过)
修改后指令: nop
指令含义: No Operation - 空操作
十六进制: 1f 20 03 d5
修改原因:
付费弹窗地址 (0x10004c96c)
功能: 显示付费限制弹窗
弹窗内容:
代码逻辑:
// 创建UIAlertController
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"付费功能"
message:@"此为付费功能,请前往设置改用本地模型体验"
preferredStyle:UIAlertControllerStyleAlert];
// 添加确定按钮
UIAlertAction *okAction = [UIAlertAction
actionWithTitle:@"确定"
style:UIAlertActionStyleDefault
handler:nil];
[alert addAction:okAction];
// 显示弹窗
[rootViewController presentViewController:alert animated:YES completion:nil];
Hopper修改步骤
步骤1: 在Hopper中打开TrollAgent
[ol]
[/ol]
步骤2: 定位修改地址
[ol]
[/ol]
步骤3: 查看原始指令
在Hopper的汇编视图中,你应该能看到类似以下的指令:
0x10004ccf8 cbz w0, 0x10004c96c
0x10004cd00 tbz w8, #0, 0x10004c96c
0x10004cd14 tbnz w0, #0, 0x10004c96c
步骤4: 修改指令
[ol]
[/ol]
步骤5: 验证修改
修改完成后,三个地址的指令应该都显示为:
0x10004ccf8 nop
0x10004cd00 nop
0x10004cd14 nop
步骤6: 保存修改
[ol]
[/ol]
修改原理详解
ARM64指令集说明
CBZ指令 (Compare and Branch if Zero):
TBZ指令 (Test Bit and Branch if Zero):
TBNZ指令 (Test Bit and Branch if Not Zero):
NOP指令 (No Operation):
修改效果分析
修改前的执行流程:
用户发送消息 → 调用付费检查函数 → 检查返回值
↓
如果未付费 → 跳转到付费弹窗 → 显示"付费功能"提示 → 阻止继续
如果已付费 → 继续执行 → 正常AI聊天功能
修改后的执行流程:
用户发送消息 → 调用付费检查函数 → 检查返回值
↓
无论付费状态如何 → 跳过所有检查 → 直接继续执行 → 正常AI聊天功能
技术细节
指令编码对比
[table]
[tr]
[td]地址[/td]
[td]原始指令[/td]
[td]原始编码[/td]
[td]修改后指令[/td]
[td]修改后编码[/td]
[/tr]
[tr]
[td]0x10004ccf8