Samomodifikační kód

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 6. července 2019; kontroly vyžadují 3 úpravy .

Samomodifikující kód (SMC) je programovací technika, při které aplikace vytváří nebo mění část svého programového kódu za běhu. Takový kód se obvykle používá v programech napsaných pro procesor s von Neumannovou organizací paměti.

Podle doby modifikace se metoda dělí na:

V obou případech dochází ke změně přímo ve strojovém kódu, když nové instrukce přepisují staré (např. podmíněná větev JZ , JNZ , JE , JNE atd. je nahrazena nepodmíněnou větví JMP nebo NOP ). Instrukční sady IBM/360 a Z /Architecture mají instrukci EXECUTE (EX) , která přepíše cílovou instrukci (zaznamenanou ve druhém bajtu instrukce EX) nejméně významnými 8 bity registru 1. Na těchto architekturách implementuje standardní, legitimní metoda pro dočasnou změnu pokynů .

Schůzka

Hlavní aplikace samomodifikačního kódu:

Použitelnost pro procesory s architekturou Harvard

V Harvardské architektuře je paměť pro kód a paměť pro data oddělena. V souladu s tím se v nich práce se samomodifikačním kódem stává mnohem složitější. I když je architektura x86 definována jako von Neumann (paměť jednoho kódu a dat), většina moderních procesorů má oddělené oblasti mezipaměti pro kód a data. Mezipaměť kódu zároveň nepodporuje zápis a při změně oblasti mezipaměti dojde buď k částečnému nebo úplnému hardwarovému resetu mezipaměti kódu (x86), nebo k výslovnému příkazu procesoru k resetování mezipaměti kódu ( SPARC ) může být vyžadováno. Z tohoto důvodu může nově upravený kód běžet pomaleji nebo vyžadovat další příkazy, aby správně fungoval. Změna kódu také resetuje kanál procesoru . [2]

Některé myšlenky Harvardské architektury jsou také implementovány v OS (například Data Execution Prevention ve Windows, W^X v OpenBSD ) a v procesorech (pro x86 - NX bit a podobně). V těchto implementacích mohou být jednotlivé části paměti označeny jako nespustitelné (tj. data) nebo jako spustitelné, ale nemodifikovatelné (tj. kód bez práva na změnu). Použití samomodifikačního kódu v takových programovacích prostředích je komplikované, protože musí být buď umístěn v nechráněné oblasti paměti (někdy je tato oblast zásobníkem ), nebo explicitně zakázat ochranu kódu, který má být změněn. .

Použití

Interpretované jazyky

Perl , PHP a Python umožňují programu vytvořit nový kód za běhu a spustit jej pomocí funkce eval, ale neumožňují, aby se existující kód sám upravoval (interaktivní shell pythonu) :

>>> x = 1 >>> eval ( 'x + 1' ) 2 >>> eval ( 'x' ) 1

Iluze modifikace (za předpokladu, že se ve skutečnosti nezmění žádný nativní kód) je dosaženo změnou ukazatele funkce, jako v tomto příkladu JavaScriptu :

var f = funkce ( x ) { return x + 1 }; upozornění ( f ( 0 )); //jeden f = nová funkce ( 'x' , 'návrat x + 2' ); // přiřadit novou definici f alert ( f ( 0 )); //2

Viz také

Poznámky

  1. Viz například zdrojový kód Doom Legacy , funkce ASM_PatchRowBytes.
  2. Kaspersky, odstavec s "Procesory rodiny Pentium .."

Odkazy