【首发】小李:“有没有特别简单的Python解密rsa的案例?ppdai站点登录参数加密解析,最短的文章,最棒的案例 com

299 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

📢 你正在阅读 【梦想橡皮擦】 的博客

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

本篇博客选择的案例是由 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 代码位置。

⛳️ Python反爬实战场景

本篇博客的目标案例是某贷登录,也是我们爬虫逆向登录篇的最后一篇,目标站点如下所示:

# Base64 编码
aHR0cHM6Ly9hY2NvdW50LnBwZGFpLmNvbS9wYy9sb2dpbg==

使用开发者工具测试之后捕获了2个请求,其中存在一个预检,忽略该内容。 在这里插入图片描述 点击上图第二个 securityWeb,获取请求参数,可以初步猜测加密方法。 在这里插入图片描述 复制关键字 pwdLoginService/securityWeb,添加 XHR 断点,再次点击登录按钮。

结局是通过XHR 断点,并未捕获到参数加密位置。

既然无法通过断点直接调试,那我们可以直接尝试检索 password,查看是否可以定位到源码部分。

由于代码已经进行了格式化,所以直接获取到了加密参数逻辑

在这里插入图片描述 添加断点之后,多次尝试,发现登录操作无法进入断点,上翻代码之后,才注意到断点添加到了注册逻辑中。下图箭头位置可以明显看到注册英文。 在这里插入图片描述 但该位置也让我们发现了加密函数,即 e.$encrypt.encrypt,后续我们只需要跟进这个函数的实现,就可以知道加密逻辑所在。

在该文件中检索上述关键字,结果登录的加密逻辑竟然在数据验证中。 在这里插入图片描述 其中 md5 加密没有太大的难度,那接下来就是 encrypt 的扣取了,既然是解密登录的最后一篇博客了,下面为大家详细的解释每一步调试逻辑以及扣取代码的过程。

⛳️ 实战扣代码

这里带给大家我的小技巧,JS全文加载,然后进行删除。 当我们找到对应的JS文件之后,直接复制到本地,创建一个HTML文件,例如下述内容。

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="jencrypt.js"></script>
	<script>
		o = new JSEncrypt();
		console.log(o);
	</script>
</head>
<body>

</body>
</html>

在原站点中找到实例化对象的代码,即上述内容中的 new JSEncrypt(),然后测试是否可以正常运行。 当得到下述结果时,任务就基本完成了。 在这里插入图片描述 下面对代码进行删除,先记录一下代码行数,作为优化参考,默认 13313 行代码。 在这里插入图片描述 接下来找到 VUE 代码部分,直接进行删除。 在这里插入图片描述 删除 es6 兼容部分代码。 在这里插入图片描述 下面继续删除 function 内部的代码,每次删除都测试一下加密对象是否正常加载。

下图是部分 function 删除之后的效果

在这里插入图片描述 测试结果图 在这里插入图片描述 简单进行一下精简,目前剩余 不足5000行。 在这里插入图片描述

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