本文仅限学习交流,请勿用于非法以及商业用途,转载请注明出处By Good good study/ 道义名
最近 XX 是越来越火了,做为一个在互联网一线的工作者,必须要追的上潮流,赶紧下载 XX 玩玩。有一天在家里做运动,想边运动边看看 XX ,打开 XX 发现 XX 播放完居然不能自动切换到下一个视频,必须要手滑~~百度一下,发现有很多网友对这个需求的呼声很高哈,不知道 XX 为啥不加上这个功能在设置里可切换呢?
最近在申请加入看雪的安全小组,版主说还需要一篇精华文章,才拉我进入。在这样的背景和自身的需求下遂花精力写下此文,
先看看实现效果,自动跳过广告,播放完自动跳到下一个视频(非完善版本,仅以学习的态度大致实现功能哈)
百度视频演示地址:https://pan.baidu.com/s/1XmA6VdpVMbG4yejnRMyelw
下面是分析过程:
老规矩,先apktool反编译一下
无壳,这就好办了,那就直接修改代码吧,先手动注入一个log工具类,用来打印关键信息
然后回编译,签名安装到手机上,卧槽,出现了这个界面
应该是有签名安全检测,,通过经验猜测对话框应该是从主Activity中弹出来的?
通过资源搜索定位大法验证了猜测是正确的,检测签名对话框的代码如下:
下面来看看推荐fragment 视频列表,来看看它是怎么实现的,先大概猜测一下,应该是通过recycleView来实现的?but,下一秒啪啪打脸,,
通过ddms工具分析发现是通过重写ViewPage来实现的 ,,呃呃呃~~~
知道是怎么实现的那就好办了。
首先我们要实现视频自动切换到下一个视频播放这个需求大致可分为二步 1、找到视频播放结束的回调函数 2、在视频播放结束的回调函数中调用ViewPage的setCurrentItem(postion+1)方法经过分析,,发现抖音没有实现这个接口,如果我们要实现只能自己写了,这个涉及的工作量
太大了,有时间再来实现吧~~~~~~~
当然我们可以根据在应用开发中的ViewPage知识点,简单的来实现这个功能
1、既然我们获取不到视频播放结束的回调,那我们就找到页面切换的onPageSelected 方法。
2、获取视频的时长,获取当前页数据集面,用一个List集合存储所有页面的数据集 通过抓包工具来分析一下数据源是怎么样的,,,打开fiddler 设置代理,,卧槽,,,居然不能抓包,,,
通过分析代码成功找到检测的代码,具体的代码就不贴了,怕被查水表,。
贴一下,实现检测代码吧,如下:
抓取的数据包如下图:
成功获取到视频的时长,是否广告等字段~
打开其中的播放链接,发现无水印,,,哈哈哈,原来网上的那些抖音去水印的软件,只是抓取了播放地址而已~
3、在当前页面开启一个视频时长的定时器 4、定时器结束调用ViewPage的setCurrentItem(postion+1)方法实现跳转到下一个页面至此实现了,破解了抖音抓包hook签名检测,自动播放下一条视频,获取无水印视频链接的功能。
下载地址:https://pan.baidu.com/s/1gLC9wPDr4lq5Aw2IswFBpg 提取码:jw8d 注入的代码
实现自动切换到下一条视频的smail代码如下:
.method public static nextPlay(ILcom/ss/android/ugc/aweme/feed/model/Aweme;Lcom/ss/android/ugc/aweme/common/widget/VerticalViewPager;)V
.locals 3
.param p0, "postion" # I
.param p1, "mAweme" # Lcom/ss/android/ugc/aweme/feed/model/Aweme;
.param p2, "mVerticalViewPager" # Lcom/ss/android/ugc/aweme/common/widget/VerticalViewPager;
.line 24
:try_start_0
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "\u64ad\u653e\u65f6\u957f===\u300b\u300b"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Lcom/ss/android/ugc/aweme/feed/model/Aweme;->getVideo()Lcom/ss/android/ugc/aweme/feed/model/Video;
move-result-object v1
invoke-virtual {v1}, Lcom/ss/android/ugc/aweme/feed/model/Video;->getVideoLength()I
move-result v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string v1, "\u662f\u5426\u662f\u5e7f\u544a===\u300b\u300b"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Lcom/ss/android/ugc/aweme/feed/model/Aweme;->isAd()Z
move-result v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
const-string v1, "\u5f53\u524d\u9875\u9762\u89d2\u6807==\u300b\u300b\u300b"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string v1, "==="
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-static {v0}, Lcom/lj/LjTools;->showlog(Ljava/lang/String;)V
.line 25
sget-object v0, Lcom/ss/android/ugc/aweme/feed/DyTools;->awemeList:Ljava/util/List;
invoke-interface {v0, p1}, Ljava/util/List;->add(Ljava/lang/Object;)Z
.line 26
sget-boolean v0, Lcom/ss/android/ugc/aweme/feed/DyTools;->ispostDelayed:Z
if-nez v0, :cond_0
.line 27
return-void
.line 30
:cond_0
sget-object v0, Lcom/ss/android/ugc/aweme/feed/DyTools;->awemeList:Ljava/util/List;
invoke-interface {v0, p0}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/ss/android/ugc/aweme/feed/model/Aweme;
invoke-virtual {v0}, Lcom/ss/android/ugc/aweme/feed/model/Aweme;->isAd()Z
move-result v0
if-eqz v0, :cond_1
.line 31
const-string v0, "\u5e7f\u544a\u89c6\u9891===\u300b"
invoke-static {v0}, Lcom/lj/LjTools;->showlog(Ljava/lang/String;)V
.line 32
add-int/lit8 v0, p0, 0x1
invoke-virtual {p2, v0}, Lcom/ss/android/ugc/aweme/common/widget/VerticalViewPager;->setCurrentItem(I)V
.line 33
return-void
.line 35
:cond_1
const/4 v0, 0x0
sput-boolean v0, Lcom/ss/android/ugc/aweme/feed/DyTools;->ispostDelayed:Z
.line 36
new-instance v0, Lcom/ss/android/ugc/aweme/feed/DyTools$1;
invoke-direct {v0, p2, p0}, Lcom/ss/android/ugc/aweme/feed/DyTools$1;-><init>(Lcom/ss/android/ugc/aweme/common/widget/VerticalViewPager;I)V
sget-object v1, Lcom/ss/android/ugc/aweme/feed/DyTools;->awemeList:Ljava/util/List;
.line 43
invoke-interface {v1, p0}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/ss/android/ugc/aweme/feed/model/Aweme;
invoke-virtual {v1}, Lcom/ss/android/ugc/aweme/feed/model/Aweme;->getVideo()Lcom/ss/android/ugc/aweme/feed/model/Video;
move-result-object v1
invoke-virtual {v1}, Lcom/ss/android/ugc/aweme/feed/model/Video;->getVideoLength()I
move-result v1
int-to-long v1, v1
.line 36
invoke-virtual {p2, v0, v1, v2}, Lcom/ss/android/ugc/aweme/common/widget/VerticalViewPager;->postDelayed(Ljava/lang/Runnable;J)Z
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0
.line 48
goto :goto_0
.line 45
:catch_0
move-exception v0
.line 46
.local v0, "e":Ljava/lang/Exception;
invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V
.line 47
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "\u5f02\u5e38\u4e86---\u300b\u300b"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/Exception;->toString()Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v1}, Lcom/lj/LjTools;->showlog(Ljava/lang/String;)V
.line 49
.end local v0 # "e":Ljava/lang/Exception;
:goto_0
return-void
.end method
如果打包后运行程序出现这样的错误: java.lang.VerifyError: Rejecting class,说明你修改的smail代码不合法哈,请重新改写注入的smail代码就可以了
道可道非常道,名可名非常名,By Good good study 道义名~~~~~
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2019-2-2 16:33
被kanxue编辑
,原因:
上传的附件: