前言:
小弟最近刚学ios逆向,刚好最近在分析hcz这个app的安卓版本它的加密都在底层so里,但是so包做了加密,改了偏移,还有frida反调试不好分析,这正好符合我遇到困难就换路子的习惯。切换到ios 看看这个app 于是就有这篇文章了。app都做了SSL双向认证,所以抓包有点困难这里不就讲了。主要讲X-pa-Sign和Sparataid这两个参数。这里我用的是3.58.1版本 因为这个砸壳后代码清晰度好些,新版本的加密方法没改都是通用的 我已经测试过了。
这篇文章包含了lldb动态调试,frida-ios-dump砸壳,还有frida-trace静态分析.
1.砸壳
1.1.这里采取frida-ios-dump 操作
用起来很简单直接下载这个包 然后打开要砸壳的APP、命令行运行 python dump.py 进程名 然后等待就行.
1.2.砸完壳后拿到ipa文件,改成zip格式,解压打开找到里面可执行的文件一般跟app名称一样.把他扔到ida中,等待ida分析完成就好。这里要等待蛮久的。
2.ida+lldb分析
搜索要X-PA-SIGN 要到引用位置
定位到这个方法,对比抓包结果判断这个方法就是用于添加请求头的位置,分析代码找到X-PA-SIGN应该是由下面这个函数返回
点进去看
对比抓包生成的sign和代码分析可差不多知道X-PA-SIGN就是SHA256加密,下面我们来分析sub_1014DACA4的入参
lldb调试
在x-code目录中找到对于版本的DeveloperDiskImage.dmg ,路径大 致/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.2 /DeveloperDiskImage.dmg
双击 DeveloperDiskImage.dmg 在/Volumes/DeveloperDiskImage/usr/bin/ 下找到debugserver.
debugserver复制出来
创建一个entitlement.xml文件与debugserver保持同一目录
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict> <key>com.apple.springboard.debugapplications</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> <key>run-unsigned-code</key> <true/> </dict>
</plist>
用codesign签名
codesign -s - --entitlements entitlement.xml -f debugserver
发送到手机中 scp -r debugserver root@localhost -p xxxx :/usr/bin
- 然后运行debugserver 127.0.0.1:1998 -a /var/mobile/app进程
记得在电脑端转发这个1998端口 也可以自己定义 iproxy装个就好了
然后再电脑端另起一个窗口启动lldb
然后再输入 process connect connect://localhost:1998 等待连接
连上了 按c继续
拿到首地址
在刚才那个方法sub_1014DACA4下断点看看入参
触发断点,打印寄存器情况,这10个寄存器代表函数的10个入参
分别打印寄存器的值,这里跟我在安卓上抓到计算X-PA-SIGN方法入参对比
x0为http请求方法、x1请求路径 、x2为请求参数、x3为请求body base64编码、x4时间戳、x5为平台 、x6为安卓和ios特定的字符串、x7为固定值1 那么拿到入参后、继续分析
很明显了就是把GET请求就是把这些参数按照顺序拼起来
在看看POST方法的
也是把参数拼接来,路径后接一个请求报文的base64编码
那么我们先拿到这个函数的结果然后去判断是否是标准的sh256加密
好了 到这X-Pa-Sign分析完了就是Sha256 对拼接的参数进行加密
2.1.spartaid
这里开始分析sparataid的生成 在ida中找到这个生成的位置
具体这Lion_meta 有三个方法 通过对前面两个方法进行hook 大概猜到用于收集设备信息 然后把前两步收集到的信息传入第三个方法进行加密
hook该方法拿到的入参和返回值就很明显这是设备信息收集进行加密的方法,具体分析下这个方法怎么加密的,看代码大概猜了下如下图
这就很简单了