This document discusses code obfuscation techniques including theoretical background, practices used, and case studies. It begins with an overview of code obfuscation goals and challenges, then describes virtual machine based binary code obfuscation which transforms code into bytecode interpreted by a virtual machine. Specific examples of virtual machine instruction sets and transformations are provided. The document also briefly mentions .NET and Java bytecode obfuscation techniques.