2

假设我有一些字符串,我想使用函数“replace”(忽略你头脑中的 console.log 和白色字符)

console.log( 
    "truefalse"["replace"]("true") 
)

我想使用jsfuck(更多信息here)减少此代码的使用字符,我手动执行如下操作(忽略日志、评论、白字符、新行)

console.log(
    // "truefalse"[
    ([]+!![]+![])[

    // long 'replace' word:
    []+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]

    // ]("true") 
    ]([]+!![])
);

如您所见,我将第一个代码转换为仅使用 6 个字符的代码:[]{}!+(这是 jsfuck 的想法)

问题:可以用 2 个参数调用函数替换 - 像这样:"truefalse"["replace"]("true","1")并在 JSF 中以类似的方式编写它(没有任何将字符串解释为代码的“eval”)?我有/看到逗号分隔参数的问题...... :(

PS:我提供了指向我的 jsfuck 分支的链接(它是最新的 - 并且产生的输出比 jsfuck.com 旧站点小得多)

4

2 回答 2

3

您可以通过玩 2 个参数给一个函数Array.prototype.reduce

这个想法是调用reduce一个具有 2 个值的数组,并且只向它传递一个参数(回调)(即没有用于减少起始值的参数)。这样,该数组的第一个和第二个值将作为回调的参数,该回调只会被调用一次。

在您的示例中,具有 2 个值的数组必须是:

["true", "1"]

可以使用以下方法形成concat

["true"]["concat"]("1")

然后调用reduce它,并replace作为回调函数传递:

["true"]["concat"]("1")["reduce"]("truefalse"["replace"])

现在唯一要解决的问题是确保使用正确的this绑定调用回调,因为“truefalse”现在在回调调用的实际调用中不起作用。我们可以通过调用来解决这个问题.bind

所以要评估的表达式是这个

console.log(
    ["true"]["concat"]("1")["reduce"](""["replace"]["bind"]("truefalse"))
);

于 2020-08-26T17:48:22.170 回答
1

问题2有一个简单的解决方案:首选new RegExp构造函数;例如/e/g变成new RegExp('e', 'g');

如果它不依赖于...运营商,以下将解决问题 1:

我们可以替换:

console.log('a', 'b', 'c');

和:

console.log(...[ 'a' ].concat([ 'b' ]).concat([ 'c' ]));

Using.concat允许我们在不使用逗号的情况下将值组合在一起。

我几乎要说如果不将字符串解释为 js 代码,就无法正确解决问题 1(编辑:被 trincot 驳斥!):

  • 参数需要保存在数组中(不能使用直接参数,因为它们总是需要逗号;数组是唯一可以转换为参数的数据类型)
  • 您需要使用Function.prototype.apply才能使用 Array 参数
  • Function.prototype.apply总是需要使用逗号,将this值与参数数组分开
  • 避免多个参数的唯一方法Function.prototype.apply是应用某种形式的柯里化
  • 所有的咖喱将由Function.prototype.(apply|bind|call)
  • 所有这三种柯里化方法都需要多个参数,因此需要逗号!
于 2020-08-26T16:19:17.303 回答