该系列文章仅限于某验滑块研究,不会公开具体算法源码,欢迎讨论
本文关联文章:
纵观
入微
芥子
浩瀚
一. 函数c.guid()
跟进c函数得到其定义ok,353行,这有点熟悉啊,和那个pow_msg的生成一样的
var g = function() {
function e() {
return (65536 * (1 + Math["random"]()) | 0)["toString"](16)["substring"](1);
}
return function() {
return e() + e() + e() + e();
}
;
}();
二. 函数_.encrypt()
跟进.default.encrypt函数
跟进函数可以看到其定义了setPublic
扣下来的js代码太长,这里就不粘贴了,各位自己扣下,或者用其他语言实现下,作者用的是python的Crypto库
如果你用Crypto库实现的话,有个坑注意下,rsa加密完的数据应该转换成hex码
三. 函数i.encrypt()
跟进i.default.encrypt函数,结合上下文代码看到有iv、mode、CBC、pad、pkcs7、AES等诸多元素,猜测其为AES-CBC模式加密,pkcs7模式填充,偏移iv这里也是js代码太长,作者用的还是Crypto库,很牛逼,连填充方式都有
这里同样有个坑,aes加密完的数据如果转化成hex码就等于把接下来的第四步也完成了
四. 函数c.arrayToHex()
同样的方法跟进去把代码扣下来
t["arrayToHex"] = function w(e) {
for (var t = [], s = 0, n = 0; n < 2 * e["length"]; n += 2)
t[n >>> 3] |= parseInt(e[s], 10) << 24 - n % 8 * 4,
s++;
for (var a = [], o = 0; o < e["length"]; o++) {
var r = t[o >>> 2] >>> 24 - o % 4 * 8 & 255;
a["push"]((r >>> 4)["toString"](16)),
a["push"]((15 & r)["toString"](16));
}
return a["join"]("");
}
五. 结语
到这里我们就分析完了该验证码所有流程,把每阶段的代码组合封装下,就OK了,上一下运行结果图,平均通过率95%左右