1. 前言
2. 抓包
3. 分析
- 通过分析抓包数据,发现 login 的 POST 请求中的 passwd 参数值不固定,生成方式未知;
-- 另外请注意:通过多次抓包,发现 ptid、dfp 参数值是固定的;
image.png
- 打开全局搜索,查找生成 passwd 参数的 JS 代码,并在代码位置下断点;
image.png
- 刷线输入页面,重新输入账号、密码,点击登录按钮,发现被断下来;
- 通过分析发现,下面这段代码是我们要查找的代码,按照下图所示,进入查看 r.rsaFun 函数代码;
image.png
- 如下图红框所示, r.rsaFun 函数代码就是生成 passwd 参数的代码;
image.png
- 按照前面的方法,回溯分析代码中调用的函数 getKeyPair、encryptedString,发现两个函数都位于一个 js 文件下的同一个外部函数 c = function(a, b) 中;
image.png
- 按照下图所示,首先找到我们需要的 js 代码的开始和结束位置;
-- 注意:因为 getKeyPair、encryptedString 两个函数位于同一个 外部函数 c = function(a, b),我们只需要把 function(a, b) 这个外部函数的代码复制出来就可以,即图中 { 和 } 中间的代码;
image.png
image.png
-
4. 调试 JS
- 打开发条调试工具,如果没有此工具可以点击链接:https://pan.baidu.com/s/13APz4SiiY2dYCSrYfSlpNw 提取码:numa,进行下载;
- 将前面复制的代码粘贴进调试工具输入框,格式化以后加载代码;
- 加载后发现抱错 -->错误描述:'b' 未定义,于是在最前面加上代码 b = {};;
- 再次加载发现报错 -->错误描述:'a' 未定义,于是在最前面加上代码 a = {};;
- 在尾部重写 rsaFun 函数,并重新命名为 getPwd,代码如下所示;
function getPwd(e) {
var t = "ab86b6371b5318aaa1d3c9e612a9f1264f372323c8c0f19875b5fc3b3fd3afcc1e5bec527aa94bfa85bffc157e4245aebda05389a5357b75115ac94f074aefcd",
a = "10001",
n = f.getKeyPair(a, "", t),
i = f.encryptedString(n, encodeURIComponent(e)).replace(/\s/g, "-");
return i
}
- 注意:
-- 上面代码中,f.getKeyPair 对应原始代码的 Q.crypto.rsa.RSAUtils.getKeyPair;
-- 上面代码中,f.encryptedString 对应原始代码的 Q.crypto.rsa.RSAUtils.encryptedString;
- 加载代码,尝试计算 getpwd('666666') 的结果值,得到的结果与调试器中的额参数值做对比,发现结果是一样的;
image.png
5. 构造爬虫
- 编辑 py 调用 js,构造请求参数;
-- 此处具体代码省略;
网友评论