This document discusses code obfuscation techniques for protecting software from reverse engineering. It begins with an abstract discussing the use of code obfuscation to protect proprietary algorithms and keys from extraction during reverse engineering. It then provides definitions of code obfuscation and discusses classifications of obfuscation techniques including layout, data, control, and preventive obfuscations. The document surveys various code obfuscation techniques from literature and evaluates them based on criteria like potency, resilience, cost, and resistance to static and dynamic attacks. It concludes with a discussion of empirical evaluation of obfuscation techniques.