近期某大型漫展官方更新了自家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进行脱壳。具体最简单的方法如下
搞一部 巨魔商店装好的iPhone(参考这篇完成,我用的是比较老的ios15,太新不能用)
在手机上运行该 App
用TrollDecrypt,解密完整ipa
再导出到 Mac
最坏的情况:上面两步你都不会,找闲鱼1元搞定也行!!!
4.找出签名加密逻辑
第一种方案,使用Hopper Disassembler(Mac好用):伪代码清晰、界面易用、直接薅羊毛用试用版
Mac 版:https://hopperapp.com/
支持:ARM64/ARM64e、ObjC 自动解析、Swift 还原、内置调试(Mac Only)
导入 Mach-O
打开 Hopper → File → Load Executable
选择
Payload/CPP.app/CPP(前面我们提到的Mach-O)弹出 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还原算法
d5.其他的一些小东西
对于一个手机端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,可以判断风控