在大学中选修过网络课的部分网友们想必对这个软件不会陌生。
这个软件呢主要就是用于播放网络课的视频,不过有个特点就是你必须按照课程顺序一个一个看,视频进度条不能超前拉,比如视频有60分钟,你只看了10分钟,那你最多能把进度条拉到10分钟的地方,不能拉到11分钟的地方,而为了完成网络课,我们必须把每个视频都完整播放完。
软件这么设计的出发点虽好,但是有些课我们并不感兴趣,只是因为学校规定而去选修,这样反而是在浪费大家的时间。
因为要破解进度条的限制,所以我们先来看一下播放界面:
通过MT管理器的Activity记录功能可以得到播放器界面的类名是com.chaoxing.fanya.aphone.ui.video.VideoPlayerActicity,我们进入该软件的apk文件:
一共有4个dex文件,最终我在classes2.dex中找到VideoPlayerActicity类,我打算先找下它的布局文件,布局文件的id一般是在onCreate方法中调用setContentView时对应的参数。
打开VideoPlayerActicity并转成Java代码,搜索下onCreate,然后在onCreate方法中没有找到setContentView。
然后我看了下VideoPlayerActicity的父类是Lcom/chaoxing/video/player/d;,这个类是在classes3.dex中,同样转成Java代码然后搜下onCreate,最终我找到了setContentView(layout.ssvideo_player),居然不是十六进制id而且layout字段名称也没混淆,那就好办了。
直接回到apk中,进入res/layout,找到ssvideo_player.xml文件并反编译,通过分析可以发现在xml中定义了两个SeekBar,一个id是video_sb_process_play,另一个是video_sb_volume,process意思是过程,volume意思是音量,所以video_sb_process_play就是播放器界面中进度拖动条的id。
回到Lcom/chaoxing/video/player/d;的Java代码中,搜下video_sb_process_play,可以找到:
this.h = (SeekBar)this.findViewById(id.video_sb_process_play);
也就是说this.h就是播放器界面中的进度拖动条,继续搜下this.h,可以找到一句关键代码:
this.h.setOnSeekBarChangeListener(new d(this));
这是jadx的反编译结果,这边的d应该不是Lcom/chaoxing/video/player/d;,反编译显示有点问题
没关系我们去看smali代码,搜下setOnSeekBarChangeListener,可以看到:
new-instance v2, Lcom/chaoxing/video/player/d$d;
invoke-direct {v2, p0}, Lcom/chaoxing/video/player/d$d;->
invoke-virtual {v1, v2}, Landroid/widget/SeekBar;->setOnSeekBarChangeListener(Landroid/widget/SeekBar$OnSeekBarChangeListener;)V
上面的代码写成这样比较容易看懂
v2 = new com.chaoxing.video.player.d$d(p0)
v1.setOnSeekBarChangeListener(v2)
明显Lcom/chaoxing/video/player/d$d;就是我在开头提到的监听器了,选中文本Lcom/chaoxing/video/player/d$d;然后在弹出的菜单中点击跳转进入这个类的smali代码,点击菜单转成Java。
代码中this.a.Q就是允许被拖动的最大时间点了,具体代码逻辑我就不分析了自己看,我标红的代码就是我们需要去掉的代码,Java代码是不能直接改的,我们要去改smali代码。
最终一共要删去3处代码,看图:
修改完保存,可以重新反编译成Java看看修改效果,最后重新编译成classes3.dex打包回去就OK了。
最后强调一下,即使改了客户端,你数据异常服务器会检测出来的,所以请勿贪心,不要一次刷太多课。
转载网络,实用性很高。