JS逆向-补环境之同花顺cookie中的v参数
前言
该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~
需求
目标网站:
aHR0cDovL3EuMTBqcWthLmNvbS5jbi8=
正文
对于cookie反爬虫,我们可以使用hook,控制台输入
(function(){Object.defineProperty(document,'cookie',{set:function(val){if(val.indexOf('v')!=-1){debugger;}console.log('Hook捕获到cookie设置->',val);returnval;}});})();
通过调用堆栈进入到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=newProxy(window,{set(target,property,value,receiver){console.log("设置属性set window",property,typeofvalue);returnReflect.set(...arguments);},get(target,property,receiver){console.log("获取属性get window",property,typeoftarget[property]);returntarget[property]}});document=newProxy(document,{set(target,property,value,receiver){console.log("设置属性set document",property,typeofvalue);returnReflect.set(...arguments);},get(target,property,receiver){console.log("获取属性get document",property,typeoftarget[property]);returntarget[property]}});navigator=newProxy(navigator,{set(target,property,value,receiver){console.log("设置属性set navigator",property,typeofvalue);returnReflect.set(...arguments);},get(target,property,receiver){console.log("获取属性get navigator",property,typeoftarget[property]);returntarget[property]}});location=newProxy(location,{set(target,property,value,receiver){console.log("设置属性set location",property,typeofvalue);returnReflect.set(...arguments);},get(target,property,receiver){console.log("获取属性get location",property,typeoftarget[property]);returntarget[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'){returndiv}}addEventListener=null_funcion// 事件监听window.XMLHttpRequest=null_funcion window.ActiveXObject=null_funcion navigator.javaEnabled=null_funcion document.addEventListener=addEventListener document.createElement=createElement document.getElementsByTagName=getElementsByTagNamesetInterval=function(){}最后
欢迎联系作者交流更多