小学生

- 金币
- 46
- 好评
- 0
- 信誉
- 100

|
本帖最后由 xiaomengbi 于 2026-4-29 00:01 编辑
因为每次打开超级课程表长达五秒的广告+神一般的自动跳转,让我这个每天赖床不想去早八。好不容易哄好自己上早八,紧赶慢赶的到教学楼下正要打开课程表看是哪个教室,结果一下子跳转到别的界面的大学生感受到异常的崩溃(因为本人手机巨拉胯,反应堪比老年机)
所以痛定思痛我决定好好修理修理这个超级课程表,让它好好听话。
一通分析下来,是个自定义的壳,常规步骤:换入口,添dex,去签。
接下来就是去广告的分析
我们打开Activity记录看一下超级课程表的跳转流程,忽略掉第一次打开的login和custom
打开软件-->InitActivity-->MainFragment(主要功能实现)
广告是出现在InitActivity中的那应该就是和这个类中的onCreate脱不了干系。
好的,有了大致的思路我们去mt管理器瞅瞅
到达onCreate之后转成java。
wow!这么多,看来要消耗掉我一节水课了。
- public void onCreate(Bundle bundle) {
- String str = "wxb81788a085843d31";
- LaunchManager.onTracePage(this, "page_onCreate", true);
- E1();
- super.onCreate(bundle);
- StringBuilder stringBuilder;
- if ((getIntent().getFlags() & 4194304) != 0) {
- String stringExtra = getIntent().getStringExtra("shortcut_activity");
- stringBuilder = new StringBuilder();
- stringBuilder.append("shortcutActivity = ");
- stringBuilder.append(stringExtra);
- u40.on(stringBuilder.toString());
- if (TextUtils.isEmpty(stringExtra) || s30.on().package() || FridayApplication.getApp().getForegroundActivity() == null) {
- finish();
- } else {
- G1(FridayApplication.getApp().getForegroundActivity(), stringExtra);
- }
- return;
- }
- String str2;
- j07.catch(getWindow(), 0);
- j07.break(getWindow(), true);
- f23.ok(getIntent());
- if (!s30.on().package()) {
- try {
- yd2.import();
- if (TextUtils.isEmpty(StringRequest.userAgent)) {
- StringRequest.userAgent = WebSettings.getDefaultUserAgent(this);
- }
- WXAPIFactory.createWXAPI(this, str).registerApp(str);
- } catch (Exception e) {
- u40.class(e);
- }
- }
- z1();
- EventBus.getDefault().register(this);
- AdvertisementWallManager advertisementWallManager = AdvertisementWallManager.if();
- String str3 = "scene";
- if (MainFragmentActivity.isApplicationShow()) {
- str2 = "hot";
- } else {
- advertisementWallManager.finally(AppearExpectMode.OnFirstGoToMainActivity);
- str2 = "cold";
- new h14().no("app_launch").on(str3, str2).oh();
- }
- this.x0 = b.native(this);
- if (!TextUtils.isEmpty(getIntent().getStringExtra("f"))) {
- getIntent().putExtra("notification_schema", "xtuonefriday://paper/paper");
- }
- new h14().no("splash_ad_scene").on(str3, str2).oh();
- advertisementWallManager.continue();
- ie4.on(getApplicationContext());
- F1();
- if (!H0) {
- j04.ok.on(this, s30.on().package() ^ 1);
- H0 = true;
- }
- Log.e("cola:InitActivity:", "onCreate");
- if (!(s30.on().package() || d.d())) {
- e90 n = e90.n();
- stringBuilder = new StringBuilder();
- stringBuilder.append(e90.n().b0().getStudentId());
- stringBuilder.append("");
- List w = n.w(stringBuilder.toString());
- if (w != null && w.size() > 0) {
- H1(q1(u33.case(w)));
- }
- }
- }
复制代码 emmm找到俩个可疑点。advertisementWallManager和F1这两个。
- advertisementWallManager.continue();
- ie4.on(getApplicationContext());
- F1();
复制代码
getApplicationContext活动获取到内容之后F1()紧接着就出来了
嫌疑很大啊,刚刚获取内容你就上来,这个方法名字还被混淆过。
去F1()调查一下来
- .method public final F1()V
- .registers 4
- .line 1
- new-instance v0, Lo03;
- .line 2
- .line 3
- invoke-direct {v0, p0}, Lo03;-><init>(Lcom/xtuone/android/friday/InitActivity;)V
- .line 4
- .line 5
- .line 6
- iput-object v0, p0, Lcom/xtuone/android/friday/InitActivity;->v0:Ljava/lang/Runnable;
- .line 7
- .line 8
- new-instance v0, Lp03;
- .line 9
- .line 10
- invoke-direct {v0, p0}, Lp03;-><init>(Lcom/xtuone/android/friday/InitActivity;)V
- .line 11
- .line 12
- .line 13
- iput-object v0, p0, Lcom/xtuone/android/friday/InitActivity;->w0:Ljava/lang/Runnable;
- .line 14
- .line 15
- iget-object v0, p0, Lcom/xtuone/android/friday/InitActivity;->v0:Ljava/lang/Runnable;
- .line 16
- .line 17
- const/16 v1, 0x1388
- .line 18
- .line 19
- int-to-long v1, v1
- .line 20
- invoke-static {v0, v1, v2}, Lrv7;->case(Ljava/lang/Runnable;J)Z
- .line 21
- .line 22
- .line 23
- return-void
- .end method
复制代码
分析一下这个F1方法干了些什么事情:
创建一个 Lo03 匿名类实例(传入 this),赋值给字段 v0
再创建一个 Lp03 实例,赋值给字段 w0
取出 v0, 赋值0x1388(也就是5000毫秒)5秒钟。
ε=(´ο`*)))唉有感觉没有,这里5秒钟不就是广告的播放时间吗。我们不继续深入他是如何实现延时效果的(应该是借助Lrv7的case中的方法)
我们的目的就是去除广告,那我们直接把这里的v0改为0x0不就不播放广告了。
噢耶,非常顺利直接就进来了,看来我们的思路没有问题。

以下属于拓展分析
但是作为强迫症患者,看这下拉刷新的广告也是烦的一批,继续去除。
我们用auto.js看一下这个顶部广告的属性id
好的我们去res找找
它的res里面的xml太乱了,直接xml搜索找到对应的xml进去看看
- <com.google.android.material.appbar.CollapsingToolbarLayout
- android:background="@7F0602ED"
- android:fitsSystemWindows="true"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:minHeight="52.0dip"
- app:contentScrim="@7F0602ED"
- app:layout_scrollFlags="0x00000003">
- <RelativeLayout
- android:id="@7F090568"
- android:background="@7F0602ED"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <TextView
- android:textSize="12.0dip"
- android:textColor="@7F0603DC"
- android:id="@7F09166E"
- android:background="@7F0801C3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="20.0dip"
- android:text="下拉刷新"
- android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true"
- android:alpha="0.0"/>
- </RelativeLayout>
复制代码 0x7F090568是它的idHex那我们就这块分析一下,它对应的RelativeLayout肯定不能留,直接给个android:visibility="gone"让他消失。它的父类也要改一下android:minHeight="0.0dip"。
ok我们去看看效果
可以,不会直接显示了,但是直接下拉还是会有模糊的广告图,有时还会变换
这里耗了挺久一直没有找到解决办法,也拷问了ai最后忘记是在哪里的dex改完之后就好了。
感兴趣的可以自己探究一下。
接下来到下一个点,当我们点击上面的任意一个课,它会立马跳转到一个“同班同学”的页面
被这个玩意霍霍过好几次,也给它操练一下
常规思路用auto.js找一下id
尝试一下直接直接在对应的xml改clickable=false看看结果
emmm不行还是会跳转属性也没有变化
看来有可能写在java层,去dex搜索一下id
R$id是定义常量不管,我们去另外两个瞅瞅,目前看来cardBinding有很大嫌疑
既然是让它的点击失效那就和setOnClickListener脱不了关系我们直接进去搜索一下看看
cardBinding没有搜到,cardView搜索到一个。
那正正好我们直接注释掉
测试一下--?>成功了,点击失效,不会跳转了。
接着继续,我们看到每个课旁边有个眼睛,首个有“同学抖音”+眼睛
尝试一下直接删除它res里面存储的对应图片
测试一下--?>闪退了(很有可能发生了空指针崩溃)
图片信息看来不能直接xml改布局,在这里找找线索。
这个图片信息是依附在单个课程信息上,不能直接找到图片的id但是我们可以抓这个课的id,间接找到它是在哪里调用的。
搜索查找ing.....
想想我们要干什么:让这个图片信息消失---那就和setVisibility,getView有关系
在搜索结果里面搜索一下这个方法,发现没有getView,setVisibility是占大多数的
这个图片是常显,那么一般都是直接定义了变量我们看看有没有?
可以可以,是有的,把这几个改为"gone"形式:const/16 v0,0x8
上软件看看
成功了TvT!不容易啊
这几个将他们物理超度之后,把一些日常没用的布局全部消失
这一部分就是比较常规就是auto.js抓id,xml改android:visibility="gone" invisible也可以
最后所有的都清了之后剩一个老顽固---联合会员中心
常规的抓取找不到id,资源搜索也找不到,dex里面也没有。
emmm很有可能是服务器传输或者是藏的更深一些
我们在用auto.js看看发现这四段文字都同属于一个id但是除了联合会员中心的横条没有id其他均有id
也就是说其他三个都布局在xml里面,而这个共同的id在java层,可能是它们共同的属性
还是依据上面的思路找setVisibility(推测可能是同一种方法),让它消失
测试一下--?>失败了,文字消失了,但是框没消失,点击依然会跳转。
这下是真没招了,又拷问了半个小时的ai,它给出的方案是
在上面找到的PersonalItemView里面的setContent
在它的开头段插入这个
- .method public final setContent(Ljava/lang/String;)V
- .registers 5
- # 判断 p1 是否等于 "联合会员中心"
- const-string v0, "\u8054\u5408\u4f1a\u5458\u4e2d\u5fc3"
- invoke-static {p1, v0}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
- move-result v1
- if-eqz v1, :cond_e
- # 是"联合会员中心" → 直接隐藏并结束
- const/16 v1, 0x8
- invoke-virtual {p0, v1}, Landroid/view/View;->setVisibility(I)V
- return-void
- :cond_e
- # 不是"联合会员中心" → 继续执行原本的 setContent 逻辑
- # 把你之前 setContent 剩下的原代码接在这里
复制代码 我去!!牛蛙,还是ai牛,结果图
好喽,我们的超级课程表净化之旅结束了,这一段我其实收获挺多,知道了很多的方法,去应对不同的反逆向,感谢各位观看。
新手小白有不对请大佬指出,也欢迎大家交流讨论
这里求各位大佬支持支持,跪谢了。
偷偷加了点料的超级课程表
谁家课表:https://share.weiyun.com/1AJZzSTS
密码:kw3qsr
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|