mouhongshu Web 端 x-s 逆向分析

The most ordinary person can change the world. ——《神秘博士》

平凡之人亦能改变世界。

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

请求分析

本次目标站点

aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tL2V4cGxvcmU=

  可以明显看到有三个参数:分别是 x-b3-traceid(未知)、x-s(未知)、x-t(明显是时间戳)。将链接以 cURL 格式复制出来,经过测试只需要将 x-s 搞定就行了。

JS 分析

  全局搜索大法,搜索关键词 x-s,可以看到 sign 方法就是我们需要的。挨个看一下需要的参数,主要的两个参数是 t(请求路径)、i(请求参数)

  进入 sign 方法内部,在开头打个条件断点,取消掉其他断点,刷新页面,成功断上

  将 sign 方法完整扣下来,简单观察下发现了控制流平坦化,加密生成的地方在 case “9”:

  还缺几个方法分别是 a0_0x4dee00、a0_0x5c27、a0_0x543e,扣下来放在合适的位置。运行代码时出现错误

  分别在 WebStrom 和浏览器,在报错代码位置打上断点

WebStrom

浏览器

  可以看到参数 s 和 u 的值是一致的,但经过 cr 计算的方法是不一致的。继续跟下去,进入 cr 内部

WebStrom

浏览器

  在 cr 中 e、t、sr 三个参数的值是一致的,继续跟下去,进入到 a0_0x4dee00 内部

WebStrom

浏览器

  参数 e、t 的值是一致的,继续跟下去,进入到 a0_0x5c27 内部

WebStrom

浏览器

  参数 e、t 的值仍然是一致的,到了这里就要返回结果了,还差一个 r,可以看到 r 是由 a0_0x543e 得来的,这个方法已经补过了,我们还是分别看一下 a0_0x543e 在 WebStrom 和浏览器中的值

WebStrom

浏览器

  可以看到,就是这个大数组不一致,我们直接把 WebStrom 中的改为浏览器中的值(经多次测试,这个就是定值),在浏览器控制台可以使用 copy 方法复制下来。重新 debugger,发现结果已经和浏览器一致了

  执行代码,出现新的错误:ReferenceError:__webpack_require__ is not defined。

  浏览器中进行定位在合适的位置打上断点,在控制台执行 __webpack_require__,发现是方法,点击进入。

  一共两百来行,是一个自执行函数,第一个方法是 webpack 的加载器,将整个文件扣下来,放在 WebStrom 文件顶部

  执行代码,出现错误:ReferenceError: self is not defined,将 self 修改为 window,并在文件顶部新增一行 window = global;

  继续执行代码,出现错误:ReferenceError: esm_typeof is not defined,经常搞 js 逆向的小伙伴应该可以看出来,这一块代码是用来监测环境的

  在浏览器中执行查看结果,将浏览器的结果复制过来进行替换

  继续执行代码,出现错误:ReferenceError: esm_typeof is not defined,不过是在 case “7” 中,用上面同样的方法进行替换

  继续执行代码,出现错误:ReferenceError: MD5 is not defined,可以看到这里用到了 MD5。我们可以在浏览器控制台执行 MD5(‘1’) 与 在线 MD5(‘1’) 的值进行比较,如果一致的话就说明没有经过魔改,我已经试过了,这里并没有魔改,就不再展示具体过程了。

  在 node 中可以使用 crypto-js,如果需要安装的话可以执行:

1
npm install crypto-js

  在 js 文件顶部添加:

1
const Crypto = require("crypto-js")

  并将 case “9” 中的代码修改为如下代码:

  我们试一下到了这一步时,参数的值是否一致。分别在 WebStrom 和浏览器的 case “9” 代码内部打上断点

  可以看到除了参数 yr 以及 dr 的值不一致,其他都一样,参数 yr 是时间戳不用管,dr 是字符串,经过多次测试可以确定 dr 是定值,所以直接替换即可

WebStrom

浏览器

  将 case “8” 中的时间戳修改为与浏览器一致,再次执行代码,可以看到运行的结果与浏览器一致了

  使用 Python 执行,成功了!!!nice!!!😊

写在最后

  总的来说难度不大,有坑点,但不算太坑,只要静下心来去做,肯定是可以搞得定的。