JS逆向:破解某视频网站登录参数生产方法

1. 前言

  • 本文的主要内容,是分析得到某视频网站账号登录时、密码参数的 JS 加密方法。

2. 抓包

  • 打开网页,右键调出调试窗口的 Network 工具;
  • 点击右上角登录按钮,弹出登录 frame 之后,切换成账号密码登录;
  • 随便输入账号(这里输入12345678@qq.com)、密码(这里输入 111111),点击登录按钮,查看网络抓包情况;
    • 注意:这里我们找到登录窗口的 url,转到此窗口可以直接访问登录窗口;
  • 打开登录页面后,调出浏览器抓包工具,随便输入账号(这里输入12345678@qq.com)、密码(这里输入 111111),点击登录按钮,再次抓包; – 注意:点击登录后弹出验证码窗口,本文不涉及验证码内容,此处忽略不用管;

    3. 分析

  • 通过分析抓包数据,发现 login 的 POST 请求中的 passwd 参数值不固定,生成方式未知;
    • 另外请注意:通过多次抓包,发现 ptiddfp 参数值是固定的;
  • 打开全局搜索,查找生成 passwd 参数的 JS 代码,并在代码位置下断点;

  • 刷线输入页面,重新输入账号、密码,点击登录按钮,发现被断下来;
  • 通过分析发现,下面这段代码是我们要查找的代码,按照下图所示,进入查看 r.rsaFun 函数代码;

  • 如下图红框所示, r.rsaFun 函数代码就是生成 passwd 参数的代码;

  • 按照前面的方法,回溯分析代码中调用的函数 getKeyPairencryptedString,发现两个函数都位于一个 js 文件下的同一个外部函数 c = function(a, b) 中;

  • 按照下图所示,首先找到我们需要的 js 代码的开始和结束位置;
    • 注意:因为 getKeyPairencryptedString 两个函数位于同一个 外部函数 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,构造请求参数; – 此处具体代码省略;