吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8070|回复: 51
收起左侧

[Android 原创] 某bobo在线视频APP下载暴力流逆向练习

  [复制链接]
yan019369 发表于 2020-12-1 21:33

最近朋友抱怨某软件的下载很慢,想在电脑上面直接下载观看。
众所周知此领域竞争激烈,所以安全意识普遍较高,分析起来较为困难,颇具挑战性。
目标以尽量以最快速度解决战斗,下面分享我的分析过程:

静态分析

不够暴力,略。

动态分析

网络协议是永恒的话题,数据流转的起点与终点,也是我们三板斧的开始。

在此简单总结下安卓网络框架现状:

okhttp:

大众框架,网上资料多,见过最多,例如本样本。
hook方案
可以选择插入HttpLoggingInterceptor,此方法网上很多,最早是珍惜的xposed模块,后来进化的frida模块,增强抗混淆xposed模块。
此方案反制方法太多,本人更喜欢直接hook

java.net.SocketInputStream.read([BII)I
java.net.SocketOutputStream.write([BII)V

缺点就是解析起来很麻烦。

cronet:

性能优于okhttp,网上资料不多,大厂很多都用,例如字节,某手。
hook方案:
框架操作多数在native,java层没有像okhttp那样请求响应的读写点,如果java层hook建议分别hook,涉及类

java.net.HttpURLConnection
org.json.JSONObject
java.io.InputStreamReader

HttpUrlConnection:

旧时代产物了,多老版本使用。
hook方案

com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream()
com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream()

这个还有可能其他实现类。

统统HOOK,打印结果
在这里插入图片描述

样本使用的是okhttp,但内容没有什么线索,数据都做过加密处理。
这时使用第二板斧,因为内存中会存在读写操作,猜测会存在一个下载列表,那就内存漫游起来
HOOK 几个关键类

java.io.InputStreamReader
java.nio.DirectByteBuffer
java.io.ByteArrayOutputStream
java.io.OutputStream

结果在java.io.InputStreamReader<init>(Ljava/io/InputStream;)V有意外惊喜:发现了m3u8文件!
m3u8

编写插件

拿到了m3u8文件就好办了,
文件里面有解密的key的存储位置,将他从手机中导出来。
下面就使用python编写脚本先下载m3u9文件里面的链接,再将其解密,最后再拼接起来就是一个完整的ts文件,具体代码如下

下载:
def download(ts_urls, download_path, num_tar, key_path):
    key = open(key_path, 'rb').read()
    for i in range(len(ts_urls)):
        ts_url = ts_urls[i]
        num_f = int(ts_url.split("/")[-1].split("-")[1])
        if num_f < num_tar:
            continue
        start = datetime.datetime.now().replace(microsecond=0)
        s = requests.session()
        try:
            response = s.get(ts_url, stream=True, verify=False)
            if response.status_code != 200:
                print("返回异常:" + str(response.status_code))
                return num_f
            ts_path = download_path + "/{0}.ts".format(i)
            ts_temp = download_path + "temp.ts"
            with open(ts_temp, "wb+") as file:
                for chunk in response.iter_content(chunk_size=1024):
                    if chunk:
                        file.write(chunk)
                    else:
                        print("下载失败")
            with open(ts_path, 'wb+') as fw:
                try:
                    fw.write(aes_decode(open(ts_temp, 'rb').read(), key))
                except:
                    print("error ts_temp = " + ts_temp)
            os.remove(ts_temp)
        except Exception as e:
            print("异常请求:%s,num = %d" % (e.args, num_f))
            return num_f
        end = datetime.datetime.now().replace(microsecond=0)
        print("耗时:%s" % (end - start))
    return -1
解密:
def aes_decode(data, key):
    cryptor = AES.new(key, AES.MODE_CBC, key)
    plain_text = cryptor.decrypt(data)
    return plain_text.rstrip(b'\0')
拼接:
def combine(ts_path, combine_path, file_name):
    boxer = get_sorted_ts(ts_path)
    file_list = []
    for ts in boxer:
        file_list.append(ts_path + "/" + str(ts) + '.ts')
    file_path = combine_path + file_name + '.ts'
    with open(file_path, 'wb+') as fw:
        for i in range(len(file_list)):
            try:
                fw.write(open(file_list[i], 'rb').read())
            except:
                print("error i = " + str(i))

结果,起飞

总结

出了一期比较无脑的逆向文章,希望给大家提供另一种思路。
如果后续有感兴趣的朋友我可以继续出一篇改机无限观看功能文章,共同学习。

免费评分

参与人数 14吾爱币 +12 热心值 +12 收起 理由
zhaozhikang521 + 1 + 1 我很赞同!
asdkiyuas + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
文姐姐 + 1 我很赞同!
落风X + 1 + 1 热心回复!
SmallYu + 1 + 1 我很赞同!
奋斗者4 + 1 + 1 谢谢@Thanks!
skypojie51 + 1 我很赞同!
wsbjw + 1 谢谢@Thanks!
fengbolee + 1 + 1 用心讨论,共获提升!
gdgv587 + 1 谢谢@Thanks!
dollm + 1 + 1 热心回复!
zhuzhuxia111 + 1 + 1 我很赞同!
longling + 1 + 1 用心讨论,共获提升!
明月照我还 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hulk_leon 发表于 2020-12-2 11:33
听得出bobo是一款男性同胞爱玩的app,只是大声分享的确实有点不太懂
xixicoco 发表于 2020-12-1 21:38
ruyisk 发表于 2020-12-1 21:54
heroesneverdie 发表于 2020-12-1 22:12
谢谢分享技术类型的帖子,受益匪浅
qihang5518 发表于 2020-12-1 22:34
代码教程帖子都要顶,虽然看的不太懂,但总看总看也能记点东西。
addqcx 发表于 2020-12-1 22:48
谢谢分享
longling 发表于 2020-12-1 23:33
谢谢你的分享
xuanmo 发表于 2020-12-1 23:47
哪个波波?滑稽
travishua 发表于 2020-12-2 04:07
给专家鼓掌 太牛了 哈哈
china08 发表于 2020-12-2 06:02
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 18:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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