moumoutoutiao _signature 逆向分析

My courage always rises with every attempt to intimidate me. ——《傲慢与偏见》

凡试图打败我的,皆让我勇气倍增。

PS: 本文仅供学习参考、仅供学习参考、仅供学习参考,不得用于商业用途。

请求分析

本次目标站点

aHR0cHM6Ly93d3cudG91dGlhby5jb20vP3dpZD0xNjUxMjA5OTE1Mjk5

  经过分析,该请求共有两个参数是一直变化的 max_behot_time 和 _signature,max_behot_time 没有加密,初始值为 0,本次请求响应中就存在下次请求需要的 max_behot_time,所以接下来的内容主要是分析 _signature 参数的的生成。

JS 分析

  没有什么是全局搜索大法搞不定的,如果有,那就放弃吧!!!只有在一个文件中包含 _signature,我觉得我又行了,打上断点,成功断上。

window.byted_acrawler.sign

  可以看到我们需要重点关注的就是 S 函数,跟进去看看是个什么东东。这个 i 应该就是我们需要的,i 上面的三个判断可直接忽略。

  把 i 的生成转换成容易看得懂的,在控制台看看效果

1
i = window.byted_acrawler.sign.call(n,o)

  进入到 window.byted_acrawler.sign 内部,跳转到了 acrawler.js 中,整个文件就六百来行,全扣下来,在本地试一下能不能运行。

补环境

  看样子是不行,那就缺啥补啥呗!

referrer

  我们需要先看下 referrer 的值什么,在控制台找到报错的位置,在合适的位置打上断点,然后右键 修改断点… 这样就打上了一个条件断点。


  刷新浏览器,等成功断上之后,在控制台看看结果

window

  ReferenceError: window is not defined,那就补个 window

sign

  TypeError: Cannot read property ‘sign’ of undefined,出现了这个错误,在本地代码打个断点,观察一下。

  在本地变量发现了可疑参数 exports 与 module,搜索一下 exports,还好就只有两个,而且 module 就在旁边。

  在浏览器环境看一下这两个东东是什么,合适的位置打上断点,然后在控制台执行一下这两句。

  可以看到在浏览器环境下 exports 与 module 都是 undefined,既然这样,在本地代码直接将这两句改为 undefined 即可。

href

  TypeError: Cannot read property ‘href’ of undefined

  浏览器下在合适的位置打上一个条件断点,然后在控制台观察 href 的值。

  在本地补上 href

length

  TypeError: Cannot read property ‘length’ of undefined,报错的地方还是与 href 报错的地方相同,那就再打上一个条件断点,然后在控制台观察看看


  这个显然不是我们需要的,既然报错的地方还是与 href 报错的地方一致,那就还让条件等于 href,看看是不是在 location 仅仅补一个 href 还不够。重复在 href 打条件断点的步骤,观察 location 中的值。

  可以看到 location 中不仅仅包含 href,接下来让我们挨个试试。经测试只需在 location 中再补充一个 protocol 即可,当然也可以全补进去。

userAgent

  TypeError: Cannot read property ‘userAgent’ of undefined

  在报错的位置打上一个条件断点,刷新浏览器,在控制台观察变量

  在 navigator 补充 userAgent

  这应该是成了吧?!!!试一下,能用,就是短了点。

  网上搜了下相关的资料,说是可以补个 cookie 就可以变长了,而且还得补的靠下面些,那咱就来试试。

写在最后

  至此,本文结束,用代码将上面的逻辑复现即可。这个站点在去年就已经搞出来了,因为种种原因搁置到现在,不过再捋一遍将逻辑整理出来,也是一种收获。本文的难点主要是在补环境上,很多人可能补着补着就放弃了,我刚开始也是这样,需要沉下心来,一步步的,实在想不通可以去网上查查资料,看看有没有大佬或者前辈做过类似的。