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

举报
梦想橡皮擦 发表于 2022/04/28 10:15:08 2022/04/28
【摘要】 📢📢📢📢📢📢💗 你正在阅读 【梦想橡皮擦】 的博客👍 阅读完毕,可以点点小手赞一下 ⛳️ 实战场景本篇博客我们继续围绕登录加密进行学习,本次要时间的站点是如下所示,可以看图猜站点。是否猜到公众平台号了~小日子越来越刑了目标站点如下所示,使用了 URL 加密https%3A%2F%2Fmp.weixin.qq.com%2F登录加密的逻辑,可以直接使用一个测试账号即可(本案例不实...

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下

⛳️ 实战场景

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

是否猜到公众平台号了~

小日子越来越刑了

目标站点如下所示,使用了 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 文件,在本地加载复盘。

📣📣📣📣📣📣
右下角有个大拇指

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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