安卓逆向之 某川观察

部署运行你感兴趣的模型镜像

环境:

ida: IDA Pro 8.3 绿色版(2024.2.26更新) - 吾爱破解 - 52pojie.cn 下载地址

app: 达川新闻最新版 达川观察2025官方下载-达川观察 app 最新版本免费使用-应用宝正版安全下载

接口:推荐列表页接口

语言:python

抓包

接口信息如下:  /getList

主要分析请求参数

参数分析

脱壳反编译

  • 使用jadx-gui反编译包,搜索关键字sign并未发现关键信息,发现此apk是有加固的
  • 我用的是 frida-dexdump进行脱壳,frida-dexdump -FU //直接注入前台应用
  • 脱壳后项目中会多出一个目录,直接把目录内所有的dex文件拖入jadx即可

参数分析

  1. 全局搜索接口名 getList
  2. 借助idea工具直接查看方法引用,可以看到方法调用位置及参数生成位置
  3. 点进方法可以看到,对比抓包工具基本可以确定参数生成位置
  4. 我们可以用frida在这边hook一下,对比抓包工具看下参数是否一致,对比一致,确定参数生成位置
    1. 扣代码
      account
      uuid
      timestamp
      13位时间戳,和data里的
      lastUpdateTime保持一致即可
      deviceId对比抓包工具发现多次请求不变,可以写死
      token        空字符串
      sign签名参数,由account,token,timestamp生成
    2. 其余参数都是固定值

    3. 主要分析sign参数

sign参数分析

点到方法里发现sign是通过so文件来生成的

wtf,对应着libwtf.so,我们只需要解压apk,在lib目录中找到这个so文件即可

so文件分析

ida_pro执行报错,由于找不到msvcp140_1.dll无法继续执行代码

我win10电脑刚开始下载文章开头ida启动会报这个错,我是用下面链接下载修复重启电脑就可以正常使用了

2025最新版|msvcp140_1.dll官方下载_Visual C++运行库核心组件(Win7-Win11全适配)

so逆向

把so文件用ida_pro进行分析,打开软件拖进去,左侧搜索getSign关键字可以搜到对应函数,选中按F5可以跳到反编译页面

分析so代码

1. 获取 Java 类 LogShutDown 和其静态方法 getAppSign:(frida hook可得这个函数返回的是固定值,直接写死即可)

clazz = _JNIEnv::FindClass(env, "cn/thecover/lib/common/utils/LogShutDown");
methodID = _JNIEnv::GetStaticMethodID(env, clazz, "getAppSign", "()Ljava/lang/String;");
string = (_jstring *)_JNIEnv::CallStaticObjectMethod(env, clazz, methodID);

2. 对返回的签名做 MD5,并转为大写:

__s = (unsigned __int8 *)_JNIEnv::GetStringUTFChars(env, string, 0);
 std::string::basic_string<decltype(nullptr)>(&v25, __s); md5(&src, &v25); 
toUpperCase(&appsignMd5result, &src);

3. 处理参数 account, token, timestamp

__rhs = (std::string::value_type *)_JNIEnv::GetStringUTFChars(env, account, 0); 
utf = (unsigned __int8 *)_JNIEnv::GetStringUTFChars(env, token, 0); 
StringUTFChars = (unsigned __int8 *)_JNIEnv::GetStringUTFChars(env, timestamp, 0);


将这几个 Java 字符串转换为 UTF-8 字节指针。

4. 拼接字符串进行加密:

std::operator+<char>(&__lhs, &appsignMd5result, __rhs);       // App签名 + account
std::operator+<char>(&v23, &__lhs, utf);                      // + token
std::operator+<char>(&encrypt, &v23, StringUTFChars);         // + timestamp

5. 再做一次 MD5 并转为大写:

std::string::basic_string(&v19, &encrypt);
md5(&v20, &v19);
toUpperCase(&result, &v20);

这是最终要返回的字符串。


6. 释放资源、返回结果:

bytes = (unsigned __int8 *)std::string::c_str(&result);
v18 = _JNIEnv::NewStringUTF(env, bytes);

将最终结果转成 Java 的 jstring 并返回。


🧨 异常处理:

如果找不到类或方法,会打印日志并返回 "wtf" 字符串,表明程序进入了异常分支。


✅ 总结:

这是一个 Java 调用的 native 层加密签名方法,逻辑如下:

  1. 获取 Java 层 App 的签名;

  2. 做一次 MD5 + 大写处理;

  3. 拼接 sign + account + token + timestamp

  4. 再做一次 MD5 + 大写;

  5. 返回结果。

模拟调用

根据上述逻辑,我们直接用python模拟一段脚本来执行,可以看到,可以正常返回结果

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ifccod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值