混淆的 Groovy™ 乐趣

作者: Paul King

发布时间:2022-12-08 12:40AM


今天早上我的动态中出现了一条有趣的推文

ObfuscatedJava@joshbloch

当然,它在 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)

这会生成脚本,将其打印出来,然后运行它以确保它生成我们想要的结果。它与上面的区别在于,它不是打印出每个字符,而是构建并返回一个字符串,以便我们可以断言我们的预期。这比通过其他方式捕获标准输出更简单。

享受吧!