前言
- 可以关注我哟,一起学习,主页有更多练习例子
- 如果哪个练习我没有写清楚,可以留言我会补充
- 玩多了简单的是不有点发腻,这次来点有意思的
- 这个逆向出来也是凑巧
- 如果有加密的网站可以留言发给我,一起学习共享学习路程
网址:
aHR0cHM6Ly9mbGlnaHQucXVuYXIuY29tL3NpdGUvb25ld2F5X2xpc3QuaHRtP3NlYXJjaERlcGFydHVyZUFpcnBvcnQ9JUU1JThDJTk3JUU0JUJBJUFDJnNlYXJjaEFycml2YWxBaXJwb3J0PSVFNCVCOCU4QSVFNiVCNSVCNyZzZWFyY2hEZXBhcnR1cmVUaW1lPTIwMjEtMTAtMjImc2VhcmNoQXJyaXZhbFRpbWU9MjAyMS0xMC0yOSZuZXh0TkRheXM9MCZzdGFydFNlYXJjaD10cnVlJmZyb21Db2RlPUJKUyZ0b0NvZGU9U0hBJmZyb209cXVuYXJpbmRleCZsb3dlc3RQcmljZT1udWxs
1. 加密参数:
image.png加密请求头:
image.png2. 解密 _m_
2.1 查找_m_
因为_m_ 参数名称比较特殊,所以咱们直接全局搜索,开搞!!
噔噔蹬蹬~~
image.png
八九不离十,基本确定是这个了
2.2 打断点
打断点查看每个参数的值,看看我们发现了什么,哟呵,双层加密
image.png image.png继续跟进,先看里面那一层的
image.png
我们发现:
- 受限获取了一个token 和cookie中的时间戳
- 将时间戳%2的余数
- 将鼠标放到最后一行的encrypetFunction上,发展里面有两个加密方法,根据余数r的判断进入哪个方法
- 参数为上面两个值的相加
2.3 再次进入encrypetFunction方法中参看加密方法
image.png重点我们现在找到了,干他俩
说一个小技巧也是我个人的凑巧
我发现u加密完后是32位,s加密完成后是40位,而且都是十六进制,勇敢的猜测了一下,32位为MD5,40位为SHA1
image.png
我试了一下,艾玛,真香
image.png再看到上面流程后有跟sha加密
2.4 encrypetFunction加密流程
- 根据2.3得知,一共用了两种加密一个sha1和md5
- 根据余数判断将参数是 先sha在md5 还是 先md5再sha1
- 在请求中又看到所有发送的_m_值是32位,预估一下还有一次md5加
image.png -
果然,看到前面的L加密运算后是将所有的再进行了一次md5加密
image.png
3.解密
关于pre说一下思路,selenium直接读取window.pt读取数据,pre当失效了再次读取即可
精简化的代码如下:
var _0x167381 = {};
var window = {}
var compared = function (_0x562245, _0x40bb9f) {
return _0x562245 < _0x40bb9f;
};
_0x167381["QmkxL"] = function (_0x2b5cea, _0x483ab6) {return _0x2b5cea !== _0x483ab6;}
_0x167381["tSIrZ"] = function (_0x11572e, _0x372f4f) {return _0x11572e + _0x372f4f;}
_0x167381["tonQV"] = function (_0x1c66cf, _0x5790ce) {return _0x1c66cf === _0x5790ce;}
function _0x363b69(_0x153c09, _0x4f5b18) {
var _0x17ba32 = _0x153c09["join"]("")["split"]('');
var _0x2cdb7b = parseInt(_0x4f5b18, 16).toString(2).split("")
var _0x5cbe2e = _0x2cdb7b['length'];
var _0x454ef6 = _0x17ba32['length'];
for (var _0x4917a5 = 0x0; compared(_0x4917a5, _0x454ef6); _0x4917a5++) {
_0x17ba32[_0x4917a5] = String['fromCharCode'](_0x167381["tSIrZ"](_0x17ba32[_0x4917a5]["charCodeAt"](0x0), _0x167381["tonQV"](_0x2cdb7b[_0x4917a5], '1') ? -0x2 : -0x4));
}
return _0x17ba32['join']('');
}
var _0x1b269f = ['3de<969:1', 'cf:f58', '19;6h48:9/:', '9:88j65/;eh62f', 'c77g96']
var _0x4f5b18 = "30500e753de2"
console.log(_0x363b69(_0x1b269f, _0x4f5b18))
结论:
- 读取token和类似时间戳的相加组成一个参数
- 将参数按时间戳余数,判断加密顺序
- 将第二步加密出来的返回数据,进行最后一次md5加密,发送
- 在发送时记着携带st参数也是时间戳
- pre两种方式获取:
a. 浏览器获取指定参数可正则匹配一下子就出来了,然后带入到参数中请求数据,pre可以多次使用,过期再次获取即可
b. selenium 获取数据即可window.pt - 完结撒花
网友评论