Az önmódosító kód (SMC) olyan programozási technika, amelyben az alkalmazás futás közben létrehozza vagy megváltoztatja programkódjának egy részét. Az ilyen kódot általában a Neumann -féle memóriaszervezésű processzorokhoz írt programokban használják .
A módosítás idejére a módszer a következőkre oszlik:
Mindkét esetben a változás közvetlenül a gépi kódban történik, amikor az új utasítások felülírják a régieket (pl. egy feltételes JZ , JNZ , JE , JNE stb. ágat egy feltétel nélküli JMP vagy NOP ág vált fel ). Az IBM/360 és Z/Architecture utasításkészletek EXECUTE (EX) utasítással rendelkeznek, amely felülírja a célutasítást (az EX utasítás második bájtjában rögzítve) a legkisebb jelentőségű 8 bites 1. regiszterrel. Ezeken az architektúrákon egy szabványos, legitim módszer az utasítások ideiglenes megváltoztatására.
Az önmódosító kód főbb alkalmazásai:
A Harvard architektúrában a kódmemória és az adatok memóriája el van választva. Ennek megfelelően az önmódosító kód munkája sokkal bonyolultabbá válik náluk. Bár az x86 architektúrát Neumann-nak (egy kód és adatmemória) definiálják, a legtöbb modern processzor külön gyorsítótárterülettel rendelkezik a kód és az adatok számára. Ugyanakkor a kódgyorsítótár nem támogatja az írást, és a gyorsítótárazott memóriaterület megváltoztatásakor vagy a kódgyorsítótár hardveres részleges vagy teljes visszaállítása (x86), vagy kifejezett utasítás a processzornak a kódgyorsítótár visszaállítására ( SPARC ) talan szukseges. Emiatt az újonnan módosított kód lassabban futhat, vagy további parancsokat igényelhet a megfelelő működéshez. A kód megváltoztatása szintén alaphelyzetbe állítja a processzor folyamatát . [2]
Ezenkívül a Harvard architektúra néhány ötlete az operációs rendszerben (például Data Execution Prevention Windows-ban, W^X OpenBSD -ben ) és processzorokban (x86 - NX bithez és hasonlókhoz) valósul meg. Ezekben a megvalósításokban a memória egyes darabjai megjelölhetők nem végrehajthatóként (azaz adatokként) vagy végrehajthatóként, de nem módosíthatóként (azaz változtatási jog nélküli kódként). Az önmódosító kód használata az ilyen programozási környezetekben bonyolult, mivel vagy a memória nem védett területén kell lennie (néha ez a terület a verem ), vagy kifejezetten le kell tiltani a megváltoztatandó kód védelmét. .
A Perl , a PHP és a Python lehetővé teszik a programok számára, hogy futás közben új kódot hozzanak létre, és azt az eval függvény segítségével hajtsák végre, de nem teszik lehetővé a meglévő kód önmódosítását (interaktív python shell) :
>>> x = 1 >>> eval ( 'x + 1' ) 2 >>> eval ( 'x' ) 1A módosítás illúziója (feltéve, hogy a natív kód valójában nem változik) a függvénymutató megváltoztatásával érhető el, mint ebben a JavaScript - példában:
var f = függvény ( x ) { return x + 1 }; riasztás ( f ( 0 )); //egy f = új függvény ( 'x' , 'return x + 2' ); // új definíció hozzárendelése a f riasztáshoz ( f ( 0 )); //2