海绵 平常学python
常常js分析的人来讲有些网站检测浏览器指纹是很常见的事,可是咱们一点一点分析是很费时间,费脑筋的。python
咱们扣代码的结果是咱们要调用他的加密或解密或某个值的算法,当咱们把他的算法扣下来执行,正常状况下是没问题的,可是若是他计算了浏览器指纹,那基本上你除了完整的分析别无他法,今天咱们来说一个hook劫持。固然我只讲原理,具体大家本身研究琢磨。
首先介绍一下这个es6的特性:Proxy 对象用于定义基本操做的自定义行为(如属性查找,赋值,枚举,函数调用等)。
简单来讲就是咱们能够彻底代理某个对象,基于这个对象的全部操做都会被拦截下来,可是他的内部对象操做拦不下来,好比:es6
a={b:function(){return "123"}} a = new Proxy(a, { get: function(target, key, receiver) { console.log(target, key, receiver); return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } });
当咱们调用a.b 就用过代理拦截下来,可是
当咱们:a.b.c咱们发现.c并无拦截到,那是由于.c是属于b对象,并不能嵌套拦截,若是有须要咱们能够嵌套:好比算法
a={b:{c:function(){return "123"}}} a = new Proxy(a, { get: function(target, key, receiver) { console.log(target, key, receiver); if(target[key] instanceof Object){ return new Proxy(target[key],{ get:function(a,b,c){ return a[b]; },set:function(a,b,c,d){ a[b] = c; } }) } return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } });
这样的话就能够嵌套,看到这里大家是否是明白了,
假如他有一段代码咱们抠出来要看他是否是有指纹计算,咱们能够这样写浏览器
window = {}; window = new Proxy(window, { get: function(target, key, receiver) { console.log(target, key, receiver); return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } }); navigator= {}; navigator= new Proxy(navigator, { get: function(target, key, receiver) { console.log(target, key, receiver); return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } });
咱们伪造window对象而后它里面只要是基于window的操做咱们都会拦截下来,而后处理,看到这里你们都明白了,可是咱们开个脑洞基于这个proxy的更有趣的玩法,既然他能拦截全部操做,那咱们就能够基于这个伪造一个真实的浏览器环境,不过实现起来工做量那就不小了,只能是缺啥补啥。ide