|
|
发表于
2026-5-16 23:51:55
|
显示全部楼层
来自 浙江
看了你贴的描述 帮你定位下问题在哪 排查路线清晰一点
【现象拆解】
1. UI登录验证过了 → 说明 壳层签名校验 / 主登录接口 没拦你
2. 运行脚本时提示无效 → 这是 脚本调用前的二次激活校验
3. shop模块JS加密 → 校验逻辑在 JS 文件里 而不是 dex
说明软件类型 八成是 iApp / E4A 写的 用 JS脚本 模块做业务
(也就是俗称的"工具壳" 主体是runtime so 业务逻辑全在assets里的js)
【三层排查】按顺序来
第一层 抓校验现场
点"运行脚本"那一刻 弹出"无效"之前 软件至少做了:
- 读了某个本地配置文件 (用户卡密/设备ID)
- 算了个签名/MD5
- 发了个POST请求验真伪 或者 本地比对
排查方法:
- 抓包工具: HttpCanary / 小黄鸟 / reqable
- 打开"自动跟进" 直接点运行脚本
- 看有没有POST 出去
复制代码
如果有POST → 是服务端验证 8楼说的对 不能本地破
如果没POST → 纯本地校验 100%能搞 继续往下
第二层 找JS解密入口
云镜壳 + iApp shop模块 JS加密的标准玩法是
- 启动时 dex 里的 EvalJS / runJS 调用之前 先 AES/Base64解密
- 解密 key 写在 dex 里
排查:
- 1. MT打开 dex 搜方法名: decryptJS / runJs / evalJs / decode / decrypt
- 2. 找到 byte[] 解密方法 看入参
- 3. dex搜字符串: AES / DES / Base64 + 那个加密JS文件名 (比如 shop.js shop.txt)
- 4. 找到调用解密的Activity 一般是 ScriptActivity / ShopActivity
复制代码
抓出明文js最简单的法子 → 不用解密 直接hook
[code=java]
// LSPosed / Frida 都行
// 楼主用Frida更方便
Java.perform(function() {
// hook常见JS引擎入口
var ctx = Java.use("org.mozilla.javascript.Context");
ctx.evaluateString.overload(
"org.mozilla.javascript.Scriptable",
"java.lang.String",
"java.lang.String", "int",
"java.lang.Object"
).implementation = function(s, src, n, l, o) {
console.log("[JS明文] " + n);
console.log(src); // 这里就是解密后的JS
return this.evaluateString(s, src, n, l, o);
};
});[/code]
如果用的是 Rhino 引擎 上面这段抓出的就是明文JS
用的是 J2V8 / QuickJS 类似 hook 对应包名即可
第三层 拿到明文JS后
看有没有这种代码:
[code=javascript]
if (verify(uid, key) != "ok") {
toast("无效");
return;
}[/code]
直接hook这个verify 让它永远返回ok
或者找它的 卡密本地白名单 (有的脚本工具就是硬编码几个key)
- MT搜字符串: 无效 / 失败 / 卡密 / 激活
- 看上下文有没有 if 比对
复制代码
【兜底方案】
如果三层都不行 大概率是8楼说的"服务端抢" 那就别破壳了
直接抓抢的接口本身 自己写个python脚本去抢就完事 不依赖APP
【需要的话提供这些信息我帮你定位】
1. 这APK的 lib/arm64-v8a/ 下面有哪些so (截图)
2. assets/ 目录的文件列表
3. logcat 在你点"运行脚本"那一秒的日志
4. 抓包看有没有POST出去
这4个信息齐了 大概率能定位到具体哪一行卡你 |
|