返回列表 发新帖

超级课程表去广告净化分析

[复制链接]

2

主题

28

回帖

132

积分

小学生

Rank: 2

金币
46
好评
0
信誉
100

考神

发表于 2026-4-28 23:56:05 | 显示全部楼层 | 阅读模式  来自 湖北
本帖最后由 xiaomengbi 于 2026-4-29 00:01 编辑

因为每次打开超级课程表长达五秒的广告+神一般的自动跳转,让我这个每天赖床不想去早八。好不容易哄好自己上早八,紧赶慢赶的到教学楼下正要打开课程表看是哪个教室,结果一下子跳转到别的界面的大学生感受到异常的崩溃(因为本人手机巨拉胯,反应堪比老年机)
所以痛定思痛我决定好好修理修理这个超级课程表,让它好好听话。

一通分析下来,是个自定义的壳,常规步骤:换入口,添dex,去签。
接下来就是去广告的分析

我们打开Activity记录看一下超级课程表的跳转流程,忽略掉第一次打开的login和custom
打开软件-->InitActivity-->MainFragment(主要功能实现)
广告是出现在InitActivity中的那应该就是和这个类中的onCreate脱不了干系。
好的,有了大致的思路我们去mt管理器瞅瞅
到达onCreate之后转成java。
wow!这么多,看来要消耗掉我一节水课了。
  1. public void onCreate(Bundle bundle) {
  2.         String str = "wxb81788a085843d31";
  3.         LaunchManager.onTracePage(this, "page_onCreate", true);
  4.         E1();
  5.         super.onCreate(bundle);
  6.         StringBuilder stringBuilder;
  7.         if ((getIntent().getFlags() & 4194304) != 0) {
  8.             String stringExtra = getIntent().getStringExtra("shortcut_activity");
  9.             stringBuilder = new StringBuilder();
  10.             stringBuilder.append("shortcutActivity = ");
  11.             stringBuilder.append(stringExtra);
  12.             u40.on(stringBuilder.toString());
  13.             if (TextUtils.isEmpty(stringExtra) || s30.on().package() || FridayApplication.getApp().getForegroundActivity() == null) {
  14.                 finish();
  15.             } else {
  16.                 G1(FridayApplication.getApp().getForegroundActivity(), stringExtra);
  17.             }
  18.             return;
  19.         }
  20.         String str2;
  21.         j07.catch(getWindow(), 0);
  22.         j07.break(getWindow(), true);
  23.         f23.ok(getIntent());
  24.         if (!s30.on().package()) {
  25.             try {
  26.                 yd2.import();
  27.                 if (TextUtils.isEmpty(StringRequest.userAgent)) {
  28.                     StringRequest.userAgent = WebSettings.getDefaultUserAgent(this);
  29.                 }
  30.                 WXAPIFactory.createWXAPI(this, str).registerApp(str);
  31.             } catch (Exception e) {
  32.                 u40.class(e);
  33.             }
  34.         }
  35.         z1();
  36.         EventBus.getDefault().register(this);
  37.         AdvertisementWallManager advertisementWallManager = AdvertisementWallManager.if();
  38.         String str3 = "scene";
  39.         if (MainFragmentActivity.isApplicationShow()) {
  40.             str2 = "hot";
  41.         } else {
  42.             advertisementWallManager.finally(AppearExpectMode.OnFirstGoToMainActivity);
  43.             str2 = "cold";
  44.             new h14().no("app_launch").on(str3, str2).oh();
  45.         }
  46.         this.x0 = b.native(this);
  47.         if (!TextUtils.isEmpty(getIntent().getStringExtra("f"))) {
  48.             getIntent().putExtra("notification_schema", "xtuonefriday://paper/paper");
  49.         }
  50.         new h14().no("splash_ad_scene").on(str3, str2).oh();
  51.         advertisementWallManager.continue();
  52.         ie4.on(getApplicationContext());
  53.         F1();
  54.         if (!H0) {
  55.             j04.ok.on(this, s30.on().package() ^ 1);
  56.             H0 = true;
  57.         }
  58.         Log.e("cola:InitActivity:", "onCreate");
  59.         if (!(s30.on().package() || d.d())) {
  60.             e90 n = e90.n();
  61.             stringBuilder = new StringBuilder();
  62.             stringBuilder.append(e90.n().b0().getStudentId());
  63.             stringBuilder.append("");
  64.             List w = n.w(stringBuilder.toString());
  65.             if (w != null && w.size() > 0) {
  66.                 H1(q1(u33.case(w)));
  67.             }
  68.         }
  69.     }
复制代码
emmm找到俩个可疑点。advertisementWallManager和F1这两个。
  1. advertisementWallManager.continue();
  2. ie4.on(getApplicationContext());
  3. F1();
复制代码

