微信公众号登录密码pwd参数加密详解
前言
此参数的加密没有任何难度,适合小白练手学习。
网址:https://mp.weixin.qq.com/
一、打开浏览器开始抓包
输入错误的账号密码,登录。然后找到login字眼的发送包,可以看到密码pwd参数被加密了,我们要找到加密这个字符串的js方法
二、通过搜索定位方法,快速找到关键位置
底部搜索栏输入关键参数,搜索到js文件,点击后定位到目标js文件,格式化代码,然后在代码也继续搜索关键参数,可以看到以下代码
pwd: c(n.pwd.substr(0, 16)),
这里就是pwd的赋值地方了。很显然是调用了c方法,我们在这行打上断点,重新点击登录,断点就会断到这个位置,然后进入c方法,查看
三、找到关键加密位置,扣下代码,分析代码,自己构造然后运行
可以直接定位到这个方法,传入密码t参数,返回结果,那么在return这行打上断点,点击运行到下一个断点。此时就会运行到当前return断点的位置,就可以看到各参数和方法的内容了,分析return代码
return e ? n ? a(e, t) : o(a(e, t)) : n ? r(t) : o(r(t))
很明显就是嵌套的三元表达式,简单拆分下就能看明白了
e ?
n ? a(e, t) : o(a(e, t))
:
n ? r(t) : o(r(t))
判断e的值,e为undefined,所以跳到第二个,然后判断n的值,n也是undefined,所以密码加密的关键代码就是o(r(t)) 调用了两个方法。
然后往上翻代码或者点击r方法就可以看到加密的位置了,
复制相关的加密代码到js调试工具,
然后自己构造个方法,返回结果就可以了
全部代码如下:
function f(t, e) {
var n = (65535 & t) + (65535 & e);
return (t >> 16) + (e >> 16) + (n >> 16) << 16 | 65535 & n
}
function s(t, e, n, o, i, r) {
return f((a = f(f(e, t), f(o, r))) << (s = i) | a >>> 32 - s, n);
var a, s
}
function d(t, e, n, o, i, r, a) {
return s(e & n | ~e & o, t, e, i, r, a)
}
function p(t, e, n, o, i, r, a) {
return s(e & o | n & ~o, t, e, i, r, a)
}
function m(t, e, n, o, i, r, a) {
return s(e ^ n ^ o, t, e, i, r, a)
}
function h(t, e, n, o, i, r, a) {
return s(n ^ (e | ~o), t, e, i, r, a)
}
function c(t, e) {
t[e >> 5] |= 128 << e % 32,
t[14 + (e + 64 >>> 9 << 4)] = e;
var n, o, i, r, a, s = 1732584193,
c = -271733879