赞
踩
该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~
目标网站:
aHR0cDovL3EuMTBqcWthLmNvbS5jbi8=
对于cookie反爬虫,我们可以使用hook,控制台输入
(function () {
Object.defineProperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('v') != -1) {
debugger;
}
console.log('Hook捕获到cookie设置->', val);
return val;
}
});
})();
通过调用堆栈进入到D方法,可以看到n就是我们的v参数
进入rt.update()方法
转到D()方法上,这个就是v的生成方法
我们把整个JS代码整个复制下来
JS生成的cookie必须采用document.cookie = 去复制
打印一下cookie的值,在浏览器跑一下是可以跑通的,证明代码没问题
本地跑一下
第一次跑
补 document = {}
第二次跑
补 window = global
第三次跑
此处下断点调试一下
p +d 是一个head
它是获取这个head,所以我们应该是要补这个得环境,我们在浏览器输出一下看看
它返回得是一个数组
JS给方法传参,会存储在一个arguments里面
我们也可以用个arguments接收一下,让它自动吐出来
我们可以把这个方法重写一下
第四次跑
这里同上
第五次跑
这里先给它一个空的方法看看
第六次跑
断点调试可知 s[201] 是plugins,把环境补上
第七次跑
运行没有报错,但是也没有生成对应的值。所以需要找一下有没有用try方法
try特别多,我们可以先从入口文件开始找起
找到o方法,打印一下异常,看是否能捕获到
断点调试可知,是调用了documentElement的addBehavior属性
所以我们补一个空对象就可以了
第八次跑
报了一个length,这个我们可以上代理,让它自动吐环境
window = new Proxy(window, {
set(target, property, value, receiver) {
console.log("设置属性set window", property, typeof value);
return Reflect.set(...arguments);
},
get(target, property, receiver) {
console.log("获取属性get window", property, typeof target[property]);
return target[property]
}
});
document = new Proxy(document, {
set(target, property, value, receiver) {
console.log("设置属性set document", property, typeof value);
return Reflect.set(...arguments);
},
get(target, property, receiver) {
console.log("获取属性get document", property, typeof target[property]);
return target[property]
}
});
navigator = new Proxy(navigator, {
set(target, property, value, receiver) {
console.log("设置属性set navigator", property, typeof value);
return Reflect.set(...arguments);
},
get(target, property, receiver) {
console.log("获取属性get navigator", property, typeof target[property]);
return target[property]
}
});
location = new Proxy(location, {
set(target, property, value, receiver) {
console.log("设置属性set location", property, typeof value);
return Reflect.set(...arguments);
},
get(target, property, receiver) {
console.log("获取属性get location", property, typeof target[property]);
return target[property]
}
});
补一个navigator userAgent
第九次跑
这里补一个空的方法就可以了
navigator.javaEnabled = null_funcion
第十次跑
获取属性get location href undefined
TypeError: Cannot read properties of undefined (reading ‘split’)
补 href:‘http://q.10jqka.com.cn/’
第十一次跑
获取属性get location protocol undefined
TypeError: Cannot read properties of undefined (reading ‘split’)
补 protocol:‘http:’
第十二次跑
获取属性get location hostname undefined
获取属性get location host undefined
同上
第十三次跑
获取属性get window XMLHttpRequest undefined
获取属性get window ActiveXObject undefined
设置属性set window CHAMELEON_CALLBACK function
ReferenceError: Element is not defined
补 window.XMLHttpRequest = null_funcion
window.ActiveXObject = null_funcion
第十四次跑
ReferenceError: Element is not defined
定位一下报错的位置
补一个空对象
Element = {
prototype:{}
}
终于!!!!
终于!!!!
终于!!!!
结果出来了,但又有一个新问题,程序貌似陷入了循环,不结束也不报错
冷静分析一下:
这里应该是用了setInterval()方法,这是一个定时执行的方法
可以全局搜一下
那么我们可以用这个方法失效,即重新定义方法,让方法置空
setInterval = function(){}
再跑一下,结果出来了~~
最后附上需要补的环境
document = {
documentElement:{}
};
window = global;
navigator = {
plugins : {},
userAgent:'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
head = {}
div = {}
location = {
href:'http://q.10jqka.com.cn/',
protocol:'http:',
hostname:'q.10jqka.com.cn',
host:'q.10jqka.com.cn'
}
Element = {
prototype:{}
}
null_funcion = function () {
console.log(arguments)
}
getElementsByTagName = function(val){
if (val === 'head'){
return [head]
}
}
createElement = function(val){
if (val === 'div'){
return div
}
}
addEventListener = null_funcion
// 事件监听
window.XMLHttpRequest = null_funcion
window.ActiveXObject = null_funcion
navigator.javaEnabled = null_funcion
document.addEventListener = addEventListener
document.createElement = createElement
document.getElementsByTagName = getElementsByTagName
setInterval = function(){}
欢迎联系作者交流更多
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。