这是深度混淆吗?无法理解它的含义

Is this deep obfuscation? Cannot understand the meaning of it

给定以下脚本:

É = -~-~[], ó = -~É, Ë = É << É, þ = Ë + ~[];
Ì = (ó - ó)[Û = ('' + {})[É + ó] + ('' + {})[ó - É] + ([].ó + '')[ó - É] + (!!'' + '')[ó] + ({} + '')[ó + ó] + (!'' + '')[ó - É] + (!'' + '')[É] + ('' + {})[É + ó] + ({} + '')[ó + ó] + ('' + {})[ó - É] + (!'' + '')[ó - É]][Û];
Ì(Ì((!'' + '')[ó - É] + (!'' + '')[ó] + (!'' + '')[ó - ó] + (!'' + '')[É] + ((!'' + ''))[ó - É] + ([].$ + '')[ó - É] + '\'' + '' + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (þ) + (É + ó) + '\' + (ó - É) + (ó + ó) + (ó - ó) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (É + ó) + (É + ó) + '\' + (ó - É) + (ó + ó) + (ó - ó) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + ó) + (ó - ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (ó - ó) + (É + ó) + '\' + (ó - É) + (É + ó) + (ó + ó) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (þ) + (É) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (É + ó) + (É + ó) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (É + É) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (ó + ó) + (ó - ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (ó + ó) + (ó) + '\' + (ó - É) + (ó + ó) + (ó) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (þ) + (ó) + '\' + (ó - É) + (É + ó) + (ó - É) + '\' + (ó - É) + (É + É) + (ó + ó) + '\' + (É + ó) + (ó - ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (þ) + (É + ó) + '\' + (þ) + (É + ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó + ó) + (ó - É) + '\' + (ó + ó) + (É) + '\' + (ó + ó) + (ó) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (ó - É) + (þ) + (ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + ó) + (ó - ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (É + É) + (É) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (ó + ó) + (ó + ó) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (þ) + (ó) + '\' + (ó - É) + (þ) + (É + ó) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (ó + ó) + (ó) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (þ) + (ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + ó) + (ó - ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (É + É) + (ó + ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (É + ó) + (ó - É) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (É + ó) + (ó + ó) + '\' + (É + ó) + (ó + ó) + '\' + (É + ó) + (ó + ó) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (þ) + (ó) + '\' + (ó - É) + (þ) + (É + ó) + '\'')())()

这显然看起来很混乱(至少对我而言),最终应该 return 或多或少是这样的:

return '1027504564252455744 5013 35\ 15161SS474S74S7S4\S131S4S24 \ 142\ 162\ 141\ 166\ 157\ 73\ 175\ 145\ 1 S4\ 163\ 145\ 173\ 141\ 154\ 145\ 162\ 164\ 146\ 141\ 1S14\ 175'

从这里开始我们就可以反转码了,但是如何从混淆码转为转码码呢?

我还没有找到适用于此类去混淆的任何在线库。曾经有一个 firefox extension 遗憾地被弃用了。浏览器可以解析并执行这段代码,显然它是有效的。我在这里要做的是将脚本转换成人类可读的内容。

这相对简单,只是乏味。首先解压顶部变量声明:

É = -~-~[], ó = -~É, Ë = É << É, þ = Ë + ~[];

这些变量分别解析为数字 237

É = 2;
ó = 3;
þ = 7;

下一部分:

Ì = (ó - ó)[Û = ('' + {})[É + ó] + ('' + {})[ó - É] + ([].ó + '')[ó - É] + (!!'' + '')[ó] + ({} + '')[ó + ó] + (!'' + '')[ó - É] + (!'' + '')[É] + ('' + {})[É + ó] + ({} + '')[ó + ó] + ('' + {})[ó - É] + (!'' + '')[ó - É]][Û];

等同于

Û = ('' + {})[É + ó] + ('' + {})[ó - É] + ([].ó + '')[ó - É] + (!!'' + '')[ó] + ({} + '')[ó + ó] + (!'' + '')[ó - É] + (!'' + '')[É] + ('' + {})[É + ó] + ({} + '')[ó + ó] + ('' + {})[ó - É] + (!'' + '')[ó - É]
Ì = (ó - ó)[Û][Û];

用它们的值替换变量,你得到:

Û = ('' + {})[2 + 3] + ('' + {})[3 - 2] + ([][3] + '')[3 - 2] + (!!'' + '')[3] + ({} + '')[3 + 3] + (!'' + '')[3 - 2] + (!'' + '')[2] + ('' + {})[2 + 3] + ({} + '')[3 + 3] + ('' + {})[3 - 2] + (!'' + '')[3 - 2]
Ì = (3 - 3)[Û][Û];

不断搜索加减运算符并将其替换为它们的计算结果,例如搜索 2 + 3 并替换为 5:

