本文为看雪论坛优秀文章
看雪论坛作者ID:那年没下雪
笔者最近刚学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.这里采取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 [email protected] -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 对拼接的参数进行加密。
这里开始分析sparataid的生成,在ida中找到这个生成的位置。
具体这Lion_meta 有三个方法 通过对前面两个方法进行hook 大概猜到用于收集设备信息 然后把前两步收集到的信息传入第三个方法进行加密。
hook该方法拿到的入参和返回值就很明显这是设备信息收集进行加密的方法,具体分析下这个方法怎么加密的,看代码大概猜了下如下图:
这就很简单了直接打印下CCCrypt的入参和返回值就知道,是哪种加密和key是多少。
很明显了AES ecb psck7 加密 key为固定值 OkqDu3nfoVGNIyQA。不过这里要注意一点,这个ios 这个编码出来的结果跟java 和python 有一点的不一样,要处理下,这里就不解释了,自己去看吧!
看雪ID:那年没下雪
https://bbs.kanxue.com/user-home-884888.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!