攻破国内某大型APP抓包hook签名检测,居然只是想替它实现懒人自动下一条视频播放?
本帖最后由 GoodGoodStudy 于 2018-11-28 10:12 编辑本文仅限学习交流,请勿用于非法以及商业用途,转载请注明出处By Good good study/ 道义名
最近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 道义名~~~~~ 马克 发表于 2018-11-27 14:00
楼主你的附件是不是有问题,我安装后1不能自动播放,2下载的视频有水印。
无水印的视频是以log的形式打印的,过滤ljtoo,并没有修改保存那个地方代码 软件还有很多小问题,望改善。
1、有时不能自动下一条。
2、有时会倒着放,也就是回到上一条,不是往下一条走。
总体还是不错的,可靠性有待加强。 楼主,建议重新编辑一下,排版比较乱,而且图片全挂了。。 代码的背景色亮眼 {:1_907:} chatter 发表于 2018-11-27 11:04
楼主,建议重新编辑一下,排版比较乱,而且图片全挂了。。 代码的背景色亮眼
哈哈,已经重新上传了图片,,,,,,{:1_907:}{:1_907:}{:1_907:}{:1_907:} 不错不错,学习了.话说抖音是没有加壳的吗? 膜拜大佬 果然是大佬!!!感谢分享! 学习学习了。 谢谢楼主! 楼主好厉害!