12 comments

[ 2.1 ms ] story [ 40.3 ms ] thread
This is not a very interesting form of obfuscation, replacing each primitive of a straightforward program by some very convoluted code that evaluates to that primitive. Resulting in a huge program doing a simple thing. This kind of obfuscation can be easily automated, but so can the corresponding unobfuscation.

A more impressive form of obfuscation can be seen in the International Obfuscated C Code contest, where the straightforward program is replaced by a much shorter one that performs many ingenious tricks to achieve the same goal with a minimum of code. For example, a prime number sieve written as

    import sys
    def c(j,t):
     sys.stdout.write(j('.')('P'))
     return t
    (lambda z:lambda y:z(z(y(lambda p:lambda n:(lambda s:lambda z:z(lambda x:
    lambda y:y)(lambda d:p(s)(y(s))(d)))(lambda x:lambda a:lambda s:lambda p:
    p(a)(lambda y:s(n(x))(y))))(lambda c:lambda a:lambda s:z(lambda y:s(c)(y)
    ))))(y(lambda p:lambda b:lambda t:t(c(b,p)))))(lambda s:lambda p:p(lambda
    x:lambda y:x)(s))(lambda f:(lambda q:q(q))(lambda x:f(lambda y:x(x)(y))))
which is a Python rendition of the lambda calculus expression λ (λ 1 (1 ((λ 1 1) (λ λ λ 1 (λ λ 1) ((λ 4 4 1 ((λ 1 1) (λ 2 (1 1)))) (λ λ λ λ 1 3 (2 (6 4))))) (λ λ λ 4 (1 3))))) (λ λ 1 (λ λ 2) 2).

That kind of obfuscation takes great human effort both to achieve and to unravel.

[1] https://en.wikipedia.org/wiki/Obfuscation_(software)

Somewhat tangential, pakettic[0] is a minifier for TIC-80 cartridges (a fantasy console) that use genetic algorithms to minimise and rearrange the Lua code to compress better in sizecoded demoscene competitions.

[0] https://github.com/vsariola/pakettic

for lua, compile to luac is a cheap way to hide the source to me
I think it is pretty simple to decompile Lua bytecode
Stripping out debug info is usually good enough unless you're hiding a name check or something.

Sometimes you just don't want someone to be able to easily iterate on your script (grab a script, modify and resell)

Why do lua developers love to write code that marches towards the right edge of infinity? Love love love that it’s considered “optimized”.

There is zero reason for the embedded conditionals.

I wish we had less posts here about how to obfuscate and more about how to deobfuscate.
The techniques are the same, just in reverse order.
The Roblox community seems to be somewhat obsessed with obfuscation and of course deobfuscation. Literal script kids passing around blackbox software to hack each other and trying to hide their precious scripts. Unfortunately, that means the Lua communities constantly get bombarded by [de]obfuscation requests. It's almost always some kind of hacking/mischief.