某某新闻逆向分析
字数 1678 2025-08-22 12:22:15
某某新闻APP逆向分析技术文档
1. 分析背景
本文档详细记录了某某新闻APP中关键参数sn和st的逆向分析过程,这两个参数用于新闻请求的身份验证,不能随意修改否则会导致请求失效。
2. 分析工具准备
- 反编译工具: JADX
- 脱壳工具: BlackDex (https://github.com/CodingGay/BlackDex/releases)
- Hook框架: Frida
- 反汇编工具: IDA Pro
- 调试工具: ADB
3. 逆向分析步骤
3.1 初步观察
通过抓包发现新闻请求中包含两个关键参数:
sn: 签名参数st: 时间戳相关参数
这两个参数会随请求变化,且不能随意修改。
3.2 APK分析
- 发现加壳:使用JADX打开APK后发现应用被腾讯加固保护
- 脱壳处理:
- 使用BlackDex进行脱壳
- 修改存储路径后点击目标APK进行脱壳
- 使用
adb pull将脱壳后的DEX文件导出
3.3 关键代码定位
- 搜索关键字:在JADX中搜索
sn=定位关键代码 - Hook验证:使用Frida编写Hook代码确认关键函数
function hook_a() {
Java.perform(function() {
var bmzClass = Java.use('bmz$a');
bmzClass.a.overload('boolean').implementation = function(z) {
var result = this.a(z);
console.log("result=", result);
return result;
};
});
}
setImmediate(hook_a);
通过Hook确认bmz$a类中的方法负责生成sn和st参数。
3.4 st参数生成分析
st参数的生成逻辑:
- 获取当前时间戳
- 生成随机数
- 将时间戳和随机数进行拼接
- 最终格式:
st=[时间戳+随机数]
3.5 sn参数生成分析
sn参数的生成更为复杂,涉及多个步骤:
-
调用链:
sn值通过调用a方法生成,传入str(与st相同)和一个布尔值 -
关键变量:
this.f2266a: 版本号(如"7.38.0")this.e: 固定值"ifengnews"this.j: 固定值2964this.c: 固定值"v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf"this.l: 空字符串""- 布尔参数
z: 固定为false
-
MD5 Key获取:
- 调用native层的
readMD5Key函数 - 通过IDA反编译
ifeng_secure库发现该函数返回固定字符串:
"acF%# {_b1mQt@..ifvy"
- 调用native层的
-
拼接规则:
- 将以下内容按顺序拼接:
this.f2266a(版本号)this.e("ifengnews")this.l(空字符串)this.j(2964)this.c("v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf")sn(原始值)str3(空字符串,因为z=false)- MD5 Key ("acF%# {_b1mQt@..ifvy")
- 将以下内容按顺序拼接:
-
MD5计算:
- 使用
ces.b函数对拼接后的字符串进行标准MD5计算 - 最终结果即为
sn参数值
- 使用
3.6 完整Hook代码
function hook_a2() {
Java.perform(function() {
var BmzClass = Java.use('bmz$a');
BmzClass.a.overload('java.lang.String', 'boolean').implementation = function(str, z) {
console.log("z====> " + z);
console.log("this.e====> " + this.e);
console.log("this.j====> " + this.j);
console.log("this.c====> " + this.c);
console.log("this.l====> " + this.l);
var result = this.a(str, z);
return result;
};
});
}
4. 参数生成算法总结
4.1 st生成算法
st = [当前时间戳] + [随机数]
4.2 sn生成算法
-
拼接字符串:
raw_str = version + "ifengnews" + "" + "2964" + "v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf" + sn + "" + "acF%# {_b1mQt@..ifvy"其中:
- version: 应用版本号(如7.38.0)
- sn: 原始sn值
- 其他为固定值
-
计算MD5:
sn = MD5(raw_str)
5. 关键发现
- 固定值:大部分参与签名的参数在同一设备上是固定的
- 设备指纹:签名算法没有使用设备唯一标识,同一版本APP在不同设备上生成的签名可能相同
- 时效性:
st参数确保每次请求都不同,防止重放攻击 - 签名保护:核心MD5 Key存放在native层,增加逆向难度
6. 重现签名算法(Python示例)
import hashlib
import time
import random
def generate_st():
timestamp = int(time.time() * 1000)
rand_num = random.randint(0, 9999)
return f"{timestamp}{rand_num}"
def generate_sn(version="7.38.0", original_sn=""):
# 固定值
e = "ifengnews"
j = "2964"
c = "v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf"
l = ""
str3 = ""
md5_key = "acF%# {_b1mQt@..ifvy"
# 拼接字符串
raw_str = version + e + l + j + c + original_sn + str3 + md5_key
# 计算MD5
return hashlib.md5(raw_str.encode('utf-8')).hexdigest()
# 示例使用
st = generate_st()
sn = generate_sn(original_sn=st) # 通常original_sn与st相关
print(f"st={st}")
print(f"sn={sn}")
7. 防护建议
对于APP开发者:
- 增加设备指纹参与签名
- 定期更换MD5 Key
- 增加签名时效性验证
- 使用更复杂的签名算法
对于安全研究人员:
- 关注native层保护
- 动态分析与静态分析结合
- 注意Hook工具的防检测
8. 总结
本文详细分析了某某新闻APP的请求签名机制,揭示了sn和st参数的生成原理。该签名方案结合了动态参数和固定密钥,通过MD5算法确保请求的合法性。虽然有一定的防护措施,但通过系统的逆向分析仍可破解其签名算法。