|
|
本帖最后由 fc1314 于 2026-6-1 03:12 编辑
https://bbs.binmt.cc/thread-166156-1-1.html 楼主分享,但是我想更进一步
APP下载:https://bbs.binmt.cc/thread-166572-1-1.html
我现在分析出他接口的列表页面的算法以及,mp3的的地址算法。但是实际请求这个mp3的时候他有很强的验证
列表与mp3地址的算法如下
- //
- // Decompiled by Jadx - 604ms
- //
- package com.funny.wizardnotebook.core.net;
- import java.util.Base64;
- import javax.crypto.Cipher;
- import javax.crypto.spec.SecretKeySpec;
- import kotlin.Metadata;
- import kotlin.jvm.internal.Intrinsics;
- import kotlin.text.Charsets;
- @Metadata(d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0003\bÆ\u0002\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u0016\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u00042\u0006\u0010\u0006\u001a\u00020\u0004¨\u0006\u0007"}, d2 = {"Lcom/funny/wizardnotebook/core/net/DesDecryptor;", "", "()V", "decrypt", "", "encryptedText", "secretKey", "app_normalRelease"}, k = 1, mv = {1, 8, 0}, xi = 48)
- public final class DesDecryptor {
- public static final DesDecryptor INSTANCE = new DesDecryptor();
- private DesDecryptor() {
- }
- public final String decrypt(String str, String str2) {
- Intrinsics.checkNotNullParameter(str, "encryptedText");
- Intrinsics.checkNotNullParameter(str2, "secretKey");
- byte[] bytes = str2.getBytes(Charsets.UTF_8);
- Intrinsics.checkNotNullExpressionValue(bytes, "getBytes(...)");
- SecretKeySpec secretKeySpec = new SecretKeySpec(bytes, "DES");
- Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
- cipher.init(2, secretKeySpec);
- byte[] doFinal = cipher.doFinal(Base64.getDecoder().decode(str));
- Intrinsics.checkNotNullExpressionValue(doFinal, "decryptedData");
- return new String(doFinal, Charsets.UTF_8);
- }
- }
复制代码 java解析代码
请求地址解析出来的结果
http://58.49.146.24:30102/api/bu ... 1jpg0m4gq2a3zt.json
[
{
"id": "48c9a4f05c671a7b28e9a2ba32bb320d",
"albumId": "01k1rg2vys131jpg0m4gq2a3zt",
"publishTime": 1753426637000,
"title": "杨洋邀你来听影视原著,提前解锁大结局",
"sort": 0,
"coverPath": "cover/track/default.webp"
},
{
"id": "6ee6af09df35c4e9b9348fe4220ceaf2",
"albumId": "01k1rg2vys131jpg0m4gq2a3zt",
"publishTime": 1648615731000,
"title": "《凡人修仙传》预告",
"sort": 1,
"coverPath": "cover/track/default.webp"
}
]
- package cn.com.oyat.idea.test;
- import cn.hutool.http.HttpUtil;
- import cn.hutool.json.JSONObject;
- import cn.hutool.json.JSONUtil;
- import javax.crypto.Cipher;
- import javax.crypto.spec.SecretKeySpec;
- import java.nio.charset.StandardCharsets;
- import java.util.Base64;
- public class AppDecrypt {
- // 固定映射关系
- private static final String TYPE_1 = "DnvVswKW";
- private static final String KEY_1 = "rThYzbEp";
- private static final String TYPE_2 = "czXzSZjk";
- private static final String KEY_2 = "AEEkTXLK";
- /**
- * 对外统一入口,等价原 CryptoLib.decryptData
- * @param encType 接口返回的 encType
- * @param encData 接口返回的 encData(Base64密文)
- * [url=home.php?mod=space&uid=134981]@Return[/url] 解密后的明文
- */
- public static String decrypt(String encType, String encData) {
- String key;
- if (TYPE_1.equals(encType)) {
- key = KEY_1;
- } else if (TYPE_2.equals(encType)) {
- key = KEY_2;
- } else {
- return "";
- }
- return desEcbDecrypt(encData, key);
- }
- /**
- * 原生 DesDecryptor 逻辑:DES/ECB/PKCS5Padding + Base64 + UTF-8
- */
- private static String desEcbDecrypt(String encryptedText, String secretKey) {
- try {
- // 1. 密钥转 UTF-8 字节
- byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
- SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");
- // 2. 初始化 DES/ECB/PKCS5Padding 解密器
- Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
- cipher.init(Cipher.DECRYPT_MODE, keySpec);
- // 3. Base64 解码
- byte[] base64Decode = Base64.getDecoder().decode(encryptedText);
- // 4. DES 解密
- byte[] decBytes = cipher.doFinal(base64Decode);
- // 5. UTF-8 转字符串
- return new String(decBytes, StandardCharsets.UTF_8);
- } catch (Exception e) {
- e.printStackTrace();
- return "";
- }
- }
- // 测试示例
- public static void main(String[] args) {
- // 替换成你抓到的真实数据
- //String bodystr=HttpUtil.get("http://210.16.182.232:11001/api/business/v1/album/analysis/01k1rg2vys131jpg0m4gq2a3zt/48c9a4f05c671a7b28e9a2ba32bb320d.json");
- String bodystr="{\n" +
- " "body": {\n" +
- " "encType": "DnvVswKW",\n" +
- " "encData": "rnrmucwHziTUOd/+JO26xkaXTzyTGj4Lh5A+CSxcq/r9qC1ebDQyBX81/s60QWFkYcD2FCK2s3zW7HVNXgmXQpvSLqebxcdCaJV3BbeiKG/oysktMaYydkT+2agCRPss9PjjBWozfDwBPL7KOt7ZXcrhAsfCLeTAxpI7fFJLdbqHKBVnQqYr1zEUqXmvEueBtWPuSNZxs7JLHpdxO2ulVm+kNf2UNS5Cq9kDysMOjPU="\n" +
- " },\n" +
- " "code": 1001,\n" +
- " "message": "successed",\n" +
- " "processingTime": 0,\n" +
- " "requestTime": 0\n" +
- "}";
- JSONObject jsonObject= JSONUtil.parseObj(bodystr);
- JSONObject jsonbody= jsonObject.getJSONObject("body");
- String result = decrypt(jsonbody.getStr("encType"), jsonbody.getStr("encData"));
- System.out.println("解密结果:\n" + result);
- }
- }
复制代码
我在实际请求的时候,就碰到了这里面的sign1-sign7的参数算法,我搞不定
AI分析参数如下
[td]字段 | 入参 1 | 调用链路 | | sign1 | 资源路径 (去首 /) | getSign2(path) | | sign2 | 资源路径 (去首 /) | getSign4(path) | | sign3 | 客户端时间戳 | getSign5(timestamp) | | sign4 | 固定串 + 时间戳 | XXOO(getNewSign4(), timestamp) | | sign5 | 固定串 + 时间戳 | XXOO(getNewSign5(), timestamp) | | sign6 | 时间戳 + 时间戳 | XXOO(getSign6(timestamp), timestamp) | | sign7 | 固定串 + 时间戳 | XXOO(getSign7(), timestamp) |
个人分析结果
http://track-yqts.umeng-nlog.com/01k1rg2vys131jpg0m4gq2a3zt/48c9a4f05c671a7b28e9a2ba32bb320d.mp3
psign: 1af6e5f4689a5459f196d35ebb5cd855 固定
userId: 7c83f252783d58a754db669f7776cf78 固定
sign2: $$886c842f8ab8ab2f5dafe0a89f119657$$ 不固定
sign1: $$af04c7caf0da25f2c0b8d1020746a7ed$$ 不固定
sign4: YlJbRUBVelVPAAAFBCgyFw5DRkg9XRgdXFtXBDQJARwIFjgBEm1dXhsnPEkCBx9Tf0gPClEdWT0xNzAmBxU7CgtGHkFaeDIXDkNGSD1dGB1cW1c1JQgHGS0JIhEcHENdGTUhCFVBXxNzBFZeWVBWJjIWCwYWDmUWFh5RQFhiZ0gVTRNKJwwbUUJLRSA8CQoXXBYkSRhAXQQBeSVdAloeDCkVGFxXXlA1IQgMB1wWJEkYQF0EAXklXQJaHgwpFRhcV15QMj8MEwUXAWUWFh5RQFhiZ0gVTRNKJwwbQlxGGDYyFgZbAQpnBAtfBgYYImsETBkbBzkWE1xZHEY7fwQRGERRZhNBUx9eXDYhFgkbGzoqCx1AX1tRLH0WDFkTFyZTTR9GClR7PwwBBhUGJBccHENdGTUhCFVBXxNzBFZeWVBBPX4IDBsbESQXV0FfHlQmPlNXWARdKkoVW1JGWjYWCAEQFiAlBgtLQEYbJzxJAgcfU39IDwpRHVk9MREXKgcCLgsmXlFLWiEnSxAaXgQ5CE8GHUQNNXwJChcGESYVFVNJV0cLPwwXEFwWJEkYQF0EAXklXQJaHgwpEBRXXlUYJyMcTQYdSSoXFFdRUFx5JVICWh4MKTcqYUVCRTshEU0GHUkqFxRXUVBceSVSAloeDCkGC1NDWkYwOEsQGl4EOQgcU1JbGCJkBEwZGwcoFwBCRF1ZPTFLEBpeBDkIHFNSWxgiZARMGRsHOwQXVVxXUzg6FRMQFks4ClVTQl9QNTEMTgNFBGQJEFBAXkF5MQQQEFwWJEkYQF1XVDY6SBVCE0onDBtAQ1hbPX0WDFkTFyYAGFBZH0NjMkoPHBAXOA8XW29TWzAhCgoRCks4ClVTQl9QNTEMTgNFBGQJEFBDVVY7IQBNBh1JKhcUV1FQXHklUgJaHgwpERAfXV1bPScKEVsBCmcEC19VU1c9fhNUFF0JIgcMX1VcUnkgFRpbAQo= 不固定
sign3: 817002610720613046731 不固定
sign6: YlJbRUBVelVPAAAFBChgV1tNQFdyVgUABk4EY2tVUUVDVX1XSQUB 不固定
sign5: YlJbRUBVelVPAAAFBChjUgJDFwYvBktQAVYDYzcHV0xEVSkEGwADUQw1MgBRRQ== 不固定
sign7: YlJbRUBVelVPAAAFBChgV1tNQFdyVg== 不固定
主要是不会逆向 libcryptolib.so文件在 lib/arm64-v8a/libcryptolib.so 里面,这个核心算法如果。就查最后一部分析出so文件,这个app就宣告完结。求大佬们帮帮我,给我插装信息也许,帮我分析算法也想,麻烦了
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|