某某新闻逆向分析
字数 1678 2025-08-22 12:22:15

某某新闻APP逆向分析技术文档

1. 分析背景

本文档详细记录了某某新闻APP中关键参数snst的逆向分析过程,这两个参数用于新闻请求的身份验证,不能随意修改否则会导致请求失效。

2. 分析工具准备

  • 反编译工具: JADX
  • 脱壳工具: BlackDex (https://github.com/CodingGay/BlackDex/releases)
  • Hook框架: Frida
  • 反汇编工具: IDA Pro
  • 调试工具: ADB

3. 逆向分析步骤

3.1 初步观察

通过抓包发现新闻请求中包含两个关键参数:

  • sn: 签名参数
  • st: 时间戳相关参数

这两个参数会随请求变化,且不能随意修改。

3.2 APK分析

  1. 发现加壳:使用JADX打开APK后发现应用被腾讯加固保护
  2. 脱壳处理
    • 使用BlackDex进行脱壳
    • 修改存储路径后点击目标APK进行脱壳
    • 使用adb pull将脱壳后的DEX文件导出

3.3 关键代码定位

  1. 搜索关键字:在JADX中搜索sn=定位关键代码
  2. 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类中的方法负责生成snst参数。

3.4 st参数生成分析

st参数的生成逻辑:

  1. 获取当前时间戳
  2. 生成随机数
  3. 将时间戳和随机数进行拼接
  4. 最终格式:st=[时间戳+随机数]

3.5 sn参数生成分析

sn参数的生成更为复杂,涉及多个步骤:

  1. 调用链sn值通过调用a方法生成,传入str(与st相同)和一个布尔值

  2. 关键变量

    • this.f2266a: 版本号(如"7.38.0")
    • this.e: 固定值"ifengnews"
    • this.j: 固定值2964
    • this.c: 固定值"v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf"
    • this.l: 空字符串""
    • 布尔参数z: 固定为false
  3. MD5 Key获取

    • 调用native层的readMD5Key函数
    • 通过IDA反编译ifeng_secure库发现该函数返回固定字符串:
      "acF%# {_b1mQt@..ifvy"
  4. 拼接规则

    • 将以下内容按顺序拼接:
      1. this.f2266a (版本号)
      2. this.e ("ifengnews")
      3. this.l (空字符串)
      4. this.j (2964)
      5. this.c ("v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf")
      6. sn (原始值)
      7. str3 (空字符串,因为z=false)
      8. MD5 Key ("acF%# {_b1mQt@..ifvy")
  5. 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生成算法

  1. 拼接字符串:

    raw_str = version + "ifengnews" + "" + "2964" + "v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf" + sn + "" + "acF%# {_b1mQt@..ifvy"
    

    其中:

    • version: 应用版本号(如7.38.0)
    • sn: 原始sn值
    • 其他为固定值
  2. 计算MD5:

    sn = MD5(raw_str)
    

5. 关键发现

  1. 固定值:大部分参与签名的参数在同一设备上是固定的
  2. 设备指纹:签名算法没有使用设备唯一标识,同一版本APP在不同设备上生成的签名可能相同
  3. 时效性st参数确保每次请求都不同,防止重放攻击
  4. 签名保护:核心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开发者:

  1. 增加设备指纹参与签名
  2. 定期更换MD5 Key
  3. 增加签名时效性验证
  4. 使用更复杂的签名算法

对于安全研究人员:

  1. 关注native层保护
  2. 动态分析与静态分析结合
  3. 注意Hook工具的防检测

8. 总结

本文详细分析了某某新闻APP的请求签名机制,揭示了snst参数的生成原理。该签名方案结合了动态参数和固定密钥,通过MD5算法确保请求的合法性。虽然有一定的防护措施,但通过系统的逆向分析仍可破解其签名算法。

某某新闻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代码确认关键函数 通过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 : 固定值2964 this.c : 固定值"v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf" this.l : 空字符串"" 布尔参数 z : 固定为false MD5 Key获取 : 调用native层的 readMD5Key 函数 通过IDA反编译 ifeng_secure 库发现该函数返回固定字符串: "acF%# {_b1mQt@..ifvy" 拼接规则 : 将以下内容按顺序拼接: 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代码 4. 参数生成算法总结 4.1 st生成算法 4.2 sn生成算法 拼接字符串: 其中: version: 应用版本号(如7.38.0) sn: 原始sn值 其他为固定值 计算MD5: 5. 关键发现 固定值 :大部分参与签名的参数在同一设备上是固定的 设备指纹 :签名算法没有使用设备唯一标识,同一版本APP在不同设备上生成的签名可能相同 时效性 : st 参数确保每次请求都不同,防止重放攻击 签名保护 :核心MD5 Key存放在native层,增加逆向难度 6. 重现签名算法(Python示例) 7. 防护建议 对于APP开发者: 增加设备指纹参与签名 定期更换MD5 Key 增加签名时效性验证 使用更复杂的签名算法 对于安全研究人员: 关注native层保护 动态分析与静态分析结合 注意Hook工具的防检测 8. 总结 本文详细分析了某某新闻APP的请求签名机制,揭示了 sn 和 st 参数的生成原理。该签名方案结合了动态参数和固定密钥,通过MD5算法确保请求的合法性。虽然有一定的防护措施,但通过系统的逆向分析仍可破解其签名算法。