1. 项目背景与目标解析
"车智赢"作为一款主流的车联网服务应用,其登录协议的安全性直接关系到千万车主的隐私数据保护。这次逆向分析的目标是破解其核心登录算法,理解其安全设计思路,同时为合规的安全测试提供技术参考。
在车联网领域,APP与车载终端的认证流程通常采用双向校验机制。从表面上看,车智赢的登录过程只是简单的账号密码验证,但实际抓包会发现整个流程包含了动态密钥交换、数据签名校验等多重防护层。这正是我们需要重点突破的技术点。
2. 逆向分析环境搭建
2.1 基础工具选型
工欲善其事必先利其器,逆向分析需要一套完整的工具链:
- 抓包工具:Charles+Postern组合实现HTTPS流量解密
- 反编译工具:JADX-GUI处理DEX文件,IDA Pro分析native层
- 调试工具:Frida框架动态注入,Xposed模块做方法Hook
- 辅助工具:JEB3进行深度代码分析,Burp Suite做请求重放
特别提醒:所有工具必须使用官方正版,避免植入恶意代码的风险。测试环境建议采用隔离的安卓模拟器(如夜神模拟器7.0系统版本)
2.2 关键配置步骤
-
证书配置:
- 在手机和电脑端安装Charles根证书
- 修改Postern代理设置为127.0.0.1:8888
- 配置SSL Proxying对目标域名开启抓包
-
反编译准备:
bash复制# 使用apktool解包 apktool d chezhiving.apk -o output_dir # 提取关键DEX文件 unzip chezhiving.apk classes.dex -d decompile_dir -
动态调试环境:
- 安装Frida-server到测试设备
- 配置Python环境运行Frida脚本
- 编写基础Hook脚本监控关键类方法
3. 登录协议逆向过程
3.1 流量特征分析
通过抓取正常登录请求,观察到以下关键特征:
- 请求URL:
https://api.chezhiving.com/v3/auth/token - 请求体包含:
- username:明文
- password:加密值(32位HEX字符串)
- timestamp:13位Unix时间戳
- sign:40位SHA1签名
通过对比多组请求发现,password字段的加密结果与设备IMEI强相关,同一密码在不同设备上加密结果不同。
3.2 关键算法定位
使用JADX全局搜索关键词"encryptPassword",定位到核心类com.chezhiving.security.CryptoUtil,其中包含关键方法:
java复制public static String encryptPassword(String imei, String rawPwd) {
byte[] salt = generateSalt(imei);
return Hex.encodeHexString(
SHA256.digest(rawPwd.getBytes() + salt)
);
}
进一步分析发现generateSalt方法使用了设备IMEI的后8位进行二次HMAC运算,这也是同一密码在不同设备加密结果不同的根本原因。
3.3 签名算法破解
登录请求中的sign参数通过以下流程生成:
- 拼接字符串:username + encryptedPassword + timestamp
- 使用APP内置的固定密钥"0xFASTCAR#2023"进行HMAC-SHA1运算
- 对结果做Base64编码后取前40位
用Python还原算法如下:
python复制import hmac
import hashlib
import base64
def generate_sign(username, encrypted_pwd, timestamp):
key = "0xFASTCAR#2023"
msg = f"{username}{encrypted_pwd}{timestamp}"
digest = hmac.new(key.encode(), msg.encode(), hashlib.sha1).digest()
return base64.b64encode(digest).decode()[:40]
4. 安全机制深度解析
4.1 防御策略分析
车智赢的登录协议设计了三级防护:
- 动态盐值加密:通过设备IMEI绑定,防止彩虹表攻击
- 时间戳校验:服务端会拒绝超过5分钟的请求
- 请求签名:防止参数篡改,签名密钥硬编码在so库中
4.2 潜在漏洞
尽管设计完善,但仍存在可改进点:
- 签名密钥硬编码在native层,通过内存dump可提取
- 未实现请求重放防护,签名有效期过长
- 密码加密未使用随机IV,相同设备加密结果固定
5. 完整算法还原与验证
5.1 Python实现示例
python复制import hashlib
import hmac
import base64
from datetime import datetime
def encrypt_password(imei, password):
salt = hashlib.pbkdf2_hmac(
'sha256',
imei[-8:].encode(),
b'chezhiving_salt',
1000
)
combined = password.encode() + salt
return hashlib.sha256(combined).hexdigest()
def make_login_request(username, password, imei):
timestamp = int(datetime.now().timestamp() * 1000)
encrypted_pwd = encrypt_password(imei, password)
sign = generate_sign(username, encrypted_pwd, timestamp)
return {
"username": username,
"password": encrypted_pwd,
"timestamp": timestamp,
"sign": sign
}
5.2 测试验证方法
- 使用真实设备抓取正常登录请求
- 用还原的算法生成测试请求
- 对比关键字段一致性:
- 加密后的password值
- 生成的sign签名
- 时间戳格式
6. 逆向工程中的难点与解决方案
6.1 Native层混淆对抗
核心算法部分被封装在libsecurity.so中,采用以下技术对抗分析:
- 字符串加密:所有关键字符串都经过XOR运算
- 控制流平坦化:IDA反编译显示大量无意义跳转
- 动态加载:部分函数在运行时通过JNI动态注册
破解方案:
- 使用Frida Hook dlopen函数捕获so加载事件
- 通过内存dump获取解密后的字符串
- 编写IDAPython脚本还原控制流
6.2 反调试检测
应用内置了多种反调试机制:
- 检测/proc/self/status中的TracerPid
- 关键函数执行时间异常检测
- Frida端口扫描检测
绕过方法:
- 使用定制版Frida(如frida-server-android)
- 在非标准端口运行调试服务
- 通过ptrace注入替代方案
7. 安全建议与防护方案
7.1 对开发者的建议
-
密钥保护:
- 采用白盒加密技术替代硬编码
- 实现密钥分段存储+运行时组合
-
协议增强:
- 增加一次性随机数防重放
- 签名有效期缩短至1分钟内
- 密码加密引入动态IV
-
加固措施:
- 关键so库使用VMP保护
- 增加代码完整性校验
- 实现动态密钥协商机制
7.2 对安全研究者的建议
- 所有分析应在合法授权范围内进行
- 发现漏洞后应遵循负责任的披露流程
- 公开研究成果时需脱敏关键细节
在实际测试中,我们发现当连续发送异常请求时,服务端会触发IP临时封禁机制。建议在测试时控制请求频率,必要时通过代理池轮换IP。对于关键算法验证,最好先在本地模拟环境测试通过后再对接真实接口。