Önmódosító kód

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. július 6-án felülvizsgált verziótól ; az ellenőrzések 3 szerkesztést igényelnek .

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.

Időpont

Az önmódosító kód főbb alkalmazásai:

Alkalmazhatóság Harvard architektúrájú processzorokhoz

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. .

Használat

Tolmácsolt nyelvek

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' ) 1

A 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

Lásd még

  • Metaprogramozás
  • Monkey patch – a program futtatható eljárásainak dinamikus helyettesítése futás közben a forráskód megváltoztatása nélkül.

Jegyzetek

  1. Lásd például: Doom Legacy forráskód , szolgáltatás ASM_PatchRowBytes.
  2. Kaspersky, bekezdés "A Pentium család processzorai .."

Linkek