1. 前言
- 本文的主要内容,是分析得到某视频网站账号登录时、密码参数的 JS 加密方法。
2. 抓包
- 打开网页,右键调出调试窗口的 Network 工具;
- 点击右上角登录按钮,弹出登录 frame 之后,切换成账号密码登录;
- 随便输入账号(这里输入12345678@qq.com)、密码(这里输入 111111),点击登录按钮,查看网络抓包情况;
- 注意:这里我们找到登录窗口的 url,转到此窗口可以直接访问登录窗口;
- 打开登录页面后,调出浏览器抓包工具,随便输入账号(这里输入12345678@qq.com)、密码(这里输入 111111),点击登录按钮,再次抓包;
– 注意:点击登录后弹出验证码窗口,本文不涉及验证码内容,此处忽略不用管;
3. 分析
- 通过分析抓包数据,发现 login 的 POST 请求中的 passwd 参数值不固定,生成方式未知;
- 另外请注意:通过多次抓包,发现 ptid、dfp 参数值是固定的;
-
打开全局搜索,查找生成 passwd 参数的 JS 代码,并在代码位置下断点;
- 刷线输入页面,重新输入账号、密码,点击登录按钮,发现被断下来;
-
通过分析发现,下面这段代码是我们要查找的代码,按照下图所示,进入查看 r.rsaFun 函数代码;
-
如下图红框所示, r.rsaFun 函数代码就是生成 passwd 参数的代码;
-
按照前面的方法,回溯分析代码中调用的函数 getKeyPair、encryptedString,发现两个函数都位于一个 js 文件下的同一个外部函数 c = function(a, b) 中;
- 按照下图所示,首先找到我们需要的 js 代码的开始和结束位置;
- 注意:因为 getKeyPair、encryptedString 两个函数位于同一个 外部函数 c = function(a, b),我们只需要把 function(a, b) 这个外部函数的代码复制出来就可以,即图中 { 和 } 中间的代码;
-
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’) 的结果值,得到的结果与调试器中的额参数值做对比,发现结果是一样的;
- 破解成功。
5. 构造爬虫
- 编辑 py 调用 js,构造请求参数; – 此处具体代码省略;