getApplicationContext活动获取到内容之后F1()紧接着就出来了
嫌疑很大啊,刚刚获取内容你就上来,这个方法名字还被混淆过。
去F1()调查一下来

  1. .method public final F1()V
  2.     .registers 4

  3.     .line 1
  4.     new-instance v0, Lo03;

  5.     .line 2
  6.     .line 3
  7.     invoke-direct {v0, p0}, Lo03;-><init>(Lcom/xtuone/android/friday/InitActivity;)V

  8.     .line 4
  9.     .line 5
  10.     .line 6
  11.     iput-object v0, p0, Lcom/xtuone/android/friday/InitActivity;->v0:Ljava/lang/Runnable;

  12.     .line 7
  13.     .line 8
  14.     new-instance v0, Lp03;

  15.     .line 9
  16.     .line 10
  17.     invoke-direct {v0, p0}, Lp03;-><init>(Lcom/xtuone/android/friday/InitActivity;)V

  18.     .line 11
  19.     .line 12
  20.     .line 13
  21.     iput-object v0, p0, Lcom/xtuone/android/friday/InitActivity;->w0:Ljava/lang/Runnable;

  22.     .line 14
  23.     .line 15
  24.     iget-object v0, p0, Lcom/xtuone/android/friday/InitActivity;->v0:Ljava/lang/Runnable;

  25.     .line 16
  26.     .line 17
  27.     const/16 v1, 0x1388

  28.     .line 18
  29.     .line 19
  30.     int-to-long v1, v1

  31.     .line 20
  32.     invoke-static {v0, v1, v2}, Lrv7;->case(Ljava/lang/Runnable;J)Z

  33.     .line 21
  34.     .line 22
  35.     .line 23
  36.     return-void
  37. .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进去看看

  1.                 <com.google.android.material.appbar.CollapsingToolbarLayout
  2.                     android:background="@7F0602ED"
  3.                     android:fitsSystemWindows="true"
  4.                     android:layout_width="match_parent"
  5.                     android:layout_height="match_parent"
  6.                     android:minHeight="52.0dip"
  7.                     app:contentScrim="@7F0602ED"
  8.                     app:layout_scrollFlags="0x00000003">
  9.                     <RelativeLayout
  10.                         android:id="@7F090568"
  11.                         android:background="@7F0602ED"
  12.                         android:layout_width="match_parent"
  13.                         android:layout_height="wrap_content">
  14.                         <TextView
  15.                             android:textSize="12.0dip"
  16.                             android:textColor="@7F0603DC"
  17.                             android:id="@7F09166E"
  18.                             android:background="@7F0801C3"
  19.                             android:layout_width="wrap_content"
  20.                             android:layout_height="wrap_content"
  21.                             android:layout_marginBottom="20.0dip"
  22.                             android:text="下拉刷新"
  23.                             android:layout_alignParentBottom="true"
  24.                             android:layout_centerHorizontal="true"
  25.                             android:alpha="0.0"/>
  26.                     </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
在它的开头段插入这个
  1. .method public final setContent(Ljava/lang/String;)V
  2.     .registers 5

  3.     # 判断 p1 是否等于 "联合会员中心"
  4.     const-string v0, "\u8054\u5408\u4f1a\u5458\u4e2d\u5fc3"

  5.     invoke-static {p1, v0}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
  6.     move-result v1

  7.     if-eqz v1, :cond_e

  8.     # 是"联合会员中心" → 直接隐藏并结束
  9.     const/16 v1, 0x8
  10.     invoke-virtual {p0, v1}, Landroid/view/View;->setVisibility(I)V
  11.     return-void

  12.     :cond_e
  13.     # 不是"联合会员中心" → 继续执行原本的 setContent 逻辑
  14.     # 把你之前 setContent 剩下的原代码接在这里
复制代码
我去!!牛蛙,还是ai牛,结果图

好喽,我们的超级课程表净化之旅结束了,这一段我其实收获挺多,知道了很多的方法,去应对不同的反逆向,感谢各位观看。
新手小白有不对请大佬指出,也欢迎大家交流讨论
这里求各位大佬支持支持,跪谢了。

偷偷加了点料的超级课程表
谁家课表:https://share.weiyun.com/1AJZzSTS
密码:kw3qsr



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

118

主题

2441

回帖

6641

积分

硕士生

Rank: 6Rank: 6

金币
316
好评
53
信誉
25

MT论坛最佳新人MT论坛新人考神MT论坛帅哥

发表于 2026-4-29 00:02:16 来自手机  | 显示全部楼层  来自 河南
下次直接求助我,我帮你秒杀
回复

使用道具 举报

4

主题

1272

回帖

3682

积分

大学生

Rank: 5Rank: 5

金币
1616
好评
0
信誉
100
发表于 2026-4-29 00:17:17 来自手机  | 显示全部楼层  来自 广西
教程很有用
回复

使用道具 举报

2

主题

28

回帖

132

积分

小学生

Rank: 2

金币
46
好评
0
信誉
100

考神

发表于 2026-4-29 00:22:12 来自手机  | 显示全部楼层  来自 湖北
帅比宝宝 发表于 2026-4-29 00:02
下次直接求助我,我帮你秒杀

我去o( ̄ヘ ̄o#)!大佬有神器,究竟是什么方法
回复

使用道具 举报

2

主题

4507

回帖

1万

积分

禁止访问

iKUN

金币
1214
好评
16
信誉
111
发表于 2026-4-29 00:24:32 来自手机  | 显示全部楼层  来自 广西
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

118

主题

2441

回帖

6641

积分

硕士生

Rank: 6Rank: 6

金币
316
好评
53
信誉
25

MT论坛最佳新人MT论坛新人考神MT论坛帅哥

发表于 2026-4-29 00:30:10 来自手机  | 显示全部楼层  来自 河南
xiaomengbi 发表于 2026-4-29 00:22
我去o( ̄ヘ ̄o#)!大佬有神器,究竟是什么方法

正则秒杀
回复

使用道具 举报

4

主题

1197

回帖

2819

积分

大学生

Rank: 5Rank: 5

金币
1968
好评
0
信誉
100

MT论坛帅哥考神

发表于 2026-4-29 07:14:05 来自手机  | 显示全部楼层  来自 海南
感谢分享
回复

使用道具 举报

0

主题

6415

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
835
好评
1
信誉
107
发表于 2026-4-29 15:27:03 来自手机  | 显示全部楼层  来自 广东
学习学习
回复

使用道具 举报

1

主题

1万

回帖

3万

积分

博士后

Rank: 8Rank: 8

金币
9013
好评
4
信誉
1303

考神MT论坛帅哥MT论坛新人

发表于 2026-5-15 13:03:39 来自手机  | 显示全部楼层  来自 广西
看看
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表