🤵♂️ 个人主页:@rain雨雨编程
😄微信公众号:rain雨雨编程
✍🏻作者简介:持续分享机器学习,爬虫,数据分析
🐋 希望大家多多支持,我们一起进步!
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
本详细介绍了对“某视综”网站进行爬虫逆向分析的过程,重点关注了MD5和AES加密算法的应用。
一、数据接口分析
1. 抓包分析
-
目的:通过网络抓包工具捕获网站的数据传输过程。
-
发现:确定了网站的关键数据接口为
/rank/waiting/fans
。
2. 加密参数检查
-
请求参数加密:在请求的“载荷”部分发现了一个
sign
参数,表明存在加密。
-
请求头加密:没有发现请求头被加密。
-
响应数据加密:在“响应”部分发现数据被加密。
-
Cookie加密:没有发现Cookie被加密。
二、加密位置定位
1. sign
参数
-
启动器分析:检查启动器中的异步调用,发现无法直接定位加密位置。
-
关键字搜索:通过搜索关键字
sign=
,找到了sign
参数的生成位置,并在此打下断点。 -
断点调试:再次获取数据时,成功在断点处捕获到
sign
参数的加密过程。控制台查看加密后sign,同network(网络)处的sign对比
2. 响应数据
-
Hook
JSON.parse
:考虑到响应数据通常是JSON格式,解密后会使用JSON.parse
,因此对JSON.parse
进行Hook。
var my_parse = JSON.parse;
JSON.parse = function (params) {
debugger
console.log("json_parse params:",params);
return my_parse(params);
};
-
明文处断住 运行hook代码,再次获取数据,成功捕获到明文数据,并追踪到解密位置。
-
跟栈 通过跟栈就可以找到解密位置
-
控制台查看 通过控制台查看解密后数据data
三、JavaScript代码提取与分析
-
sign
参数加密:分析发现sign
参数使用标准的MD5加密方法,因此可以直接使用标准模块进行加密,无需提取JS代码。
进入疑似加密函数,并重新打上断点
-
响应数据解密:网站使用的是标准的AES算法进行解密,同样可以- 接使用标准模块,无需提取JS代码。
JavaScript源码分析
-
getSign
函数:用于生成sign
参数,通过将对象键排序并拼接,然后使用MD5算法生成签名。 -
get_data
函数:用于解密响应数据,使用AES算法和固定的密钥及IV进行解密。
const CryptoJS = require('crypto-js')
function getSign(e) {
delete e.sign;
for (var t = [], n = Object.keys(e).sort(), r = 0; r < n.length; r++) {
var i = n[r]
, a = e[i];
t.push(i),
t.push(a)
}
t.push("iIndex");
var s = t.join("_")
, c = CryptoJS.MD5(s).toString();
return c
}
function get_data(lastFetchTime, r) {
var i = CryptoJS.enc.Utf8.parse(lastFetchTime + "000")
, a = CryptoJS.enc.Utf8.parse(lastFetchTime + "000")
, s = CryptoJS.AES.decrypt(r.toString(), i, {
iv: a
})
return s.toString(CryptoJS.enc.Utf8);
}
文章持续跟新,可以微信搜一搜公众号 [ rain雨雨编程 ],第一时间阅读,涉及数据分析,机器学习,Java编程,爬虫,实战项目等。