小李:“有没有特别简单的Python解密rsa的案例?”“还真有” Y27

举报
梦想橡皮擦 发表于 2022/04/30 21:35:43 2022/04/30
【摘要】 ⛳️ 本次反反爬实战案例背景本篇博客选择的案例是由VX好友提出,他希望有一篇博客能简单的介绍清楚下面这个问题。快速定位加密参数逻辑,快速扣取JS,使用JS文件在Python中复现逻辑。为此我翻找了一下橡皮擦的历史案例库(还没有写过的站点),发现如下一个目标站点,当乐。一看就是一个老平台了,看人家域名 d.cn。通过点击登录按钮,定位到如下数据请求。可以看到其请求方式是 GET,相关参数都在...

⛳️ 本次反反爬实战案例背景

本篇博客选择的案例是由VX好友提出,他希望有一篇博客能简单的介绍清楚下面这个问题。

快速定位加密参数逻辑,快速扣取JS,使用JS文件在Python中复现逻辑。

为此我翻找了一下橡皮擦的历史案例库(还没有写过的站点),发现如下一个目标站点,当乐

一看就是一个老平台了,看人家域名 d.cn

通过点击登录按钮,定位到如下数据请求。

可以看到其请求方式是 GET,相关参数都在 URL 中进行了加密。

进行简单的定位之后,找到加密逻辑所在位置。

堆栈里面找到如下函数名 pwdFormLogin,点击进入代码逻辑处。

在代码段中找到了加密位置,其代码如下所示:

rsaPwd = rsa(passwordVal);

⛳️ JS代码扣取

进入到 rsa() 函数内部,找到如下代码:

  //密码加密
  var rsa = function (arg) {
      setMaxDigits(130);
      var PublicExponent = "10001";
      var modulus = "be44aec4d73408f6b60e6fe9e3dc55d0e1dc53a1e171e071b547e2e8e0b7da01c56e8c9bcf0521568eb111adccef4e40124b76e33e7ad75607c227af8f8e0b759c30ef283be8ab17a84b19a051df5f94c07e6e7be5f77866376322aac944f45f3ab532bb6efc70c1efa524d821d16cafb580c5a901f0defddea3692a4e68e6cd";
      var key = new RSAKeyPair(PublicExponent, "", modulus);
      return encryptedString(key, arg);
  };

打开JS工具箱,复制本段代码,然后进行补齐。上述代码仅包含 rsa 部分,RSAKeyPair 对象所在的代码不存在,需要补齐。

优先扣取 rsa 函数所在代码文件,可以假设一个网页不断进行测试,缺少哪个函数,就扣取对应JS文件,最终该案例得到如下结果。

  • RSA.js 文件包含核心加密逻辑
  • BigInt.js 文件包含数字处理函数,例如 setMaxDigits(130) 就在其中;
  • Barrett.js 文件包含了 RSAKeyPair 调用的部分文件,例如 BarrettMu
    在这里插入图片描述
    将上述所有内容组合成一个独立的JS文件,这里我们将该文件存放到 gitcode 中,大家可以进行获取。

登录加密逻辑.js

所有的JS都在本地整理完毕,后续就可以通过 Python 去调用该JS实现解密逻辑。

import execjs

js_file = ""
with open('当乐网登录JS加密.js','r') as f:
    js_file = f.read()

js_run = execjs.compile(js_file)
rsa_text = js_run.call('rsa','123456')
print(rsa_text)

运行代码输出如下结果,本地与目标站点生成一致,问题解决。

⛳️ 总结

本次案例为大家演示的是全文扣取JS加密代码,并在本地构建单一JS文件,由于加密逻辑比较简单,所以大家注意实操的流程,可以将注意力放在定位JS代码位置。

📣📣📣📣📣📣
右下角有个大拇指,点赞的漂亮加倍

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。