Obfuscating an application program comprises reading a first application
program, determining an application program instruction location
permutation that transforms the first application program into an
obfuscated application program having at least one application program
instruction stored at a memory location that is based at least in part on
a permutation of the memory location where the corresponding application
program instruction is stored in the first application program, applying
the application program instruction location permutation to the first
application program to create an obfuscated application program, and
sending the obfuscated application program. Executing an obfuscated
application program comprises receiving an application program,
determining an application program instruction location permutation to
apply to a current instruction counter value, receiving, applying the
application program instruction location permutation to the current
instruction counter value to obtain a reference to an application program
instruction to execute, and executing the application program instruction
to execute.