This document discusses code obfuscation techniques to protect intellectual property in software. It notes that software protection is becoming more important as software replaces hardware functionality. Code obfuscation aims to increase the effort required for attackers to analyze code by expanding and adding complexity to code without significant performance impacts. The best techniques introduce non-reducible complex layers that delay dynamic analysis and break repetitions to hinder analysis. Code virtualization is highlighted as an effective technique, as it can generate infinite variability at the instruction level and control performance degradation precisely.