声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,相关网址和数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请联系删除!
前言
- 网址:
a142fba3ce81b2b367bdfb6fe9b0ae5f
- 加密接口:
b806cc12db93aacb67a81f0faa2ff1e2
抓包分析
万能第一步,F12打开开发者工具进行抓包,因为这个网址有日期,所以我们可以通过这个来进行发包
然后找到带有数据的接口,发现是在这里
很明显,数据是已经加密的,然后看请求头、查询参数、cookie,发现是没有加密的,所以我们的逆向目标只有一个:解密响应数据
逆向分析
大概来分析一下:
一个网站如果返回的数据加密了,那么显示在浏览器时是一定要解密的,这种算法显然就是对称算法,要么就是DES,要么就是AES,也可能是魔改算法,但是大概率都会有decrypt
这个关键字,所以我们可以先尝试关键字搜索来进行定位
我们来搜索一下关键字decrypt
可以发现,第一个文件名有我们眼熟的DES,想也不用想,我们先排查第一个文件,给出现decrypt
的地方打上断点,重新发包,看看断在哪一个地方
成功断住!!!离成功不远啦,先来看看这段代码
_0x554c90 = _grsa_JS[_0x2246('0x25d', 'E&PI')]['decrypt']({
'ciphertext': _grsa_JS['enc'][_0x2246('0x25e', 'sy^o')]['parse'](_0xa0c834)
}, _0x2cf8ae, {
'iv': _0x554c90,
'mode': _grsa_JS[_0x2246('0x16c', 'O^50')][_0x2246('0x25f', 'Who^')],
'padding': _grsa_JS[_0x2246('0x260', '7IfV')][_0x2246('0x261', 'E&PI')]
})[_0x2246('0x1c', 'yY#5')](_grsa_JS['enc'][_0x2246('0x262', ']2BX')]);
显然这是一段ob混淆代码,其中的_0x2246('0x25d', 'E&PI')
就是DES,并且整体上看也是对称算法的风格
- iv:偏移量
- mode:工作方式
- padding:填充模式
将这段代码放在控制台输出
完美,得出结果,但是仔细一看后面,好像有多余的东西,那显然这段数据没有处理完,我们可以下一步进行调试,找一找显眼的东西
走到这一步的时候,可以看到参数e
是加密的数据,而webInstace.shell(e)
打印的正是我们需要的数据并且已经处理干净,接下来我们进入到这个函数中,把它扣下来放在node中
扣代码
把它扣下来运行后,大多就是这种错误,只需要根据缺啥补啥的原则慢慢去补就好了
在这个报错里,我们不仅要扣那个数组,还要把下面那个自执行方法拿下来,当然,对于这种ob混淆代码,也可以全扣,也可以去慢慢扣
到了这里,我相信许多人的想法都和我一样,以不报错为主,所以直接就是写上navigator = {}
很好完美,不报错了,但是纳闷的是,没有打印出任何结果,后面排查了下,就是上面的补环境少补了!
case '7':
if (!navigator || !navigator[_0x2246('0x26d', '0I#o')])
return '';
看看这段代码,前面的navigator
有了为false,但是因为没有补后面的东东,所以后面的判断为true,所以给我们返回了空!!!真坑啊,把_0x2246('0x26d', '0I#o')
拿去打印一下,发现是userAgent
,我们补上就可以了
navigator.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
然后我们继续运行,继续扣缺少的代码,就到了这一步报错
去源代码可以发现,这是一个对象,里面存放了一些处理好了的函数
仔细一看,这不就是和node中那个加密模块差不多嘛,所以我们只需要加上这个代码就完事了
var crypto = require('crypto-js')
_grsa_JS = crypto
输出发现,成功!!!
Js部分实现
function get_data(e) {
return aaa(e)
}
Py部分实现
import requests
import execjs
with open('./解密.js', 'r', encoding='utf-8') as f:
js_code = execjs.compile(f.read())
headers = {
}
response = requests.post(url, headers=headers, data=data)
data = js_code.call('get_data', response.text)
print(data)