混淆的 Groovy™ 乐趣
作者: Paul King
发布时间:2022-12-08 12:40AM
今天早上我的动态中出现了一条有趣的推文
当然,它在 Groovy 中打印出相同的内容
char p(int i) {
(char) (72.5
+ i * (17488.589319014318
+ i * (-54923.96120078333
+ i * (72666.96791801952
+ i * (-54398.97479321991
+ i * (25980.955221285272
+ i * (-8426.37914599868
+ i * (1921.5090334614745
+ i * (-313.59919165032926
+ i * (36.799215753141524
+ i * (-3.0787816564704586
+ i * (0.17913536718875267
+ i * (-0.0068850803421115925
+ i * (1.5709912194287188E-4
+ i * (-1.6109400409995646E-6
)))))))))))))))
}
var i = 0
while (p(i)) print p(i++)
现在停止阅读并自己尝试一下……或者浏览可能的来源
剧透警告 好的,如果你没有停下来,我想继续往下滚动看看它打印出什么以及如何自己创建一个混淆脚本仍然可以……
↓
↓
↓
让我们将 Alexey Nikitin 的回复 Groovify,它使用 Apache Commons Math 来重现问题
@Grab('org.apache.commons:commons-math3:3.6.1')
import org.apache.commons.math3.analysis.interpolation.NevilleInterpolator
var text = 'Hello, world!\n'
var size = text.size()
var x = new double[size + 1]
var y = new double[size + 1]
for(i in 0..<size) {
x[i] = i
y[i] = (int) text[i]
}
x[size] = size
y[size] = 0
var lines = []
var interpolator = new NevilleInterpolator()
var function = interpolator.interpolate(x, y)
var coeff = function.coefficients
lines << 'char p(int i) {'
lines << " (char) (${coeff[0]} + 0.5"
for(i in 1..<coeff.length) {
lines << ' + i * (' + coeff[i]
}
lines << ' ' + ')' * coeff.length
lines << '''}
var i = 0
var out = ''
while(p(i)) out += p(i++)
out
'''
var script = lines.join('\n')
println script
assert text == Eval.me(script)
这会生成脚本,将其打印出来,然后运行它以确保它生成我们想要的结果。它与上面的区别在于,它不是打印出每个字符,而是构建并返回一个字符串,以便我们可以断言我们的预期。这比通过其他方式捕获标准输出更简单。
享受吧!