This document discusses code obfuscation techniques used to make reverse engineering of software more difficult. It describes why obfuscation is used, the main features of an obfuscator like potency and resilience, and classifications of obfuscating transformations like lexical, control, and data transformations. Examples are given of JavaScript obfuscators and how they work by changing variable names, comments, and integers to complex values.