首页
社区
课程
招聘
[原创]攻破国内某大型app抓包hook签名检测,居然只是想替它实现懒人自动下一条视频播放?
发表于: 2018-11-27 10:53 18930

[原创]攻破国内某大型app抓包hook签名检测,居然只是想替它实现懒人自动下一条视频播放?

2018-11-27 10:53
18930

本文仅限学习交流,请勿用于非法以及商业用途,转载请注明出处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编辑 ,原因:
上传的附件:
收藏
免费 6
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  junkboy   +2.00 2018/11/27
最新回复 (28)
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持一下
2018-11-27 12:44
0
雪    币: 615
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
junkboy 支持一下
谢谢你的支持哈
2018-11-27 14:47
0
雪    币: 21449
活跃值: (62288)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
4
 熟悉的 道可道非常道,名可名非常名
2018-11-27 14:54
0
雪    币: 1553
活跃值: (482)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
2018-11-27 15:07
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
6
233
最后于 2018-11-27 21:40 被sudami编辑 ,原因:
2018-11-27 15:35
1
雪    币: 1392
活跃值: (4872)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
7
sudami 免ROOT抖音插件&nbsp;[em_13]
大米牛逼啊。
2018-11-27 15:47
1
雪    币: 573
活跃值: (979)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
sudami 免ROOT抖音插件&nbsp;[em_13]
着实很强。
2018-11-27 17:02
1
雪    币: 7121
活跃值: (125793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
卧槽
楼主你也太流弊了 膜拜膜拜
2018-11-27 17:06
1
雪    币: 1553
活跃值: (482)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
拿最新的抖音包看了下,检测代理函数貌似没用,直接代理抓包OK
2018-11-27 17:09
1
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主这个是很老的版本了吧,我前段时间搞了下3.3版本,弹框和你这个不一样啊,搞了很久都没搞出来,不知道有没有大佬搞出来了的。
2018-11-27 17:20
1
雪    币: 21449
活跃值: (62288)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
12
厉害
2018-11-27 18:20
0
雪    币: 2673
活跃值: (2947)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
刚看了一下。。3.1版本 
StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("播放时长===》》");
            stringBuilder.append(mAweme.getVideo().getVideoLength())
2018-11-27 19:02
1
雪    币: 2673
活跃值: (2947)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
sudami 免ROOT抖音插件&nbsp;[em_13]
ui弹不出来
2018-11-27 20:09
0
雪    币: 615
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
Zkeleven 楼主这个是很老的版本了吧,我前段时间搞了下3.3版本,弹框和你这个不一样啊,搞了很久都没搞出来,不知道有没有大佬搞出来了的。
最新版也一样的调试方法,我故意选了老版本,怕被查水表#
2018-11-27 20:16
1
雪    币: 615
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
sudami 免ROOT抖音插件&nbsp;[em_13]
这个和VirtualXposed差不多吧
2018-11-27 20:19
1
雪    币: 14471
活跃值: (5718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
"无壳,这就好办了",看到这句,lz想加入安全小组凉了
2018-11-28 08:52
2
雪    币: 2095
活跃值: (344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
道可道非常道,名可名非常名  都快成标签了
2018-11-28 12:35
1
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
应该不是之前,但是强呀 继续支持
2018-11-28 15:44
1
雪    币: 512
活跃值: (3465)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
大神,我在家里电视上安装了抖音app,但是不能滑动,请问怎么破?
2018-11-29 13:23
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
SMALI基础 好,抓包分析,这文章很综合,下次搞个SO破解的学习呗
2018-11-29 19:16
1
雪    币: 2679
活跃值: (1576)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
666
2018-11-30 16:26
1
雪    币: 5
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
抖音通过apktool重打包会出现异常,怎弄?
2018-12-9 12:11
0
雪    币: 2112
活跃值: (9966)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
牛逼牛逼,还是没说怎么抓包啊,还有那个smali具体功能也没有说,看不懂。。。。。闹心
2018-12-25 15:30
1
游客
登录 | 注册 方可回帖
返回
//