Groovy 混淆的乐趣

作者:Paul King
发布时间:2022-12-08 12:40AM


今天早上我的 Twitter feed 上出现了一条有趣的推文

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++)

停止 现在就阅读并自己尝试一下... 或者浏览 可能的来源

剧透警告 好吧,如果你没有停止,我想向下滚动看看它打印了什么以及如何创建自己的混淆脚本仍然可以接受...

 
 
 
 
 
 
 
 
                                               ↓

 
 
 
 
 
 
 
 
                                               ↓

 
 
 
 
 
 
 
 
                                               ↓

 
 
 
 
 
 
 
 

让我们 Groovify 回复 来自 Alexey Nikitin 使用 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)

这将生成脚本,打印它,然后运行它以确保它产生了我们想要的结果。它与上面的唯一区别是,它没有打印出每个字符,而是构建并返回一个字符串,以便我们可以断言我们的期望。它比通过其他方法捕获 stdout 更简单。

享受!