原文件下载路径:
【移动安全与逆向工程】车智赢App登录功能逆向分析:抓包、反编译与Hook技术应用
【移动安全与逆向工程】day14-车智赢app破解代码
【移动安全与逆向工程】day14-车智赢所需软件及插件
说明:文中所示案例仅供学习使用,请勿进行商业用途!!!
今日内容
1 app版本选择和逆向流程
1.1 今日目标
# 1 车智赢+ app---》登录功能
# 2 学习到的
1 选择app版本安装到手机
2 抓包
3 分析登录包请求,逆向
4 使用jadx反编译apk,阅读java代码
5 寻找关键字+Hook验证
6 python还原算法
# 3 下载app
-官网:https://icloud.che168.com/login.html
-下载地址:https://appdownload.che168.com/usedcar/csy/index.html?pvareaid=106101
- 3.56.0版本
2 抓包分析
2.1 配置
# 1 把app安装到手机上
adb install 软件位置/xx.apk
# 2 【电脑端】打开charles
# 3 手机端配置代理-如下图
# 4 电脑端配置能抓取https的包,如下图
# 5 打开车智赢app,操作登录,实现抓包
# 6 抓包详情:
-请求地址
https://dealercloudapi.che168.com/tradercloud/sealed/login/login.ashx
-请求方式
POST
-请求头
traceid:改包测试
-请求体
_appid atc.android #固定的
_sign B0FB9AE0B66383288C8AEEEF6854DDFF # 需要破解
appversion 3.56.0 # app版本,固定的
channelid csy # 固定的
pwd e10adc3949ba59abbe56e057f20f883e # 密码加密
signkey # 空的
type # 空的
udid iEavSW4QycaRf6qULa18YDJEOmuw10SBwdVu62EN/1/8eh46NzxTYDzG4oXl ZM0F6oKAPatKB4XyzJ9zIhTrdg== # 需要破解
username 18952452114 # 我们的账号
# 7 破解目标
1 密码加密
2 _sign :签名--》把请求体整体签名--》请求体改任意位置,签名都会错误
3 udid
3 反编译
# 1 jadx打开apk
# 2 搜索关键字:
pwd "pwd" "pwd
搜网址:https://dealercloudapi.che168.com/tradercloud/sealed/login/login.ashx
/login/login.ashx
# 3 找到谁使用了常量:LOGIN_URL--》右键--》查找用例
-一个位置,双击进入
# 4 找到代码:
builder.tag(str).method(HttpUtil.Method.POST).signType(1).url(LOGIN_URL).param("username", str2).param("type", str4).param("signkey", str5).param("pwd", SecurityUtil.encodeMD5(str3));
# 5 找到:param("pwd", SecurityUtil.encodeMD5(str3))
4 逆向
4.1 搜索登录接口
上面到的笔记
4.2 破解密码加密
# 1 SecurityUtil.encodeMD5(str3)
# 2 看之前先猜一下:就是md5签名
1 明文:123456
2 加密后:e10adc3949ba59abbe56e057f20f883e
# 3 继续看源代码--》就是md5
public static final String encodeMD5(String str) {
char[] cArr = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
try {
// 1 把明文字符串转成bytes格式
byte[] bytes = str.getBytes();
// 2 拿到一个md5对象
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 3 把bytes格式的数据,使用md5签名
messageDigest.update(bytes);
// 4 得到签名结果--》bytes格式
byte[] digest = messageDigest.digest();
char[] cArr2 = new char[digest.length * 2];
// 5 把签名后的结果转成16进制--》大写
int i = 0;
for (byte b : digest) {
int i2 = i + 1;
cArr2[i] = cArr[(b >>> 4) & 15];
i = i2 + 1;
cArr2[i2] = cArr[b & bx.m];
}
// 6 转成小写返回 python--->md5.hexdegist()
return new String(cArr2).toLowerCase();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
# 4 不确定 登录 是否真的会走它,通过hook确定一定会走
-写个hook脚本,hook脚本正常打印,说明走了它
4.2.1 hook密码加密
# 1 手机端开启frida-server
adb shell
su
cd /data/local/tmp
ls
./frida-server-16.3.3-android-arm64
# 2 电脑端做端口转发
-运行python脚本
# 3 写hook脚本运行
#### 3 运行hook代码
import fri