逆向:某多多 Anti-Content 参数 时间: 2022-09-25 16:07 分类: 逆向 ####前言 相信大家在做爬取某多多的时候,发现大多数的接口都做了反爬限制。 其中最常见的就是`Anti-Content`请求头,顾名思义,就是反内容爬取。 这段时间有个需求是关于某多多服务市场的接口,相关地址是:https://fuwu.某多多.com/ 网上找了几个`Anti-Content`生成的js都不管用,所以还是得自己来搞。 ####开搞 首先,很容易根据请求接口将`Anti-Content`生成的代码定位在`messagePack`中,某多多不同网页基本上都是这个函数方法,定位到的代码如下: ``` var E = function(e) { return new (n(159))({ serverTime: e }).messagePack() } ``` 如果熟练`JS`逆向的话,很容易就猜到`n(159)`是调取加密模块,因为现在大多数的js都是`webpack`打包的。 要扣取这类加密代码,无非就是套模板一样,扣一个模块加载器出来,将加密模块填到模板代码中,最后将模块加载器暴露出来给自己调用来调取加密模块,大致是长这个样子: ``` var dd; !(function (e) { var t = {}; function d(r) { if (t[r]) return t[r].exports; var i = t[r] = { i: r, l: !1, exports: {} }; return e[r].call(i.exports, i, i.exports, d), i.l = !0, i.exports } dd = d; } )({ module1: function (e, t, n) {}, module2: function (e, t, n) {}, ... }) ``` 使用的时候,就直接用暴露的`dd`来调用即可,类似如下: ``` new (dd("module1")).decrypt(); ``` 后面的`module`参数可以是数组,也可以是字典对象,我上面的是字典对象,如果是数组,那么调用传入模块数组下标即可。 前面说到了`messagePack`,跟进`n(159)`,可以看到直接走到这: ![微信截图_20220925153204.png](https://0o0.me/usr/uploads/2022/09/109252185.png) 这就是上面说的我们熟悉的模块加载器,这个不用管,直接跳出去,后面构造传入时间戳也可以直接跳过,关键跟进`messagePack`方法: ![微信截图_20220925153435.png](https://0o0.me/usr/uploads/2022/09/3310132621.png) 可以看到加密方法混淆了,如果加密函数代码比较少,还有逆向还原代码的可能性,但这个的话,仔细分析你会发现加密涉及到的代码有几千行,这种只能直接扣代码,就是把它的加密代码抠出来供其他语言直接调用。 上面说了直接套模板,模块加载器的模板在上面已经有了(可以直接跟进`n(159)`将里面的加载器抠出来用),那么接下来要做的就是把加密模块抠出来。 我们定位到了加密函数的部分,往前找,那么很容易就能将加密模块整个抠出来: ![微信截图_20220925154018.png](https://0o0.me/usr/uploads/2022/09/2998990863.png) 往上找,找到类似上面的`function(e, t, n)`,那么就是整个模块的开始,因为它这里用的是数组,所以不像前面说的字典对象有`key`对应,根据`n(159)`可以知道它在数组中的下标是159。 我们扣出来的时候,可以不使用数组来传参,因为记数组的下标比较麻烦,很容易混淆,所以干脆用它的下标作为字典的key来传参,类似如下: ``` { 159: function(e, t, n) } ``` 抠出来调用会发现它还依赖了很多其他模块,比如: ![微信截图_20220925154639.png](https://0o0.me/usr/uploads/2022/09/3846481964.png) 这时,我们只需要反复的测试报错缺哪个模板就补哪个模块就是,最终扣取的整个代码结构如下: ![微信截图_20220925154921.png](https://0o0.me/usr/uploads/2022/09/36286456.png) 可以看到调了很多其他模块,如果使用数组传参的话还需要修改各个调用模块代码的下标,一般我们直接用字典保留它的下标作为key,这样就不用修改任何调用的代码了。 到此为止,直接在浏览器中运行已经能够成功输出`Anti-Content`的值了,有人说校验了`cookie`、`localStorage`、`location.href`等,但我发现某多多服务市场的`Anti-Content`,不需要`cookie`、`localStorage`、`location.href`生成的`Anti-Content`都是可用的。 如果校验了用户点击事件的坐标,我还真不知道该如何去模拟,断点调试的时候,发现某些接口加密代码中确实有鼠标点击位置信息,但在`NodeJs`中好像是无法模拟的吧。 昨天在`NodeJs`里运行生成的`Anti-Content`一直过不了检测我还以为是没有鼠标点击坐标的问题。但其实是代码里检测了`NodeJs`的`Buffer`类,在代码中加入`delete window.Buffer`最后就成功了。 最后再说下环境检测问题吧,一开始抠出来的代码在浏览器中执行是没问题,但是在`NodeJs`里运行没有报错,但输出为空,这种肯定就是运行环境的问题了,因为`NodeJs`与浏览器还是有很大区别的,有很多的对象在`NodeJs`中是没有的,比如`document`、`navigator`、`screen`、`history`等。 自己挨个去补上,再次运行会报错说缺了啥,这个时候缺啥补啥就是了。 但是像我昨天的问题是环境都补上了,没有报错,但是生成的`Anti-Content`一直过不了检测。这种问题就需要对`NodeJs`与浏览器的区别有所了解了,比如昨天的问题就是检测了`NodeJs`的`Buffer`类,这种它不会报错给你,要你自己去猜它检测了哪些浏览器或者`NodeJs`特有的对象,或者去一步一步跟进调试代码看它检测了什么东西,但像某多多这种,代码多且又混淆了的根本没法一步一步调试分析它检测了什么东西。 ####结束语 通过本次逆向,我也算是刚入门了吧,以前对于`webpack`模块加载器这种代码一直不知道如何下手去扣里面的代码,这次终于掌握了方法,但对于混淆代码的分析还是一概不知,有机会再学习去了。 标签: 无
delete window.Buffer 会导致
ReferenceError: Buffer is not defined
有什么办法解决吗?