1. A method for executing an obfuscated application program, the method comprising: receiving an application program that comprises 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 said current instruction counter value; applying said application program instruction location permutation to said current instruction counter value to obtain a first reference to an application program instruction in an instruction stream to execute; if said application program instruction references application program data, applying said application program data location permutation to data referenced by said application program instruction to obtain a second reference to data to access, said data to access interleaved with application program instructions in said instruction stream; and executing said application program instruction.