Obfuscation: Difference between revisions
DonStewart (talk | contribs) (A page on obfuscating Haskell code) |
DonStewart (talk | contribs) (Found results for 1993 bottomth hocc) |
||
Line 4: | Line 4: | ||
obfuscation. There have been three Haskell obfuscation contests: | obfuscation. There have been three Haskell obfuscation contests: | ||
* | * [http://www.haskell.org/pipermail/haskell/2004-August/014387.html Bottomth Obfuscation Haskell Contest] | ||
* [http://www.scannedinavian.org/iohcc/zeroth-2003/ Zeroth Haskell | * [http://www.scannedinavian.org/iohcc/zeroth-2003/ 2003 Zeroth Obfuscated Haskell Contest] | ||
* [http://www.scannedinavian.org/iohcc/succzeroth-2004/ Succ Zeroth | * [http://www.scannedinavian.org/iohcc/succzeroth-2004/ 2004 Succ Zeroth Obfuscated Haskell Contest] | ||
The ability to use symbols for identifiers helps a lot of course, as | The ability to use symbols for identifiers helps a lot of course, as | ||
does suspending the use of layout. Point-free style is also an excellent | does suspending the use of layout. Point-free style is also an excellent | ||
help. Finally, Haskell's clean semantics makes refactoring code | help. Use of strange monads and type trickery can all be very confusing. | ||
Finally, Haskell's clean semantics makes refactoring code | |||
(semi-)mechanical, leading to some interesting obfuscated encodings (one | (semi-)mechanical, leading to some interesting obfuscated encodings (one | ||
can rewrite all keywords with lambda abstractions for example). | can rewrite all keywords with lambda abstractions for example). |
Revision as of 09:02, 16 February 2006
Obfuscation
Haskell is (perhaps surprisingly) an excellent language for code obfuscation. There have been three Haskell obfuscation contests:
* Bottomth Obfuscation Haskell Contest * 2003 Zeroth Obfuscated Haskell Contest * 2004 Succ Zeroth Obfuscated Haskell Contest
The ability to use symbols for identifiers helps a lot of course, as does suspending the use of layout. Point-free style is also an excellent help. Use of strange monads and type trickery can all be very confusing. Finally, Haskell's clean semantics makes refactoring code (semi-)mechanical, leading to some interesting obfuscated encodings (one can rewrite all keywords with lambda abstractions for example).
Example
The following illustrates how, by turning off layout, rewriting keywords (let, case, where) as lambdas, and using symbols for identifiers (in this case multiple '?' characters), Haskell may be highly obfuscated.
-------------------------------------------- module Main where{import List;import System; import Data.HashTable as H;(???????)=(concat );(??????)(???)(????)=((groupBy)(???)(????)) ;(??????????????????????)(????)=((?????????? )((tail).(???????))((????????????????????)(( ??????)(?????????????????????)(????))));(??) =([' ']);(??????????????)=((hashString));(?) =((>>=));(???????????????????????)([((???)), (????)])=((?????????????)(???))?(\(?????)->( (????????????????)(==)(??????????????))?(\(( ???))->((??????????????????)(??????????????? )(???)(?????))>>((?????????????????)(???))?( \((?????))->((((???????????????????)((????)) ((??????????????????????))((?????))))))));(( ???????????????????????))(??)=(????????????) ("usage f dic out");(?????????????????????)( (???),(??????))((????),(???????????????????? ))=((???)==(????));(?????????????????)(???)= (toList)(???);(????????????????????)(????)=( ((??????????)(((??????????)(snd)))((????)))) ;(??????????????????)(???????????????)(???)( (?????))=(((mapM)(((???????????????)(???)))( (lines)(?????))));(???????????????????)(???? )(???????????????????????)(?????)=(????????? )(????)((unlines)((???????????????????????)( ?????)));(????????????????)(???)((????))=((( new)(???)(????)));(main)=((???????????)?(((\ (???)->((???????????????????????)(???)))))); (???????????????)(???)(????)=((????????)(??? )((sort)(????))((??)++(????)));(???????????) =(getArgs);(????????????)(???)=((((print))(( ???))));(??????????)(???)(????)=(((map)(???) (????)));(????????)((???))(????)(?????)=(((( H.insert))((???))(????)(?????)));(?????????) ((???))((????))=(((writeFile)(???)((????)))) ;(?????????????)(???)=(((readFile)((???))))} --------------------------------------------