映客 iOS 客户端 v3.3 登录接口破解

本来原则是找旧版本的,然后找 android 的。但是当时手上暂时没有 android 机,于是就决定搞 iOS,但是老版本的映客客户端又没有手机登录的功能,于是只能硬着头皮用当前的最新版本。

  1. 由于手上没有越狱设备,于是直接从 PP助手 那里下载了一个现成的已经脱过壳的映客版本。

  2. 解压

    1
    unzip inke.ipa

  3. 打开 Hopper Disassembler v3,把解压后的 Payload/inke.app/inke 二进制文件拖进 Hopper 里。

  4. 手机配代理连 Charles,走一遍手机号登录流程,抓取请求短信验证码和登录的请求包。 请求短信验证码接口:
    file 登录接口: file

  5. 根据这些请求里的一些字段,在 Hopper 的 Labels 框里猜测一些关键字。几番尝试后,发现输入 loginphone 后找到了想要找的函数:[UserLoginModel loginPhone:requestId : code: completion: ]

  6. 然后再顺藤摸瓜,以 UserLoginModel 为关键字继续搜:
    file 发现了这个函数:[UserLoginModel requestVoiceCodeWithPhone : region : completion: ]

  7. 就先从发送验证码的函数开始分析吧,反编译该函数后: file 可以发现 arg2 就是手机号,然后分别被 [SecurityTool rsaEncrypt1:r5][SecurityTool md5Encrypt:r4] 加过密。后者看名字就能知道是 md5 加密,所以先自己给手机号 md5 一下看看
    file 发现结果和请求里的字段貌似并没有什么关联,以为猜错了,后来想起自己登录映客的时候还选过区的,所以手机号可能需要加个86: file 这下果然就对了,结果正好对应着请求里的 secret 字段。那猜测那个 rsa 加密函数的结果应该就是对应着请求里的 phone 字段了。

  8. 接着继续搜 SecurityTool 关键字,找到 rsaEncrypt1 函数,反汇编后:
    file 可以发现里面多次出现了带 MIH 前缀的函数,猜测多半是用了什么开源库之类的东东,于是上 github 上搜下其中的 MIHRSAPublicKey 类,果然找到了相关资料,然后各种搜发现了一个叫 MIHCrypto 的开源库,按照教程

    1
    pod "MIHCrypto", "~> 0.4.1"
    到新建的测试工程后,就开始仿照反汇编后的结果模拟加密逻辑: file 这里有个小插曲,反汇编后的那个常量字符串由于太长了,显示不全,直接就显示三个点了…我模拟的加密逻辑始终会 crash 就是因为那个字串不全导致格式不对。又不会在这种情况下用 gdb 跟进去,后来想了很久,发现还有另一款反编译神器 IDA,抱着试一试的态度下载免费版的 IDA 后,果然能看到完整的常量字符串了: file 然后运行 demo,结果出来的加密结果跟抓包的 phone 果然一样,然后用 paw 组包也发送成功: file

  9. 解决了请求验证码的接口后,登录的接口也就很轻松了。登录接口的 code 就是验证码,phone 是和请求验证码一样的加密逻辑,secret 通过看反汇编的代码是 手机号#短信验证码 的 md5 的结果,request_id 就是请求短信的返回包里的字段,组包发送,成功。

  10. 解决了手机登录后,再尝试下看看第三方联合登录有没有搞头。先拿微信举例,只要获取到映客的 WX_App_IDWX_App_Secret 就可以了。WX_App_ID 是写死在客户端的,这个可以通过反编译拿到。但是 WX_App_Secret 通常都是存在服务器的,感觉没什么出路。正在纠结的时候发现映客是用的友盟集成的第三方登录组件,这种集成的第三方组件好处就是用起来很便利,当然坏处就是不安全,必须得给他们提供应用的 WX_App_Secret,意味着这个字段或许我们可以在客户端反编译搜出来。果然以 ThirdPlatform 为关键字,搜出了相关方法: file file