Selvmodificerende kode er en teknik, hvor et kørende computerprogram ændrer de instruktioner, der ligger i lageret. Programmet ændrer altså sig selv.
Anvendelse af tenikken kræver i praksis, at der køres på en von Neumann-maskine, hvor såvel data som programmets instruktioner befinder sig i maskinens lager.
Selvmodificerende kode har været benyttet til at implementere funktionalitet på en maskine, som den ikke var født med. Således kan man modificere en instruktion, der læser fra eller skriver til en bestemt adresse, således at der i stedet tilgås en anden adresse. Derved kan man få en funktionalitet som et indeksregister, hvis sådan et ikke findes i maskinens arkitektur. Man kan også på den måde implementere betingede hop eller hoppe til forskellige adresser styret af programmet.
Selvmodificerende kode kan i nogle tilfælde eksekvere hurtigere end kode, der skal foretage flere tests og betingede hop. Metoden ses af og til anvendt under initialiseringen af et program, således at det kan være mere kompakt og mere effektivt ved slet ikke at teste på forhold, der ikke er brug for aktuelt.
Selvmodificerende kode kan benyttes til at sløre et programs virkemåde, hvad enten det er for at undgå reverse engineering eller som en form for kopisikring.
Selvmodificerende kode kan af og til benyttes af en debugger til at lægge breakpoints ind i programmet, steder hvor debuggeren kan overtage kontrollen.
Teknikken kan også benyttes i ond hensigt for at ændre et kørende system. Her kan en metode som buffer overløb anvendes.
Programmer baseret på selvmodificerende kode er sjældne i dag. Det skyldes både, at de forskellige computere i dag ikke savner væsentlige instruktioner, dels at sådanne programmer er meget svære at læse og fejlsøge. Det betragtes derfor (almindeligvis) som en uskik. Nogle computere implementerer en streng adskillelse mellem de dele af lageret, der kan skrives til og de dele, der kan eksekveres kode fra.
Nogle højniveausprog har faciliteter til at anvende selvmodificerende kode.
På en cpu med en instruktionscache eller en instruktionspipeline kan selvmodificerende kode være svær at få til at fungere. Et krav om at opdatere instruktionscachen kan endda medføre, at programmet kommer til at køre langsommere. Programmøren kan få brug for et nøje kendskab til den aktuelle cpus egenskaber, og programmet skal så kunne tilpasse sig flere modeller.
Selvmodificerende kode giver også problemer, hvis flere programmer skal eksekvere de samme instruktioner fra samme sted i lageret (for at spare på forbruget af maskinens lager).