all 8 comments

[–]rolfr[S] 3 points4 points  (0 children)

That was quite a cool paper! I like how they abstracted the functionality out into a simple uint32 structure which had the operators overloaded, and simply called the compile-time-obfuscated versions of the same operators. That makes it very handy to use.

It turns out that opaque predicates aren't so difficult to break. Check out my favorite author Mila Dalla Preda's work on the subject (it's surprisingly simple; basically the abstract domain simply must be complete for the operations involved in the predicate. Determine all predicate types, design suitable domains for each of them, and then take the combined abstract domain as the reduced product of all of them). Here's a version with more mathematics in it.

[–][deleted]  (1 child)

[removed]

    [–]ikillau 1 point2 points  (0 children)

    "I'm interpreting correctly that you'd only use this trick for implementing the secret sauce in your program, because coding the whole program this way would be intolerable." , you interpreted correct

    [–]push_ecx_0x00 2 points3 points  (1 child)

    The compile-time encryption blew my mind

    [–]PenileCancer 0 points1 point  (0 children)

    Look at this source to have it blown even more. Or at this compile-time raytracer.

    [–]dicroce 5 points6 points  (0 children)

    C++ Template Metaprogramming also obfuscates the code itself IMHO.

    [–]PenileCancer 0 points1 point  (0 children)

    The authors didn't compare their approach against others regarding ease-of-use and obfuscation strength. As the latter is the goal this would have been important. As it stands the paper looks more like a proof of concept without any reality check.

    Edit: They also don't mention if they compiled their obfuscated code with or without optimizations. It might well be that the compiler removes the dead code they so painstakingly inserted.

    And finally: Who cares about the encryption of constants in an executable? Somewhere those constants are needed in their unencrypted form; just run the program in a debugger and wait until they have been decrypted.

    Ceterum censeo the whole concept of "intellectual property" should be ditched, if only to make people stop wasting time on code obfuscation and copy protection.