Û = ('' + {})[5] + ('' + {})[1] + ([][3] + '')[1] + (!!'' + '')[3] + ({} + '')[6] + (!'' + '')[1] + (!'' + '')[2] + ('' + {})[5] + ({} + '')[6] + ('' + {})[1] + (!'' + '')[1]

这里有一些用于生成字符串的技术:

('' + {})    -> '[object Object]'
(!!'' + '')  -> 'false'
(!'' + '')   -> 'true'
([][3] + '') -> 'undefined'

全部放在一起:

Û = '[object Object]'[5] + '[object Object]'[1] + 'undefined'[1] + 'false'[3] + ({} + '')[6] + 'true'[1] + 'true'[2] + '[object Object]'[5] + ({} + '')[6] + '[object Object]'[1] + 'true'[1]

计算结果为

Û = 'constructor'

所以

Ì = (3 - 3)[Û][Û];
// evaluates to
Ì = (0).constructor.constructor;
// which is
Ì = Function

最后一部分的计算结果为

Ì(Ì(< a bunch of stuff >)())()

幸运的是,"bunch of stuff" 根本不包含任何赋值或任何语句 - 它只不过是一个非常长的连接字符串,使用基本的混淆技术创建,但没有使用任何花哨的东西,就像Û 以上。使用与 Û 相同的技术,您将获得您在问题中发布的字符串:

return'10275045642524557445013351614747474314524221675543531452461145'

这只是一大堆字符转义。例如,1a</code> 是 <code>=0p,等等。用适当的字符替换每个,你获取字符串:

return'a=prompt('Entrez le mot de passe');if(a=='toto123lol'){alert('bravo');}else{alert('fail...');}'

传递给 Function 并执行。尝试 运行 下面的代码片段并粘贴到 toto123lol:

É = -~-~[], ó = -~É, Ë = É << É, þ = Ë + ~[];
Ì = (ó - ó)[Û = ('' + {})[É + ó] + ('' + {})[ó - É] + ([].ó + '')[ó - É] + (!!'' + '')[ó] + ({} + '')[ó + ó] + (!'' + '')[ó - É] + (!'' + '')[É] + ('' + {})[É + ó] + ({} + '')[ó + ó] + ('' + {})[ó - É] + (!'' + '')[ó - É]][Û];
Ì(Ì((!'' + '')[ó - É] + (!'' + '')[ó] + (!'' + '')[ó - ó] + (!'' + '')[É] + ((!'' + ''))[ó - É] + ([].$ + '')[ó - É] + '\'' + '' + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (þ) + (É + ó) + '\' + (ó - É) + (ó + ó) + (ó - ó) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (É + ó) + (É + ó) + '\' + (ó - É) + (ó + ó) + (ó - ó) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + ó) + (ó - ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (ó - ó) + (É + ó) + '\' + (ó - É) + (É + ó) + (ó + ó) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (þ) + (É) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (É + ó) + (É + ó) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (É + É) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (É + É) + (ó - ó) + '\' + (ó - É) + (ó + ó) + (ó - ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (ó + ó) + (ó) + '\' + (ó - É) + (ó + ó) + (ó) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (þ) + (ó) + '\' + (ó - É) + (É + ó) + (ó - É) + '\' + (ó - É) + (É + É) + (ó + ó) + '\' + (É + ó) + (ó - ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (þ) + (É + ó) + '\' + (þ) + (É + ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó + ó) + (ó - É) + '\' + (ó + ó) + (É) + '\' + (ó + ó) + (ó) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (ó - É) + (þ) + (ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + ó) + (ó - ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (É + É) + (É) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (ó + ó) + (ó + ó) + '\' + (ó - É) + (É + ó) + (þ) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (þ) + (ó) + '\' + (ó - É) + (þ) + (É + ó) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (ó + ó) + (ó) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (þ) + (ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (ó - É) + (É + É) + (É + ó) + '\' + (ó - É) + (ó + ó) + (É) + '\' + (ó - É) + (ó + ó) + (É + É) + '\' + (É + ó) + (ó - ó) + '\' + (É + É) + (þ) + '\' + (ó - É) + (É + É) + (ó + ó) + '\' + (ó - É) + (É + É) + (ó - É) + '\' + (ó - É) + (É + ó) + (ó - É) + '\' + (ó - É) + (É + ó) + (É + É) + '\' + (É + ó) + (ó + ó) + '\' + (É + ó) + (ó + ó) + '\' + (É + ó) + (ó + ó) + '\' + (É + É) + (þ) + '\' + (É + ó) + (ó - É) + '\' + (þ) + (ó) + '\' + (ó - É) + (þ) + (É + ó) + '\'')())()

每当你有一个像 "return '10275\.... 这样的字符串时,最简单的转换方法就是将它粘贴到代码编辑器中并让它计算转义符:

const str = "return'10275045642524557445013351614747474314524221675543531452461145'";

console.log(str);