磨刀霍霍
环境预备
测试手机
nexus x5 android 6.0
(android7.0以上版本抓包工具默认抓不到https请求,因为7.0以上只信任系统级别证书,而charles证书是安装到用户级目录的。
解决方式:可将charles证书升级为系统证书,即安装证书到系统证书目录下。
具体操作可参考连接:https://www.pianshen.com/article/97291182754/ )
PC
macbookpro
13-inch 4-core 16G-RAM macOS 10.15.5
所需工具
charles -网络抓包
下载地址:https://www.charlesproxy.com/
(前提:手机和电脑均安装好charles证书)
证书安装及支持抓包https设置指引请参考: https://blog.csdn.net/victory0943/article/details/106332095/
postman -接口调试工具
支持导入cURL,便捷高效,导入操作如下图
RE文件管理器 -android文件导出工具(需要root权限)
下载地址:https://m-k73-com.sm-tc.cn/c/m.k73.com/mipw/574951.html
Apk Messenger -查壳工具
加壳(加固)后的 apk 直接反编译是看不到真实源代码的,需要脱壳后再反编译。
使用APK Messenger可以很方便地判断是否加了壳
AndroidCrackTool For Mac -反编译apk
https://github.com/Jermic/Android-Crack-Tool
mac下Android逆向神器,实用工具集
AndroidCrackTool集成了Android开发中常见的一些编译/反编译工具,方便用户对Apk进行逆向分析,提供Apk信息查看功能.目前主要功能包括(详细使用方法见使用说明):
- 反编译APK
- 重建APK
- 签名APK
- 优化APK
- DEX2JAR(APK2JAR)
- JDGUI
- 提取DEX
- 提取XML
- Class to smail
- Apk信息查看
- Unicode转换
初窥门径
抓包分析
获取门店接口分析
首先手机配置好代理,打开APP,用Charles抓一下包。
一叶障目
多次请求获取门店的接口后,复制cURL进行对比分析:
这里介绍一个文本比对的在线工具,方便观察异同 https://qqe2.com/word/diff
对比分析得出:
变化值:
longitude和latitude: 经纬度传参,多次定位后肯定取值有所不同
timestamp:时间戳毋庸置疑
signature:顾名思义加密签名
相同值:
token:多次调用发现token取值是固定的
火眼金睛
加密参数确定
postman中导入该请求,signature参数勾选去掉后进行请求,发现返回认证过期无法正常获取数据,说明signature为加密参数
同时发现header中有个timestamp时间戳字段,根据逆向经验,请求中同时出现加密和时间戳,一般时间戳都会参与加密运算的,这样后端才会用时间戳结合加密逻辑进行加密认证。
因此我们再做个试验,只传 signature 不传 timestamp进行请求,发现依然无法正确响应,证明我们的猜想的正确的。
破解目标确定
signature的加密逻辑
且signature是有32位的数字加小写字母组成的,猜测应该是MD5加密
螳臂当车
apk查壳
查壳工具很多,这里我使用的是 APK Messenger,打开后,直接将 apk 包拖入界面,幸运地发现该apk没有加壳
长枪直入
apk反编译
本次使用了Android Crack Tool这个工具,其实用jadx、jd-gui等都可以,平时多换着用用,就知道各个工具的优缺点了~
- 利用Android Crack Tool 提取classes.dex文件
- 将得到classes.dex文件转为jar
- 通过jd-gui打开生成的jar文件,得到了反编译的源码
真假猴王
加密逻辑静态分析
由于加密参数为signature,在jd-gui中全局搜索“signature”
经过简单的浏览排除后,发现GlobalHttpHandlerImpl这个类中的相关代码最为相似,定位到关键代码处:
其实这段逻辑很容易看懂:
最后一行代码localObject2转为String后赋值给了signature,说明localObject2是md5的加密结果,即倒数第二行y.a()方法是MD5加密方法,传入localObject2经过加密后又赋值给了localObject2;
localObject2往上追溯,它是一个字符串的拼接,先拼接了一串固定盐值"CE0BFD14562B68D6964536097A3D3E0C",
其次拼接了str和localObject1,那么这两个是什么呢?其实不用向前追溯,我们换个思路往下看,你会发现
str赋值给了timestamp,localObject1赋值给了token,一切都有了答案~
一段伪代码进行加密逻辑总结:
signature = MD5("CE0BFD14562B68D6964536097A3D3E0C" + timestamp + token)
取接口中的token和时间戳进行加密验证下,结果是一致的,手工~
浮沙之上
心得:
- 逆向需要耐心也需要大胆的猜想去不断尝试,同时需要寻求巧妙的验证方式。本例的分析向上和向下的追溯均有,灵活应对
- 逆向工作会用到的很多好用的工具,平时注意多收集一些好用的工具或博文以事半功倍,本文所用到的工具和相关扩展知识点均贴出了链接,方便读者收藏~
- 本文旨在分享一些逆向技巧和思路,本文所举case相关敏感已打码略去,读者不可利用本文所述内容进行非法商业获取利益,若执意带来的法律责任由读者自行承担。