事情的起因还要从一个0day说起,不是我喜欢0day,主要是我喜欢逆向(不可能)。
首先们先来看一下请求包的数据,三个参数,不知道是啥东西。
我们先看一下JS代码,很明显是加了混淆的,那么接下来要咋办呢?
虽然是加了混淆,但也仅仅只是做了混淆而已,并没有做反调试等处理,因此最好就是进行调试跟踪变量如如何变成最终的加密参数的,在调试的过程中发现,做什么处理之前都会跳转到这个鬼函数这里,阅读一下代码也不太清楚它是干什么的,只能判断它就是一个类似加密的函数。
而在调试的过程中,由于代码做了混淆,无法直接读出代码是什么意思,不断的出现套娃感觉走不出去了,但在玖(咪)大佬的提示下也明白了,先不管这个函数做了什么,反正先去看它三个参数是如何生成的
跟进发现又进入到了这个a0b函数中,那就先不管这个函数,跳出这个函数先
那么我们只要把它加密前的值拿出来md5加密一下即可验证,在控制台输入,将参数值放到cmd5.org去加密验证
那么可以确定最后z的值就是用了MD5,那么这几个数是什么东西,我们在控制台传入md5函数里的参数名是什么
那么我们就可以得到z的值就是md5(y[toString]()),根据前面代码可以得到y是一个长度为8,且值为随机的一个数组
var y = newUint16Array(0x8);
故此,我们创建一个JS文件,按照流程写一个生成z的函数
A = this[cP(0x1168, 'Zs!k') + 'pt'](s, z);
首先打印cP(0x1168, 'Zs!k') + 'pt'的值为多少
直接跳过cP,跟踪进入下一个函数,可以看到传入了接口路径以及前面得到的z(u就是z传过来的)参数,然后在u前面拼接一段字符串然后进行md5加密得到v,在控制台打印出拼接在前面的字符串
接着将s(路径)进行url编码,然后将s,v传到下一个函数中
这时,玖(咪)大佬提出,让我去输出一下前面的值,还真是异或加密
有了前两步的经验之后其实生成B也就是顺手的事了我们知道B最终的代码为
B = this[cP(0x2819, 'lTRw') + 'pt'](JSON[cP(0x618, 'Ivpn') + cP(0x1439, 'k0MR')](u), z);
这里this[cP(0x2819, 'lTRw') + 'pt']我们知道,就是生成A的函数,其中一个参数为JSON[cP(0x618, 'Ivpn') + cP(0x1439, 'k0MR')](u),我们只要得到它的值即可写出B的生成代码,先打印出
那就是JSON[stringify](u),也就是将u(请求包的参数对象)也就是将请求参数对象转化为json字符串
那么B的生成就更简单了,转化为json字符串后直接调用A即可,流程如下
然后就可以写个爬虫调用写的JS来替换加密参数来爬取后台数据了
总结:第一次进行的代码混淆JS逆向,虽然对各位大佬来说难度一般,而有文章也许有很多地方没能表达和写好(信息也比较敏感,只能截那些混淆代码和厚码)请各位大佬见谅,本人只是菜而已
原文始发于微信公众号(锦鲤安全):忘记一次代码混淆的JS逆向
评论