目标接口:YXBpL2dpbmRleC90Zi9xdWVyeV90Zl9nb29kc19pbmZv
直接上xhr断点,满眼可见的异步+10086
这种站异步前的堆栈其实可以直接跳过了,加密必然是在异步中生成的。往下点几个栈可以看到:
这里在拼接url,并且anti_content还没生成,或者说还没拼接上。
堆栈并不多,可以从这里开始单步调试
才两步,结果就出来了。这里也只有一个Object(x.a)(); 并且其是一个异步
直接跳进去即可。
这里先带大家验证一下结果。本地替换js文件,修改打印一下。如下:
说明anticontent确实是这里返回的
咱继续
细致一点,可以在for循环内switch打断点跳过来
循环内逻辑也不复杂,几行代码几个异步。到case 5结果就已经有了
往前是3,也只有一个异步函数r.messagePackSync()。还直接透返回值了
进去r.messagePackSync。继续单步,看到异步要进。如图
控制台执行e dt函数都可以拿到结果
这里注意一下,js代码是动态变化的,所以你看到的函数名跟我的不一定一样,我昨天做这个的时候加密函数还是ue,写文章的时候就变成了dt。
浅浅看一眼,又看了一下返回值,发现anti-content是返回值处拼接起来的。而且dt并没有传入任何跟接口参数相关的东西,局部变量也没有。dt每次主动调用的结果都还是变化的。当时就猜测,可能anti-content的值主要是跟随机值时间戳这些有关系。那就只需要导出dt调用就可以。
把整个文件复制出来看了一眼,是webpack打包的。那就找加载器主动调用
dt就在fbez里面(不清楚这个是不是动态变化的)
那么如何找加载器?在上图).call(this, n(“8oxB”), n(“YuTi”)(e))直接打断点其实就可以,“8oxB”"YuTi"明显就是跟fbeZ一样的函数,断住后点n进去就可以看到加载器。我是搜"fbeZ"调用位置找的,因为想看看有没有什么关联函数需要执行。
找到加载器后把整个自执行导出。
l就是加载器,r是我们需要用到的函数。代码逻辑就不解释了,不是本文重点
接下来把加载器导出:window.lll = l
然后在外部调用:window.lll(‘fbeZ’)
看看上面打印了哪些函数,就抠出哪些。这个站比较简单就用到三个函数。有些站可能要执行几十几百个,那种情况就建议写个自吐了哈,不然要抠到吐。网上也能搜到
再把dt(我代码里是ue,前面说过了再提醒一次)函数导出调用。补上所需环境就能出结果了
提醒两点:1、拼夕夕的检测还是不少的,补环境花的时间比较多。anti-content的长度是400+,补出来太短是拿不到结果的;2、即便补出来长度对了,也是拿不到结果的,因为还要传时间戳
简单讲一下如何发现的,搜"fbeZ"的调用位置打断点,有两个位置。断住后可以看到s = n(“fbeZ”)
往上一个堆栈new了一个s,这个s其实就是n(“fbeZ”),并且传了一个时间戳。得按照人家的来。最终架构:
请求也成功: