Executing an obfuscated application program comprises receiving an
application program comprising application program instructions and
application program data, determining an application program instruction
location permutation to apply to a current instruction counter value,
determining an application program data location permutation to apply to
a current data location counter value, receiving the current instruction
counter value, and applying the application program instruction location
permutation to the current instruction counter value to obtain a
reference to an application program instruction in an instruction stream
to execute. If the application program instruction references application
program data, the application program data location permutation is
applied to data referenced by the application program instruction to
obtain a reference to data to access. The data to access is interleaved
with application program instructions in the instruction stream. The
application program instruction is then executed.