声明:本文仅限学习交流使用,禁止用于非法用途、商业活动等。否则后果自负。如有侵权,请告知删除,谢谢!本教程也没有专门针对某个网站而编写,单纯的技术研究
案例分析
目标案例:aHR0cHM6Ly93d3cubWFmZW5nd28uY24vaS8yMDAxMzk1OC5odG1s
1.难点和接口
参数分析
通过观察可以看到他是前两次请求失败然后成功的,请求成功的需要带上cookie才行,那么我们来看下
第一次请求可以看到他是没有带任何cookie,但是我们可以看到它的返回是有cookie的
在第二次请求时可以看到这里是带有cookie的,那么看下第一次请求可以发现返回了一个set-cookie那么后面那个怎么来的那
我们可以看到在第一次请求是有返回的,这点我们先复制到浏览器上执行看下是什么情况
这里可以看到他就是cookie里面的另一个参数,那么我们用re把这点数据提取出来通过python的execjs中的eval进行执行,然后
这里可以看到第二次请求的cookie都已经拿到了,那么带上cookie进行请求,在第二次请求可以看到他是返回了一些js
我这边通过给空白的地方下断点,给cookie进行清理,我发现怎么清理都进不去
但是我发现可通过清除cookie的时候这里是用变化的通过快速下断点也能进入,或者就是通过fiddler进行替换执行
方案1:
方案2:
通过给加密保存下来,在开始添加一个debugger进行替换然后断点
如这样,我们就进来了
进来并不代表已经完成,因为这里是混淆的,那么我们怎么找到对应的加密参数那,因为我们搜cookie发现没有搜到,那么我们转变思路通过搜它的上一级,document
看到这就是cookie了,知道了位置那么我们就来看参数就行
通过分析发现他是_0x1986b1取的第0个,那么直接搜这个_0x1986b1
这里可以看到它使用的是我们之前go调用里面的字典数据,然后调用的函数
那么这里我们可以改为这样
之前有人问我怎么补代码,那么我们一起来看下,直接执行,然后说我们没有定义,那么我们看浏览器
我们可以看到这个函数就是对应的值,那么我们把它复制下来
这时候发现刚刚的报错已经没有了,那么我们继续补充其他报错即可
我这边是通过先观察后补
我们观察可以直接_0x4d3817就是我们的入参,那么我们直接把入参名字替换,后续的是对入参进行取值然后获取它的长度
可以看到这里是对等的,那么我们可以直接修改代码
可以看到这里是对获取的长度进行循环,这里只是混淆了下,那么我们可以直接还原
我们继续调试发现他是进入的if里面,那么我们是不是可以把else给处理掉,if同理是满足条件的情况,也可以修改
我们通过还原发现,他是进行的运算那么我们把这个函数搞下来,改下名字
那么代码也需要对应修改
你通过多次抓包可以看到这里获取go里面的ha进行的
那么剩下的一个就是一个
进行补充改为函数,那么我们就补完了,本次逆向之旅到这里就结束了,我们下次在见!!!
拜拜!!!
效果展示
代码分享
var _0x3a1c07 = new Date();
CryptoJS = require('crypto-js')
var hash = {
'md5': function (a) {
return CryptoJS.MD5(a).toString()
},
'sha256': function (a) {
return CryptoJS.SHA256(a).toString()
}, "sha1": function (a) {
return CryptoJS.SHA1(a).toString()
}
}
function _0x7f1ad(_0x654898, _0x4389de) {
return _0x654898 + _0x4389de;
}
function _0x7f1ad_(_0x560b33, _0x39e54b) {
return _0x560b33 - _0x39e54b;
}
function _0x1132d7(_0x5cdeb6, _0x334155) {
var _0x38cbe2 = _0x4d3817['char' + 's']['leng' + 'th']; // 或者修改成我演示的样子也可
for (var _0x203549 = 0x0; _0x38cbe2 > _0x203549; _0x203549++) {
for (var _0x17f4e5 = 0x0; _0x17f4e5 < _0x38cbe2; _0x17f4e5++) {
var _0xb3d424 = _0x7f1ad(_0x7f1ad(_0x334155[0x0], _0x4d3817['chars']['substr'](_0x203549, 0x1)), _0x4d3817['chars']['substr'](_0x17f4e5, 0x1)) + _0x334155[0x1];
if (hash[_0x4d3817['ha']](_0xb3d424) == _0x5cdeb6) {
return [_0xb3d424, _0x7f1ad_(new Date(), _0x3a1c07)];
}
}
}
}
_0x4d3817 = {
"bts": ["1686707967.988|0|uvF", "ZkQVWUyUj6cqAtCSZSjlXo%3D"],
"chars": "RmEmknBTVGibwheLEiTnxQ",
"ct": "feefe5555d86e1c7abe2122add8faab293a415749339b44fac32358e3a0f9106",
"ha": "sha256",
"is": true,
"tn": "__jsl_clearance_s",
"vt": "3600",
"wt": "1500"
}
function get_cookies() {
var _0x1986b1 = _0x1132d7(_0x4d3817['ct'], _0x4d3817["bts"]);
return '__jsl_clearance_s=' + _0x1986b1[0]
}
console.log(get_cookies())