本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责
站点:aHR0cHM6Ly9zby50b3V0aWFvLmNvbS9zZWFyY2g/ZHZwZj1wYyZzb3VyY2U9dHJlbmRpbmdfY2FyZCZrZXl3b3JkPSVFNyVCRSU4RSVFNSU5QiVCRCVFNiVCNCU5QiVFNiU5RCU4OSVFNyU5RiVCNiVFNCVCOCU4MCVFOCVCRCVBNiVFOCVCRSU4NiVFNSU4NiVCMiVFNiU5MiU5RSVFNCVCQSVCQSVFNyVCRSVBNA==
视频:视频教程
先访问站点,发现有2次请求,且第一次请求的响应内容空白。第1次请求后紧接的第2次请求就是渲染的页面。可见第1次请求必然做了什么事情,这也是典型的动态cookie场景。

观察第1次请求的响应头:有一些setcookie等字段

再看看第2次请求成功:
url、参数并没有区别,只不过带了个cookie,其中__ac_nonce来自于第1次请求返回,而多的这个__ac_signature就要处理了。

此时利用postman发一次包看第1次请求响应内容究竟是什么:

是一大段JS,拿出来看:显然是个jsvmp,且能找到生成的函数是:

而__ac_nonce已经可以从第1次请求拿到,接下来就看怎么让这个调用能够完成。
由于是个大jsvmp,简单做法直接补环境处理。
先尝试运行代码看看:报错防盗链。。。

那常规操作,先补几个基础dom对象,再祭出Proxy直接挂!
提一嘴,watch方法来自于B站up主:无名的Coder,主页:up主页
运行打印看看:
行,那就全补上
再来试试:只剩这个关键函数,提示undefined

回头看看那个vmp,其中有一些检测点:

在node环境下,这个表达式包返回Object,但是浏览器环境并没有exports,结果是undefined。所以必须让这个表达式的结果也是undefined,这样修改下再运行:

直接出值,成功!
并且长度也没问题,代入请求中去测试能通过。
目前这个值请求通搜索接口没问题,不过有些场景的话,这个长度还不够,例如评论接口:

实际长度有147,但搜索接口补完出的值仅有47。所以补的环境不够,还差一部分。
这个就留给大伙自己补来看看哈哈
入门补环境,大佬请忽略
__ac_signature=window.byted_acrawler.sign("",__ac_nonce);
__ac_signature=window.byted_acrawler.sign("",__ac_nonce);
function watch(obj, name) {
return new Proxy(obj,{
get: function(target, property, receiver) {
try {
if (typeof target[property] === "function") {
console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + 'function' + `,类型为:` + (typeof target[property])]);
} else {
console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + target[property] + `,类型为:` + (typeof target[property])]);
}
} catch (e) {}
return target[property];
},
set: function(target, property, newValue, receiver) {
try {
console.table([`对象 => ${name} ,设置属性:`, property + `,值为:` + newValue + `,类型为:` + (typeof newValue)]);
} catch (e) {}
return Reflect.set(target, property, newValue, receiver);
}
});
}
window = global;
document= {
};
location= {
};
navigator= {
};
window = watch(window, "window");
location = watch(location, "location");
document = watch(document, "document");
navigator = watch(navigator, "navigator");
require("./bdm.js")
var sign = window.byted_acrawler.sign("","123");
console.log(sign);
function watch(obj, name) {
return new Proxy(obj,{
get: function(target, property, receiver) {
try {
if (typeof target[property] === "function") {
console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + 'function' + `,类型为:` + (typeof target[property])]);
} else {
console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + target[property] + `,类型为:` + (typeof target[property])]);
}
} catch (e) {}
return target[property];
},
set: function(target, property, newValue, receiver) {
try {
console.table([`对象 => ${name} ,设置属性:`, property + `,值为:` + newValue + `,类型为:` + (typeof newValue)]);
} catch (e) {}
return Reflect.set(target, property, newValue, receiver);
}
});
}
window = global;
document= {
};
location= {
};
navigator= {
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!