Javascript评估-混淆?

Javascript评估-混淆?,javascript,binary,obfuscation,Javascript,Binary,Obfuscation,我遇到了一些评估代码: eval('[+!+[]+!+[]+!+[]+!+[]+!+[]]'); 此代码等于整数5 这种东西叫什么?我试着在网上搜索,但我似乎不知道这是指什么。我觉得这很有趣,想知道从哪里/如何学习如何打印不同的东西,而不仅仅是整数5。字母、符号等。由于我无法在代码中锁定模式,因此我成功地从中提取并添加到其中以产生不同的结果 这是某种类型的混淆吗 要获取值为5,表达式应如下所示 +[!+[] + !+[] + !+[] + !+[] + !+[]] +[true + true

我遇到了一些评估代码:

eval('[+!+[]+!+[]+!+[]+!+[]+!+[]]');
此代码等于整数5

这种东西叫什么?我试着在网上搜索,但我似乎不知道这是指什么。我觉得这很有趣,想知道从哪里/如何学习如何打印不同的东西,而不仅仅是整数5。字母、符号等。由于我无法在代码中锁定模式,因此我成功地从中提取并添加到其中以产生不同的结果


这是某种类型的混淆吗

要获取值为
5
,表达式应如下所示

+[!+[] + !+[] + !+[] + !+[] + !+[]]
+[true + true + true + true + true]
让我们先分析一下共同的因素<代码>+[]

  • JavaScript中的空数组文本被视为Falsy

  • +
    运算符应用于数组文字,将尝试将其转换为数字,由于它为空,JavaScript将对其求值为0

  • 运算符将
    0
    转换为
    true

  • 所以

    将打印
    true
    。现在,表达式可以这样简化

    +[!+[] + !+[] + !+[] + !+[] + !+[]]
    
    +[true + true + true + true + true]
    
    由于
    true
    在算术表达式中被视为
    1
    ,因此实际表达式变为

    +[ 5 ]
    

    +
    运算符尝试将数组(
    [5]
    )转换为数字,结果是5。这就是为什么你得到了
    5

    除了“滥用eval()”之外,我不知道还有什么术语可以用来描述这种类型的代码

    我觉得这很有意思,想知道在哪里/怎么做 学习如何打印不同的内容,而不仅仅是整数5。 字母,符号等等,因为我不能在上面画一个图案 我成功地从中提取并添加代码,使其与众不同 结果

    这部分我至少可以部分回答。粘贴的eval()很大程度上依赖于Javascript奇怪的类型强制规则。网上有很多页面描述了强制规则的各种奇怪后果,你可以很容易地搜索到。但是我找不到任何关于类型强制的参考,其具体目标是从eval()之类的东西中获得“令人惊讶的”输出,除非您计算(Javascript部分从1:20开始)。他们中的大多数人关注于如何避免代码中的奇怪错误,这是可以理解的。就你而言,我相信我所知道的最有用的事情是:

    • 这个!运算符将任何内容转换为布尔值
    • 一元+运算符将任何内容转换为数字
    • 在添加或连接参数之前,binary+运算符将其参数强制为数字或字符串。通常,只有当一个或另一个参数已经是字符串时,它才会与字符串一起使用,但也有例外
    • 位运算符输出整数,与输入无关
    • 转换成数字很复杂。布尔值将变为0或1。字符串将尝试使用parseInt(),如果失败,则生成NaN。剩下的我都忘了
    • 将对象转换为字符串或数字将分别调用其“toString”或“toValue”方法(如果存在)
    你明白了。Fourtheye的答案将详细介绍这些规则如何应用于您给出的示例。我甚至不打算总结涉及日期、函数和正则表达式时会发生什么

    这是某种类型的混淆吗


    通常情况下,作为缩小的一部分,您只需免费获得模糊处理,因此我不知道为什么有人会在实际生产代码中编写模糊处理(假设您是在那里找到的)。

    这被称为非字母数字JavaScript,这是可能的,因为JavaScript类型强制功能。实际上,有一些方法可以调用eval/Function而不必使用字母字符:

    []["filter"]["constructor"]('[+!+[]+!+[]+!+[]+!+[]+!+[]]')()
    
    将字符串“filter”和“constructor”替换为非字母数字表示后,就有了完整的非字母数字JavaScript

    如果你想玩这个,有一个网站,你可以这样做:

    请勾选此项,以获取更多类似以下的示例:

    'a':   '(false+"")[1]',
    'b':   '(Function("return{}")()+"")[2]',
    'c':   '([]["filter"]+"")[3]',
    ...
    

    撇开eval()不谈,这种类型的混淆称为非字母数字混淆。 要完全非字母数字,eval必须由数组构造函数原型函数和下标表示法执行:

    []["sort"]["constructor"]("string to be evaled");
    
    然后将这些字符串转换为非字母数字形式

    好吧,它是由细川优介在2009年左右首次提出的。 如果您想查看它的运行情况,请参阅此工具:

    它不被认为是一种好的混淆类型,因为它很容易返回到原始源代码,甚至不必(静态地)运行代码。另外,它极大地增加了文件大小

    但这是一种有趣的混淆形式,探索JavaScript类型强制。要了解更多信息,我推荐本演示文稿,幻灯片33:

    @thefourtheye好的,我站在更正处:-)我熟悉那种语言(就像我所看到/读到的那样熟悉)。这个eval代码是专门为Javascript编写的。除非我弄错了,而且很可能是我弄错了,否则Javascript和brainf***没有任何关系。Brainf***是一种除了娱乐之外没有任何实际用途的深奥语言。虽然在这种情况下,这个评估对我来说也是纯粹的娱乐。也许还有一点知识。问题是这项技术叫什么(如果有的话),而不是它如何工作或为什么工作。是的,但还是有帮助的。我不认为这是真的。。虽然我认为有某种方法来安排事情,以获得数字5。或者任何数字。问题是如何获得其他整数、字母和符号。这很有帮助。由于不知道它叫什么,或者它的真正含义,所以很难搜索和找到哪怕是很近的东西。我不记得在哪里找到的。但我发现了这个网站:他的评估代码打印了他的名字。我也不明白为什么这会被用于生产。