Towards Formal Verification of Program Obfuscation
Weiyun Lu, Bahman Sistany, Amy Felty, Philip James Scott · 2020
Code obfuscation involves transforming a program to a new version that performs the same computation but hides the functionality of the original code. An important property of such a transformation is that it preserves the behavior of the original program. In this paper, we lay the foundation for studying and reasoning about code obfuscating transformations, and show how the preservation of certain behaviours may be formally verified. To this end, we apply techniques of formal specification and verification using the Coq Proof Assistant. We use and extend an existing encoding of a simple imperative language in Coq along with an encoding of Hoare logic for reasoning about this language. We formulate what it means for a program's semantics to be preserved by an obfuscating transformation, and give formal machine-checked proofs that these behaviours or properties hold. We also define a lower-level block-structured language which is "wrapped around" our imperative language, allowing us to model certain flattening transformations and treat blocks of codes as objects in their own right.