简单js加密反爬的处理思路 part3

简单js加密反爬的处理思路 part3

2020.04.15

易某盾滑块(不含轨迹)

目标

通过传入网页自己滑动的轨迹让服务器返回

{
	"data": {
		"result": true,
		"token": "9517866205544b73b4e3d950058ed798",
		"validate": "6usGEK7boS4v0+0fFAf9PoawE27H0gXCRCIOdFD6Qwdyfkg62ICc9jWBudDkk6a0BR8tdYe/MsbCrk93sPR9aOSRA0zqMFYIwK4OfUw3v/tf2azdzWh/a+4sICfjeEteA63TmPx4/Qps6bN4UJJobboCFWEY1MPAdLdUmAS3plQ="
	},
	"error": 0,
	"msg": "ok"
}

目标网站在此

分析请求

进入页面后打开调试面板,刷新页面找到这个请求
在这里插入图片描述
可以看到,这个请求返回了滑块相关信息和一个后面要用的token

然后滑动滑块,找到这个请求
在这里插入图片描述
这个请求返回的validate就是滑动成功后的参数了

分析第一个请求参数

在这里插入图片描述
看到很多参数但是只有两个参数是加密的,fp和cb,打开js,搜索fp,打上断点
在这里插入图片描述
在这里插入图片描述
刷新验证码,进入断点
在这里插入图片描述
先找fp,往上看,发现fp是e.state.fingerprint,搜索fingerprint,发现6个相关的,找到第3920行,发现fingerprint是window.gdxidpyhxde。
在这里插入图片描述
走完断点,在console输入window.gdxidpyhxde,发现有一段字符串输出,与请求里的fp对比,发现相同。接下来找window.gdxidpyhxde。

这里当时卡住我了,想着替换js,但是公司电脑没装reres,用fiddler替换有点麻烦,所以到处找,结果在cookie里找到了(一点点运气)
在这里插入图片描述
既然在cookie里 那就好办了,hook住document的cookie的set和get,这里附上github找到的一段hook代码

function breakOn(obj, propertyName, mode, func) {
    // this is directly from https://github.com/paulmillr/es6-shim
    function getPropertyDescriptor(obj, name) {
        var property = Object.getOwnPropertyDescriptor(obj, name);
        var proto = Object.getPrototypeOf(obj);
        while (property === undefined && proto !== null) {
            property = Object.getOwnPropertyDescriptor(proto, name);
            proto = Object.getPrototypeOf(proto);
        }
        return property;
    }

    function verifyNotWritable() {
        if (mode !== 'read')
            throw "This property is not writable, so only possible mode is 'read'.";
    }

    var enabled = true;
    var originalProperty = getPropertyDescriptor(obj, propertyName);
    var newProperty = { enumerable: originalProperty.enumerable };

    // write
    if (originalProperty.set) {// accessor property
        newProperty.set = function(val) {
            if(enabled && (!func || func && func(val)))
                debugger;
            
            originalProperty.set.call(this, val);
        }
    } else if (originalProperty.writable) {// value property
        newProperty.set = function(val) {
            if(enabled && (!func || func && func(val)))
                debugger;

            originalProperty.value = val;
        }
    } else  {
        verifyNotWritable();
    }

    // read
    newProperty.get = function(val) {
          if(enabled && mode === 'read' && (!func || func && func(val)))
            debugger;

        return originalProperty.get ? originalProperty.get.call(this, val) : originalProperty.value;
    }

    Object.defineProperty(obj, propertyName, newProperty);

    return {
      disable: function() {
        enabled = false;
      },

      enable: function() {
        enabled = true;
      }
    };
};

重新打开一个tab,将这段代码添加到浏览器的snippets里,保存为access。
将core.js粘贴到snippet里,保存为core,打开百度
,右键access,run,在console里输入breakOn(document,“cookie”);
右键core,run,进入断点。发现头几次设置cookie是null,F8直到设置value有值为止,此时堆栈信息如下。
在这里插入图片描述
往上找到W函数,发现W函数每次执行的时候,cookie里的gdxidpyhxdE都会改变,看来只要实现W函数就行了,接下来就是扣代码,fp完整扣下来大概900多行。
cb这个参数就是完全扣js了,完整的扣下来大概有300来行。

需要看一步一步扣js的话,留言 我下一篇写。
获取token的结果:
在这里插入图片描述
在这里插入图片描述
check那个请求下篇再写(捂脸)

2020.04.16

想了下,fp这个参数直接扣代码比较麻烦,既然它能在浏览器里完整运行,那么我们直接写一段js,然后返回window.gdxidpyhxde就行了,浏览器环境代码如下:

var window = global;
window.location = {
    href:"https://dun.163.com/trial/jigsaw",
    protocol:"https"
}
window.navigator={
    userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
document = {
    createElement:function(tag){
        return {
            getAttribute:function(attr){
                return this.attr;
            }
        }
    }
}
//这里是那个core.js
console.info(window['gdxidpyhxde'])

看下运行结果:
在这里插入图片描述
可以看到和浏览器生成的长度和结构一致。
那么同理,cb的生成可以用global.l = l;
然后在后面打印一下global.l()就行啦。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了8 篇原创文章 · 获赞 5 · 访问量 1871

猜你喜欢

转载自blog.csdn.net/weixin_42525191/article/details/105529200
今日推荐