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

最后

欢迎联系作者交流更多

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值