简单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那个请求下篇再写(捂脸)
上一篇: MarkDown基础语法