写点什么

Python 爬虫挺刑的,去 VX 公众某位置,平台登录加密参数扣取

作者:梦想橡皮擦
  • 2022 年 7 月 14 日
  • 本文字数:1369 字

    阅读完需:约 4 分钟

⛳️ 实战场景

本篇博客我们继续围绕登录加密进行学习,本次要时间的站点是如下所示,可以看图猜站点。


是否猜到公众平台号了~

小日子越来越刑了


目标站点如下所示,使用了 URL 加密


https%3A%2F%2Fmp.weixin.qq.com%2F
复制代码


登录加密的逻辑,可以直接使用一个测试账号即可(本案例不实现登录之后的扫码验证,那是另一套反爬逻辑了)


添加断点的方式,截止到今天我们学习了三种:


  1. 寻找 DOM 元素的事件绑定;

  2. 通过关键字添加 XHR 断点;

  3. 直接在启动器中点击 JS 文件。


本次选择启动器中点击 JS 文件添加断点的形式,在开发者工具中捕获登录的网络请求,点击下图中的 loginpage.js 文件。



在格式化之后的代码中添加断点。



通过堆栈的调用关系,可以快速定位到参数加密位置,如下所示:



其中 pwd 所在行就是参数的加密位置,直接添加断点,同时两个函数前的箭头也点亮。



其中 substr() 函数是 JS 中截取字符串操作,可以通过下述代码进行测试。


"1234567890qwertasdfgabvczasswrd".substr(0, 16);
复制代码



然后随着代码进入 f() 函数,其内部代码如下所示:


n.exports = function (e, t, n) {  return t ? (n ? i(t, e) : o(i(t, e))) : n ? r(e) : o(r(e));};
复制代码


这段逻辑在 JS 中还挺有意思,因为其中 tn 传递的都是 undefined,所以我们删减一下逻辑。


使用括号区分


t ? (n ? i(t, e) : o(i(t, e))) : n ? r(e) : o(r(e));
复制代码


因为 tn 都是 undefined,所以最终的结果是 o(r(e)),其中的 e 是原密码字符串。


继续调试代码,进入 r() 函数,得到如下代码:


function r(e) {  return c(s(u((e = d(e))), 8 * e.length));}
复制代码


在依次提取该函数引用的其它函数。


function d(e) {   return unescape(encodeURIComponent(e))}function u(e) {    var t, n = [];    for (n[(e.length >> 2) - 1] = void 0,    t = 0; t < n.length; t += 1)        n[t] = 0;    for (t = 0; t < 8 * e.length; t += 8)        n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;    return n}function s(e, t) {  e[t >> 5] |= 128 << t % 32,  e[14 + (t + 64 >>> 9 << 4)] = t;  for (var n, o, r, d, i = 1732584193, s = -271733879, a = -1732584194, c = 271733878, u = 0; u < e.length; u += 16)     i = l(n = i, o = s, r = a, d = c, e[u], 7, -680876936),     c = l(c, i, s, a, e[u + 1], 12, -389564586),     a = l(a, c, i, s, e[u + 2], 17, 606105819),     // 典型的 MD5 加密}function c(e) {   for (var t = "", n = 0; n < 32 * e.length; n += 8)       t += String.fromCharCode(e[n >> 5] >>> n % 32 & 255);   return t}
复制代码


都得到之后,接下来就是组合相关函数,改写其函数名逻辑了,这里我们可以借用一些 JS 逆向工具,例如“鬼鬼 JS 调试工具”。


反复测试之后,就能得到其核心 JS 文件


接下来的工作就非常简单了,我们通过 Python 去加载该文件,然后调用其pwd 函数。


import execjs
js_file = ''with open('mima.js', 'r') as f: js_file = f.read()
ctx = execjs.compile(js_file)
pwd = ctx.call('pwd', '123456')print(pwd)
复制代码


运行代码之后,得到最终的加密结果:



其实本案例在看到加密之后的值时,就已经猜到了是 md5 加密,本博客仅为大家展示如何扣取 JS 文件,在本地加载复盘。


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


发布于: 刚刚阅读数: 3
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python爬虫挺刑的,去VX公众某位置,平台登录加密参数扣取_Python_梦想橡皮擦_InfoQ写作社区