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(){}

最后

欢迎联系作者交流更多