某水果网站逆向分析揭秘

首先,打开F12进行网络抓包,随意选择一个url进行查看,发现两处加密点,第一处位于请求头的D参数,第二处位于响应数据,如下图所示:

某水果网站逆向分析

加密本身看似无特别之处,直接下断点,选择第一个发起的程序进行断点设置。

b.send,猜测b为xhr对象,send为发送请求。此时可使用HOOK来断住xhr,当然也可跟随调用栈进行分析,两种方法效果相同。这里进行hook断点<技巧>(1)。

( function () {

var open = window .XMLHttpRequest. prototype .open;

window .XMLHttpRequest. prototype .open = function ( method, url,

async ) {

debugger ;

return open. apply ( this , arguments );

};

})();

将上述代码输入到控制台中,继续请求,发现断点停在了xhr新建的地方,但此时请求参数和请求头的加密参数早已生成。只能依靠调用栈进行分析。

逐步代码分析并非最佳方法,但却是最有效的方法。在Debug过程中,不能仅盯着需要找的点进行Debug,否则会被框架的来回调用导致失去耐心。例如这个Flutter框架,类似webpack模式,它会进行许多懒加载和代理调用,因此在Debug时会发现无论什么方法都好像会进入同一个方法,然后找不到真正的源头(因为源头总是Flutter的源码)。因此,不能依赖调用栈,要时不时终止断点来正向单步调试<技巧点>(2)。

回到这个网站本身,在寻找这个请求头中的D参数到底是从哪里来时,我们在栈中发现。在调用aEy方法时,参数al已经有值,那么就有看调用aEy的是谁,但我们发现,无法继续向下跟栈,无论如何跟栈都是回到了Flutter的调用中,无法找到真正调用了aEy的源头(我猜测Flutter发送xhr是只需要告诉Flutter要发送什么,而不需要自己调用xhr。Flutter会自己处理后会异步发送请求)。

至此,已经无法依靠调用栈来获得解密方式,尝试直接搜索url,找到和发送有关的代码,在这里打断点然后一步一步向下调试。

通过一步步进行调用查看功能发现:

  1. bnX()为加密方法,内部又调用了a3N。

直接给出加密代码:

这里是AES加密方式,总的来说是先将请求的json进行一次md5加密后得到s,再把s放入json中进行一次AES加密,就可以得到密文。至此,其实已经可以构造本网站的所有请求。

此时,我们可以构造本网站的所有请求。那么,我们随意点开一个视频进行播放,发现他会进行一次playNew的请求获取到m3u8的地址,随后我们打开这个m3u8文件以及请求头查看一下。

我们可以发现,他没有带任何鉴权。而且m3u8文件虽然不是完整视频文件,但我们是否可以构造后续ts文件链接来补全视频文件。经过实验,确实可以。具体流程就是获取到视频完整时长,然后构造后续ts链接,将新的m3u8文件进行播放或下载,发现可行!

逆向需要一定的运气和耐心。本次逆向可以算得上是失败,虽然最后成功找到了加密点并破解,但基本上是靠单步调试来实现的。Flutter框架本身的xhr请求完全无法定位到本身的加密点,只能透过一点点线索来找到真正的代码逻辑。

本次逆向的重点转折点是直接搜索请求链接,然后顺着请求连接正向Debug找到了加密点,在此过程中需要时刻注意加密是否完成,如果加密完成则倒回去一步一步寻找是哪个函数进行加密。

同时,也要善用工具库来进行密文比对,这样可以不用看具体实现,在console中直接运行代码后进行比对,如果比对成功则直接使用即可。

发表评论

评论列表

还没有评论,快来说点什么吧~