200字
某大型漫展官方售票APP 3.25.10 逆向
2026-04-06
2026-04-11

近期某大型漫展官方更新了自家app的3.25.10版本,实际上和原来版本差别是不大的,在此完整讲一下如何逆向它的关键接口签名参数。

1.环境

在此选择对IOS端APP进行逆向。原因:

  • 安卓端使用梆梆(bangcle)加固,逆向比较复杂

  • 安卓端签名算法比ios复杂,且经过分析得知签名函数被保护在了native层

2.提取ipa

使用工具Apple Configurator 2(苹果官方),打开 Apple Configurator 2,连接手机到电脑。唯一的缺点是,这个工具只支持在MAC上使用。

左上角菜单中登录你的apple账号

弹出的窗口会列出此账号拥有的所有应用,然后前往

~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/

就找到ipa啦~

还有一种办法,使用itunes提取,本人没有用这种,不介绍了。

3.拆掉壳

下下来的苹果ipa,一般都自带FairPlay DRM壳。必须砸掉,才能进行下一步。

这一步也需要mac电脑,或者linux子系统安装llvm-otool

先判断有没有壳子:

先解压 IPA:将 .ipa 后缀改为 .zip 并解压,得到 Payload/xxx.app 目录。

接着:定位 Mach-O:进入 Payload/xxx.app,找到与 App 同名的可执行文件(无后缀)。

执行otool -l 目标Mach-O文件路径 | grep -A 3 cryptid 看看信息:

如果 cryptid 0 就是没壳子了,但现在还有,怎么办?

需要对FairPlay DRM进行脱壳。具体最简单的方法如下

  1. 搞一部 巨魔商店装好的iPhone(参考这篇完成,我用的是比较老的ios15,太新不能用)

  2. 在手机上运行该 App

  3. 用TrollDecrypt,解密完整ipa

  4. 再导出到 Mac

最坏的情况:上面两步你都不会,找闲鱼1元搞定也行!!!

4.找出签名加密逻辑

第一种方案,使用Hopper Disassembler(Mac好用):伪代码清晰、界面易用、直接薅羊毛用试用版

  • Mac 版:https://hopperapp.com/

  • 支持:ARM64/ARM64e、ObjC 自动解析、Swift 还原、内置调试(Mac Only)

  • 导入 Mach-O

    1. 打开 Hopper → File → Load Executable

    2. 选择 Payload/CPP.app/CPP(前面我们提到的Mach-O)

    3. 弹出 Loader 选项(默认即可),下一步,等待分析完成(几秒的事!)

  • 左侧搜索“signature”“sign”这些关键词

找到+[RAHelper generateSignatureWithTimestamp:nonce:ticketTypeId:]

这就是我们需要的加签函数啦!整理一下,这就是汇编代码部分

; 函数入口:3个参数:时间戳、随机串、票据类型
0000000100193a88  sub        sp, sp, #0xa0    ; 分配栈空间
0000000100193aa8  mov        x20, x4          ; x20 = ticketTypeId
0000000100193ab0  mov        x21, x2          ; x21 = 时间戳 timestamp
0000000100193ac8  mov        x19, x3          ; x19 = nonce 随机字符串

; 第一步:拼接固定格式字符串
; 拼接规则:%@%@%@%@%@ → 时间戳 + nonce + 固定密钥1 + ticketTypeId + 固定密钥2
0000000100193b18  add        x8, x8, #0x450   ; 常量:@"mKSEDLushKSIJSISHMNFEDNSUYQEAVJSfwp"
0000000100193b28  add        x8, x8, #0x430   ; 常量:@"cpp2C0T2y5u0m7a2d9l"
0000000100193b34  add        x2, x2, #0x410   ; 格式符:@"%@%@%@%@%@"
0000000100193b38  bl         _objc_msgSend$stringWithFormat: ; 拼接5个参数
0000000100193b44  mov        x22, x0          ; x22 = 拼接后的原始字符串

; 第二步:字符串反转(核心逻辑)
0000000100193b70  bl         _objc_msgSend$length   ; 获取字符串长度
0000000100193b74  subs       x24, x0, #0x1    ; 索引从最后一位开始
loc_100193b84:
0000000100193b84  mov        x0, x22          ; 原始字符串
0000000100193b8c  bl         _objc_msgSend$characterAtIndex: ; 取字符
0000000100193b9c  bl         _objc_msgSend$appendFormat:     ; 拼接到新字符串
0000000100193ba0  sub        x24, x24, #0x1   ; 索引-1
0000000100193ba8  b.ne       loc_100193b84    ; 循环完成反转

; 第三步:反转字符串转大写
0000000100193bac  bl         _objc_msgSend$uppercaseString 

; 第四步:MD5加密计算
0000000100193bc4  bl         _objc_msgSend$UTF8String  ; 转C字符串
0000000100193bcc  bl         strlen                   ; 获取长度
0000000100193be0  bl         CC_MD5                  ; 计算MD5 (16字节)

; 第五步:MD5二进制转32位十六进制小写字符串
0000000100193c04  add        x25, x25, #0x470  ; 格式符:@"%02x" (小写两位十六进制)
loc_100193c08:
0000000100193c08  ldrb       w8, [x27, x28]   ; 逐字节读取MD5结果
0000000100193c18  bl         _objc_msgSend$appendFormat: ; 拼接为十六进制字符串
0000000100193c1c  add        x28, x28, #0x1
0000000100193c24  b.ne       loc_100193c08

; 函数返回签名结果

非常轻松。

4.用py还原算法

d

5.其他的一些小东西

对于一个手机端ios设备,每个请求头里面都带这些,才能够正常过校验:

{
  "mobileSource": "iOS",
  "equipmentType": "0",
  "deviceVersion": "15.2"
  "deviceSpec": "iOS",
  "appHeader": "mobile",
  "appVersion": "3.25.10"
}

软件版本建议跟随最新,过期版本请求不能用,会被拒绝。有个api可以获取最新版本号,通过wap端可以抓。

UserAgent生成方式:

CPP/{app_latest_ver} (iPhone; iOS {device_ver};Scale/3.00)

6.ACL风控分析:

此平台在下单请求过快时,会直接被阿里云自定义ACL风控。

pay/ali.do这个接口风控。风控依据应该是速率限制

此时返回内容直接包含ACL这个关键词,状态码403,可以判断风控

7.成果

成果(开源版)

评论