欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-22 16:56:03
...

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

2020.04.15

易某盾滑块(不含轨迹)

目标

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

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

目标网站在此

分析请求

进入页面后打开调试面板,刷新页面找到这个请求
简单js加密反爬的处理思路 part3
可以看到,这个请求返回了滑块相关信息和一个后面要用的token

然后滑动滑块,找到这个请求
简单js加密反爬的处理思路 part3
这个请求返回的validate就是滑动成功后的参数了

分析第一个请求参数

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

这里当时卡住我了,想着替换js,但是公司电脑没装reres,用fiddler替换有点麻烦,所以到处找,结果在cookie里找到了(一点点运气)
简单js加密反爬的处理思路 part3
既然在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有值为止,此时堆栈信息如下。
简单js加密反爬的处理思路 part3
往上找到W函数,发现W函数每次执行的时候,cookie里的gdxidpyhxdE都会改变,看来只要实现W函数就行了,接下来就是扣代码,fp完整扣下来大概900多行。
cb这个参数就是完全扣js了,完整的扣下来大概有300来行。

需要看一步一步扣js的话,留言 我下一篇写。
获取token的结果:
简单js加密反爬的处理思路 part3
简单js加密反爬的处理思路 part3
check那个请求下篇再写(捂脸)