环境:
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即可

参数分析
- 全局搜索接口名 getList

- 借助idea工具直接查看方法引用,可以看到方法调用位置及参数生成位置

- 点进方法可以看到,对比抓包工具基本可以确定参数生成位置

- 我们可以用frida在这边hook一下,对比抓包工具看下参数是否一致,对比一致,确定参数生成位置
- 扣代码
account
uuid timestamp
13位时间戳,和data里的 lastUpdateTime保持一致即可
deviceId 对比抓包工具发现多次请求不变,可以写死 token 空字符串 sign 签名参数,由account,token,timestamp生成 -
其余参数都是固定值
-
主要分析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 层加密签名方法,逻辑如下:
-
获取 Java 层 App 的签名;
-
做一次 MD5 + 大写处理;
-
拼接
sign + account + token + timestamp; -
再做一次 MD5 + 大写;
-
返回结果。
模拟调用
根据上述逻辑,我们直接用python模拟一段脚本来执行,可以看到,可以正常返回结果



被折叠的 条评论
为什么被折叠?



