http://www.perlmonks.org?node_id=442774

After seeing how easily jdalbec deobfuscated my last piece of obfuscated code, I decided to present you with yet another challenge...

#!/usr/bin/perl open(eval STDIN,$0);$==@ARGV=<> ;@ h=split//,shift;$-=@ARGV;{local$"= 't';($b="@{[@h[3,4]]}")=~y~st~ts~; }$h=ucfirst join'',@h[-5..-2],$ "; &39;$ b=$h[0].$ b.$ ";print $b;@h= split//,shift;@_=map{lc}@h[$=-3**2 ,$=%($-/3)+2,2**4-$=,(1x2)x2,2,@h- 10,3**(@h%3)];print@_[0..3],'h',@_ [5..@ARGV/2],$h,h;$h=~s/^.//; $h=~ s/...$//;@ h=@h[0..(((length$ARGV[ 6])-5)/2)];&{-14}&&print$h[0];&14; print map lc,@h[&1+6,6*2+&1];print $h,$h[1];print@h[&{-2}+1];$ARGV[0] ;sub AUTOLOAD{(($a=$ AUTOLOAD))=~s s.*::sss;$_=chr($a+ord$_)for@h;$a}

Not too hard to deobfuscate, but harder than the previous one, I'd hope... If you don't agree, try using Perl::Tidy on it and running it again... ;-) You'll see what I mean O:-)

Nevertheless, it's not that complicated in the end :-)

Replies are listed 'Best First'.
Re: Code eating code
by jdalbec (Deacon) on Mar 29, 2005 at 04:22 UTC
    Actually I thought STDOUT of here was quite challenging and educational. Perhaps I made my analysis a bit too tidy. Some of the insights I had into your program were things I really hadn't considered before. I'm afraid I have to disagree with you on Code eating code. Your Perl::Tidy suggestion was kind of a tip-off about what you're doing. Tidying does break the code, but...
      Your Perl::Tidy suggestion was kind of a tip-off about what you're doing.

      That was on purpose. Given that the first line of code started with open(eval STDIN,$0);, I figured that there was no point hiding what was going on :-)

      Anyway, only after I posted it did I realize it would only take a copy of the original file and a substitution of $0 by the copy name in order for it to still work :-) duh! :-)