本帖最后由 seventeenJoy 于 2026-2-5 10:56 编辑
应用是某k小说
准备:
1.MT/NP管理器
2.root手机
3.jadx反编译工具
4.Frida 16及以下环境(推荐)
5.算法助手
注意:
1.旧版有腾讯加固,新版(7.9.6)没有;想尝试脱壳的可以选择某豆荚下载(都不是最新版),最新版则网页搜索一下或者看自带商店有没有,腾讯加固如何脱壳可以看论坛,很多大佬都有讲,也可以看我上一篇帖子:https://www.52pojie.cn/thread-2089927-1-1.html
2.没有签名校验
3.使用Frida加强版,安卓10最好是Frida 16以下,这个app我使用Frida 16去hook页面会卡死,我换成15.1.17版本好一点;Frida增强版(hluda/florida)链接:https://github.com/hzzheyang/strongR-frida-android/releases?page=13
打开应用,选择游客登录
在主页点击会员页面的时候,有一个强制绑定手机号的弹窗
我使用算法助手和objection去打印调用栈,发现是一个Activity,且调用栈有用信息只有这一个app Activity类
于是我寻思是不是直接在onCreate里面判断了我是否有无绑定手机号,但是里面啥都没有,只有绑定操作这些
[Java] 纯文本查看 复制代码 package com.chineseall.reader.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.TextView;
import com.chineseall.reader.R;
import com.sensorsdata.analytics.android.sdk.SensorsDataInstrumented;
import com.sensorsdata.analytics.android.sdk.aop.push.PushAutoTrackHelper;
import d.g.b.D.P0;
import e.a.Y.g;
/* loaded from: classes.dex */
public class CommonDialogActivity extends Activity {
public static final String COMMENT_NEED = "根据相关网络安全条例,发布评论需绑定你的手机号";
public static final String SECURITE_NEED = "为了您的账号安全,\n建议您进行手机号验证";
public TextView tv_update;
public TextView tv_updateCancel;
public TextView tv_updateContent;
private void init() {
this.tv_updateContent = (TextView) findViewById(R.id.tv_updateContent);
this.tv_updateCancel = (TextView) findViewById(R.id.tv_updateCancel);
this.tv_update = (TextView) findViewById(R.id.tv_update);
}
public /* synthetic */ void a(Object obj) throws Exception {
BindMobileActivity.startActivity(this);
finish();
}
public /* synthetic */ void b(Object obj) throws Exception {
finish();
}
@Override // android.app.Activity
public void onCreate(Bundle bundle) {
requestWindowFeature(1);
super.onCreate(bundle);
setContentView(R.layout.activity_common_dialog);
init();
String stringExtra = getIntent().getStringExtra("content");
if (TextUtils.isEmpty(stringExtra)) {
this.tv_updateContent.setText(SECURITE_NEED);
} else {
this.tv_updateContent.setText(stringExtra);
}
P0.a(this.tv_update, new g() { // from class: d.g.b.C.a.R0
@Override // e.a.Y.g
public final void accept(Object obj) throws Exception {
this.a.a(obj);
}
});
P0.a(this.tv_updateCancel, new g() { // from class: d.g.b.C.a.S0
@Override // e.a.Y.g
public final void accept(Object obj) throws Exception {
this.a.b(obj);
}
});
}
@Override // android.app.Activity
@SensorsDataInstrumented
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
PushAutoTrackHelper.onNewIntent(this, intent);
}
}
那为什么调用栈没有其他类的方法信息?很纳闷,后面让AI给我写了一个Frida hook脚本,才捕捉到了完整的调用栈;
[JavaScript] 纯文本查看 复制代码 Java.perform(function() {
var Activity = Java.use("android.app.Activity");
Activity.startActivity.overload('android.content.Intent').implementation = function(intent) {
var component = intent.getComponent();
if (component && component.getClassName().indexOf("CommonDialogActivity") !== -1) {
console.log("[+] Attempting to start CommonDialogActivity!");
console.log("Intent Details: " + intent);
console.log("--- Call Stack ---");
// 打印调用栈,找出是哪个类和方法触发了启动
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
console.log("------------------");
}
// 调用原始方法
return this.startActivity(intent);
};
});
后面就是去对应的smali修改这个语句了,我这里直接让它调用后返回
最后也是成功过掉了弹窗,但有时候页面和正常手机号绑定后的不一样,会少了超级会员切换界面,这个就不知道怎么回事了
说一下调用栈的问题,AI的解释是:
然后我们继续改逻辑成为超会,在jadx或MT/NP管理器搜索,找到如下方法:
后面发现是网络请求返回的数据,请求地址是:https://api.17k.com/user/monthDetail,
部分请求参数如下:
返回如下,我觉得重点的地方已标注:
利用HTTPCanary修改返回,如下:
着实也不知道具体应该怎么样返回给它解析,这样修改后页面倒是有写超级会员,也是设置的过期时间,但页面获取请求失败了;后续尝试发现好像是它服务器就有点问题(大概),有时候正常打开不抓包也这样,这个无法考究了。至于说我是不是真的修改成了超会也没找到可以验证的地方,就当个学习HTTPCanary改包测试的练习了
|