爬虫分析常见的反爬虫的方式很多,但是比较有难度,有区分度的技术当属JS逆向分析的参数加密,或者数据加密。本篇博客记录的是博主本人在工作中实际碰到的请求参数进行了加密情况,使用的加密方式是对称加密AES的方式(不知道AES是啥也不重要,毕竟我们是做爬虫的只要将最后的结果逆向还原出来,至于深入研究如何实现应该是做密码学的该考虑的,我们可以做一些简单的学习,知道是个啥)。这里的加密是对GET请求进行的加密。详细记录本次的破解过程,毕竟时间久了就会忘的,以后也可以温故而知新。
逆向网站为化合物百科
1.打开网站进行必要的分析,进入控制台发现需要的数据是经过AJAX进行加载的。
经过分析发现详情的链接有如下图的未知参数:
看到这个参数的第一眼直觉告诉我应该是经过了加密,但是依然需要到源代码里面进行参数的搜索(有些GET参数在源码里是有的),结果也证明直觉是对的。下面开始找到该参数在js代码中的位置,并进一步的调试出它的加密方式及加密过程。
2.开始全站资源的搜索,查找参数所在js的路径位置,初步确定是在下图的红色框中。
3.进一步对网站的js文件经行分析,在Source-->Scripts-->app-->api.js文件中对参数进行分析找到加密参数的js代码,以及加密参数的请求api函数。进入JS代码一眼就看到了请求的异步加载代码:如下图所示:
4.到这里就知道了EncryptId的值参数Encrypt(id)进行加密之后使用encodeURIComponent() 函数编码之后的id值(encodeURIComponent() 函数可把字符串作为 URI 组件进行编码),对页面进行调试进入加密参数的Encrypt(id)函数,如下图:
CryptoJS是一个js加密的文件,需要拿到(使用js代码编写爬虫)
5.到这里就可以看到参数详情的加密过程了,我到这里把这部分代码拿下来,使用NodeJs进行运行(使用nodejs前请先按装必要的环境及使用库)。具体运行代码如下:
var CryptoJS = require("crypto-js");
function Encrypt(word) {
var tkey = "kingagroot2019ZX";
var tiv = "kingagroot2019ZX";
var srcs = CryptoJS.enc.Utf8.parse(word);
var key = CryptoJS.enc.Utf8.parse(tkey);
var iv = CryptoJS.enc.Utf8.parse(tiv);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
S = Encrypt(110000001)
console.log(S)
6.使用python调用执行nodejs代码(运行方式比较多,能运行出来就行),运行结果如下图:
from subprocess import check_output
def _test():
# 用 node 直接执行 js 脚本
bytesTxt = check_output(['node', 'baike.js', '110000001'], timeout=100)
print(bytesTxt.decode('utf8').strip())
if __name__ == '__main__':
_test()
加密就结果与上面的参数一致,逆向成功。如下图:
项目为原创,未经允许严禁转载!