1. A method of code obfuscation, comprising: receiving a code segment; applying a first obfuscation algorithm to the code segment to generate a first obfuscated code; applying a second obfuscation algorithm, different from the first obfuscation algorithm, to the first obfuscated code to generate a second obfuscated code; and iteratively applying one or more obfuscation algorithms to the second obfuscated code to create overlapped code, in the code segment, for performing a plurality of semantically different actions which depend upon a context of when the overlapped code is executed, the overlapped code resulting from either modifying the second obfuscated code or inserting additional code into the second obfuscated code, wherein a particular one of the plurality of semantically different actions performed during execution is a function of one or more conditions of execution selected from a group consisting of a current code path, a program counter, a time, a running thread, a current value of a variable, a program input, data derived from a program input, and a current content of a register.