【APP 逆向百例】淘某热点 APP 逆向分析
字数 1126 2025-08-29 08:29:41
淘某热点APP逆向分析教学文档
一、逆向目标
- 目标APP:淘某热点APP
- 版本:2.6.7
- 逆向参数:sign签名参数
- 下载地址:aHR0cHM6Ly93d3cud2FuZG91amlhLmNvbS9hcHBzLzc4Mzc0MTc= (Base64解码后获取真实地址)
二、抓包分析
- 使用Charles配合SocksDroid进行抓包
- 在APP首页刷新操作时捕获请求
- 发现关键参数sign需要逆向分析
三、逆向分析方法
1. 定位sign参数生成位置
方法一:直接搜索关键字sign
方法二:Frida Hook HashMap类
function showStacks() {
Java.perform(function () {
console.log(Java.use("android.util.Log").getStackTraceString(
Java.use("java.lang.Throwable").$new()
));
})
}
// HashMap.put方法Hook
function hook_hashMap(){
var hashMap = Java.use("java.util.HashMap");
hashMap.put.implementation = function (a,b){
if (a === "sign"){
// 查看调用栈
showStacks()
}
console.log('hook_hashMap输出-->',a,b)
return this.put(a,b)
}
}
Java.perform(function() {
hook_hashMap()
});
执行命令:
frida -UF -l demo.js -o 1.txt
2. Java层分析
- 使用JADX反编译APK
- 根据堆栈信息定位到
com.maihan.tredian.util.TreUtil.sign方法 - 验证定位是否正确:
function hook1(){
let TreUtil = Java.use("com.maihan.tredian.util.TreUtil");
TreUtil["sign"].implementation = function (str) {
console.log('sign is called str: ' + str);
let ret = this.sign(str);
console.log('sign ret value is ' + ret);
return ret;
};
}
Java.perform(function () {
hook1();
});
- 发现最终调用native层加密,加载
tre.so文件
3. 主动调用sign方法
// sign function call_taozui(){
let TreUtil = Java.use("com.maihan.tredian.util.TreUtil");
// 主动调用sign方法
let str = "android_id=9a8493c270cc2270&app_ver=87&channel=aliapp&device_id=5e9bdbbc3bc779c18511c1bb26351dad&device_udid=8f6e2b8cf3b2e3c36db8dea8368d7305&first_time=1706003627&from=app&last_time=1695744000&limit=8&mac=0E:D8:C1:64:25:37&nonce=4vlwb71740715028559&os_ver_code=30&system=1×tamp=1740715028&with_super=0&with_video=1";
console.log('Before calling sign, str: ' + str);
// 调用sign方法
let result = TreUtil.sign(str);
console.log('After calling sign, result: ' + result);
}
四、SO层分析
1. 获取SO文件
从APK的lib目录下获取tre.so文件
2. IDA静态分析
- 在导出表中搜索
Java,确认是静态注册 - 定位到
sign函数 - 发现明显的SHA1算法特征
- 但直接使用标准SHA1算法计算结果不一致
3. 关键函数分析
发现j_base64_encode_new函数,可能是加密流程中的关键步骤
4. Frida Hook SO层函数
var soAddr = Module.findBaseAddress("libtre.so");
// 32位需要加1
var base64_encode_new = soAddr.add(0x13B4+1);
Interceptor.attach(base64_encode_new,{
onEnter:function (args){
console.log("参数1",args[0].readCString());
console.log("参数2",hexdump(args[1]));
console.log("参数3",args[2].toInt32());
},
onLeave:function (retval){
console.log("返回值为:",retval.readCString())
}
});
5. 加密流程分析
- 在查询参数后添加特定字符串(加盐)
- 对加盐后的字符串进行Base64编码
- 对Base64编码结果进行标准SHA1算法加密
五、完整加密流程
- 参数拼接:将所有请求参数按固定顺序拼接成字符串
- 加盐处理:在参数字符串后添加特定字符串
- Base64编码:对加盐后的字符串进行Base64编码
- SHA1加密:对Base64编码结果进行标准SHA1算法加密
- 生成sign:将SHA1结果作为最终的sign值
六、验证方法
- 使用标准SHA1工具验证中间结果
- 对比Frida Hook获取的值与计算结果
- 确保每一步处理与APP实际处理一致
七、注意事项
- 本分析仅供学习交流使用
- 严禁用于商业用途和非法用途
- 抓包内容、敏感网址、数据接口等均已做脱敏处理
- 不提供完整代码,防止滥用
八、总结
通过本次逆向分析,我们完整还原了淘某热点APP的sign参数生成流程,涉及Java层定位、Native层分析、加密算法还原等关键技术点。关键点在于:
- 使用Frida Hook快速定位关键函数
- Java层与Native层的交互分析
- 非标准加密算法的逆向分析
- 加盐、Base64编码、SHA1加密的组合使用
这种分析方法可以应用于其他APP的类似参数逆向场景。