叠甲
此文章只用作学习,请勿用做任何商业用途,如有侵权请添加首页微信或QQ1348943384进行通知删除!如用本文中的代码去对他人造成不良影响,本人概不负责。
参数分析
下面几个参数在请求和逆向过程中你会经常看到,让我们先来分析下他们的获取方式。
- ttwid:cookies中的一个参数,本人在测试时发现此参数必须携带。
- webid:请求params中的参数,可以不用携带。
- aid:定值,在后续逆向过程中有用。
- pageid:定值,在后续逆向过程中有用。
- mstoken:请求params中的参数,之前请求的时候有这个参数,后面请求的时候又没了,可以不用携带。
- a_bogus:请求params中的参数,对标老版的x_bogus,也是本文章逆向的目标。
ps:上方的ttwid,webid,aid,pageid在随便一个页面请求中都会返回。
a_bogus逆向分析
可以+v免费回答问题,大家都是搞逆向的,互相学习是可以的
还原代码后代码地址:打不开可以挂代理
ps:本人在逆向的过程中也是借鉴了网络上的文章,顺着前人的思路走能省下很多时间,因此下面的分析中不会一步步说明的很清楚。
加密位置
经网络上的文章知晓加密位置位于bdms.js文件中。
进入文件会看到很多return (0,e._u)(r[0], arguments, r[1], r[2], this)
,搜索(r[0], arguments, r[1], r[2], this)
会有29个,在26处生成最终结果,27处生成加密参数(也是从网络文章中知晓的)。
算法还原
单步进入26处后会发现是一个控制流。控制流的还原最好是通过打日志断点实现。
整个26处算法还原后的代码如下(ps:这个代码也是在网络上直接找到的,本人也没有进行逆向过程):
function get_ab() {
let lm4 = "arguments中的乱码"
百度关键词 a_bogus算法还原大赏,人家都把代码写出来了....
}
逆向乱码4
整个逆向过程中会存在4个乱码,乱码4就是最终的乱码,经上面算法可生成最终返回参数。
由网络上的文章可以知道:乱码4 = 乱码2 + 乱码3
逆向乱码3
由网络上的文章可以知道乱码3在25处生成。(ps:在老版本中这里都不需要分析,直接扣方法就可以了,新版就是把老版的此代码扩写成了控制流,所以你懂的😀。
接下来就是分析这部分代码了,控制流的还原最好是通过打日志断点实现。可以在类似var y = i[r++];的地方添加以下断点,然后右键日志进行保存,再根据日志的显示一点点的分析
日志断点:"位置 1", "索引m", m, "索引r", r, "值p: ", JSON.stringify(p, function(key, value) {if (value == window) {return undefined} return value}),"值v",v
。
乱码3的生成需要用到乱码1。
function get_lm3(lm1) {}
逆向乱码1
乱码1在27处生成,它的生成就比较复杂了,把乱码1逆向成功就等于成功了。
难道是不难,就是步骤比较多,耐心点,相信自己!
- 乱码1是通过
fromCharCode(...array4)
生成。 array4 = [...array1, ...array2, ...array3]
。array2
是根据你的浏览器参数生成的,可以考虑写死。array1
和array3
都是从b数组中一个个元素取出来的拼接成的。- b数组中涉及到两个时间戳和三个数组,这里我们把这三个数组叫成barray1,barray2,barray3
- 两个时间戳注意下谁大谁小。
- barray3:由ua生成,类似ua的可以不用去还原算法,直接写死。不过你在请求时的ua必须和这里的ua要保持一致。真有需要批量采集数据的话直接生成几百个ua,然后在控制台中调用js代码直接生成结果就行,够封的了。
- barray2:post请求用data+‘cus’,get请求用'cus'生成一个32位数组B1,再由B1生成barray2。
- barray1:将传入的参数生成一个32位数组A1,再由A1生成数组1。
逆向乱码2
你都已经把乱码1逆向出来了,乱码2还不是简简单单,这里就提一嘴是个随机值,不如直接写死😀。
最后就是上结果了!!