寻找登录包,发现密码进行了加密
下方搜索password=(可以变着搜索password:,password.),凭经验点击下方第二个js文件
找到加密位置,打上断点,分析代码:
分析参数,果然是加密位置。
null != a && a.password && (a.password = (0,
y.b)(a.password))
它使用了三元运算符和条件运算符。这段代码的意图是检查变量a
是否不为null
,并且a
对象中是否存在password
属性。如果这两个条件都满足,就将a.password
的值传递给一个函数y.b
,并将其结果赋值回a.password
。
不过,这段代码中有一些语法错误和可能的误解:
-
(0, y.b)(a.password)
这部分使用了逗号操作符,它通常用于执行两个表达式,并返回第二个表达式的结果。在这里,0
是第一个表达式,它没有实际作用,只是被执行,而y.b
是第二个表达式,它被当作函数调用。 -
但是,
y.b
作为函数调用时,应该确保它是一个函数。如果y.b
不是一个函数,这段代码将会导致运行时错误。 -
代码中的
null != a
是检查a
是否不是null
的正确方式,但更常见的写法是使用a != null
。 -
a.password &&
这部分是条件运算符,如果a.password
存在且为真值,它将执行后面的表达式。
说白了,就是y.b这个函数加密密码。进入这个函数,一下子就明白了是AES的加密方法。至于是不是标准AES,我们直接复制,并调用库,让GPT帮我修改一下代码。
const CryptoJS = require('crypto-js');
// 将长密码字符串转换为CryptoJS可以理解的格式
i = CryptoJS.enc.Utf8.parse("20171109124536982017110912453698");
// 将初始化向量(IV)字符串转换为CryptoJS可以理解的格式
a = CryptoJS.enc.Utf8.parse("2017110912453698");
// 定义加密函数c
const c = function(e) {
// 检查e是否为undefined
if (void 0 !== e) {
let t = e; // 保存e的值
let n = CryptoJS.enc.Utf8.parse(t); // 将e转换为CryptoJS的格式
// 使用AES算法和CBC模式加密n,使用i作为密钥,a作为IV,PKCS7作为填充方式
let encrypted = CryptoJS.AES.encrypt(n, i, {
iv: a,
mode: CryptoJS.mode.CBC, // 修正了mode的属性访问方式
padding: CryptoJS.pad.Pkcs7 // 修正了padding的属性访问方式
});
// 返回加密后的ciphertext转换为大写字符串
return encrypted.ciphertext.toString().toUpperCase();
}
// 如果e是undefined,返回空字符串
return "";
};
console.log(c('123456')) #结果是A7428361DEF118911783F446A129FFCE
说明是一个标准的AES加密。搞定完工!