Paper 2017/787

When Are Opaque Predicates Useful?

Lukas Zobernig, Steven D. Galbraith, and Giovanni Russello


Opaque predicates are a commonly used technique in program obfuscation, intended to add complexity to control flow and to insert dummy code or watermarks. However, there are many attacks known to detect opaque predicates and remove dummy code. We survey these attacks and argue that many types of programs cannot be securely obfuscated using opaque predicates. In particular we explain that most previous works on control flow obfuscation have introduced predicates that are easily distinguished from naturally occurring predicates in code, and hence easily removed by an attacker. We state two conditions that are necessary for a program to be suitable for control flow obfuscation. We give an integrated approach to control flow obfuscation that simultaneously obfuscates real predicates and introduces opaque predicates. The opaque predicates are indistinguishable from the obfuscated real predicates in the program. If an attacker applies the usual approaches (both static and dynamic) to identify and remove opaque predicates then they are likely to remove critical functionality and introduce errors. We have implemented our obfuscator in LLVM. We provide an analysis of the performance of the resulting obfuscated code.

Note: Title changed.

Available format(s)
Publication info
Published elsewhere. Major revision. IEEE TrustCom 2019
program obfuscationindistinguishableopaque predicates
Contact author(s)
lukas zobernig @ auckland ac nz
2019-05-21: revised
2017-08-21: received
See all versions
Short URL
Creative Commons Attribution


      author = {Lukas Zobernig and Steven D.  Galbraith and Giovanni Russello},
      title = {When Are Opaque Predicates Useful?},
      howpublished = {Cryptology ePrint Archive, Paper 2017/787},
      year = {2017},
      note = {\url{}},
      url = {}
Note: In order to protect the privacy of readers, does not use cookies or embedded third party content.