Самопереробний код (англ. Self-modifying code) — програмний прийом, при якому програма створює або змінює частину свого програмного коду під час виконання. Такий код зазвичай застосовують у програмах, написаних під процесор з фон-нейманівською організацією пам'яті.
За часом проведення модифікації метод поділяється на:
- Модифікація при ініціалізації проводиться один раз, перед запуском змінюваного коду
- Модифікація на льоту (on-the-fly) — зміна стану програми під час виконання
В обох випадках зміна проходить безпосередньо в машинному коді, коли нові інструкції замінюють старі (напр. умовний перехід , , , і т. ін. замінюються на безумовний перехід або NOP). У наборі інструкцій (IBM/360) і Z/Architecture є інструкція EXECUTE (EX), яка перезаписує цільову інструкцію (записану у другому байті команди EX) наймолодшими 8 бітами регістра 1. На зазначених архітектурах з її допомогою реалізується стандартний, законний метод тимчасової зміни інструкцій.
Призначення
Основні застосування самопереробного коду:
- У критичних до безпеки місцях для ускладнення дослідження коду (поліморфні віруси, деякі типи захисту від копіювання, і т. д.).
- У критичних до швидкості місцях для прискорення роботи. Так, наприклад, під час виконання можна зменшити довжину критичного шляху виконання. Замість встановлення та подальшої багаторазової перевірки прапорів з умовними переходами можна лише змінити адресу і тип переходу в машинному коді. Багато портованих версій рушія Doom встановлювали прямо в машинному коді ширину екрану, це прискорювало відображення стовпця..
- Іноді використовується для включення/відключення під час виконання деякої функціональності для тестування або налагодження. Так, в ОС Linux і Solaris при використанні налагоджувальних інструментів і в деякі місця коду ядра або програм вставляються послідовності інструкцій nop. При включенні інструменту деякі з цих послідовностей замінюються на безумовний перехід на процедуру налагодження. Використання самопереробного коду дозволяє розставити значну кількість точок, в яких можливе налагодження, слабко при цьому впливаючи на швидкість виконання з відключеним налагодженням.
- У ядрі Linux і, можливо, інших ОС, що використовуються для відключення частин ядра, не потрібних в даному оточенні. При завантаженні Linux визначає, виконується він на SMP або на однопроцесорній машині. У другому випадку частина примітивів синхронізації видаляється з коду ядра.
Придатність до процесорів з гарвардською архітектурою
В гарвардській архітектурі пам'ять для коду і пам'ять для даних розділені. Відповідно, у них сильно ускладнюється робота самопереробного коду. Хоча архітектура x86 визначена як фон-нейманівська (з єдиною пам'яттю коду і даних), більшість сучасних процесорів має роздільні області кешу для коду та даних. При цьому кеш коду не підтримує запис, і при зміні закешованої ділянки пам'яті може знадобитися або апаратно проведене часткове або повне скидання кешу коду (x86), або явна інструкція процесору на скидання кешу коду (SPARC). Через це тільки змінений код може виконуватися повільніше або вимагати додаткових команд для правильної роботи. Також зміна коду скидає конвейєр процесора.
Також, деякі ідеї гарвардської архітектури реалізуються в ОС (наприклад, в ОС Windows, в OpenBSD) і в процесорах (для x86 — біт NX і подібні). У цих реалізаціях окремі фрагменти пам'яті можуть бути помічені як невиконувані (тобто дані) або як виконувані, але такі які неможливо модифікувати (тобто код без права на зміну). Використання самопереробного коду в таких програмних середовищах ускладнюється, так як його доводиться розташовувати або в незахищеній області пам'яті (іноді такою областю є стек), або явно відключати захист для коду який підлягає зміні.
Використання
- JIT (Just in time — компіляція)
- Динамічна трансляція
- Динамічна рекомпіляція — при якій двійковий транслятор стежить за частотою виконання регіону, і, якщо регіон виконується часто, проводиться рекомпіляція цього регіону зі зміною його коду під час виконання. Найбільш досконалі двійкові транслятори можуть мати до 4-5 послідовних рівнів оптимізації регіону.
Інтерпретовані мови
Мови Perl і Python дозволяють програмі створювати новий код під час виконання і виконувати його, використовуючи функцію eval, але не дозволяють сапоперероблюватись існуючому коду (interactive python shell):
>>> x = 1 >>> eval('x + 1') 2 >>> eval('x') 1
Ілюзія модифікації (при тому, що ніякий машинний код в дійсності не змінюється) досягається шляхом зміни покажчика функції, як в цьому JavaScript-прикладі:
var f = function (x) {return x + 1}; alert(f(0)); //1 f = new Function('x', 'return x + 2'); // assign a new definition to f alert(f(0)); //2
Див. також
- Метапрограмування
- Мавполатування — динамічна підміна виконуваних процедур програми під час виконання без зміни початкового коду.
Примітки
- Дивись, наприклад, вихідний код , функція
ASM_PatchRowBytes
.
Посилання
- від Кріса Касперски
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Samopererobnij kod angl Self modifying code programnij prijom pri yakomu programa stvoryuye abo zminyuye chastinu svogo programnogo kodu pid chas vikonannya Takij kod zazvichaj zastosovuyut u programah napisanih pid procesor z fon nejmanivskoyu organizaciyeyu pam yati Za chasom provedennya modifikaciyi metod podilyayetsya na Modifikaciya pri inicializaciyi provoditsya odin raz pered zapuskom zminyuvanogo kodu Modifikaciya na lotu on the fly zmina stanu programi pid chas vikonannya V oboh vipadkah zmina prohodit bezposeredno v mashinnomu kodi koli novi instrukciyi zaminyuyut stari napr umovnij perehid i t in zaminyuyutsya na bezumovnij perehid abo NOP U nabori instrukcij IBM 360 i Z Architecture ye instrukciya EXECUTE EX yaka perezapisuye cilovu instrukciyu zapisanu u drugomu bajti komandi EX najmolodshimi 8 bitami registra 1 Na zaznachenih arhitekturah z yiyi dopomogoyu realizuyetsya standartnij zakonnij metod timchasovoyi zmini instrukcij PriznachennyaOsnovni zastosuvannya samopererobnogo kodu U kritichnih do bezpeki miscyah dlya uskladnennya doslidzhennya kodu polimorfni virusi deyaki tipi zahistu vid kopiyuvannya i t d U kritichnih do shvidkosti miscyah dlya priskorennya roboti Tak napriklad pid chas vikonannya mozhna zmenshiti dovzhinu kritichnogo shlyahu vikonannya Zamist vstanovlennya ta podalshoyi bagatorazovoyi perevirki praporiv z umovnimi perehodami mozhna lishe zminiti adresu i tip perehodu v mashinnomu kodi Bagato portovanih versij rushiya Doom vstanovlyuvali pryamo v mashinnomu kodi shirinu ekranu ce priskoryuvalo vidobrazhennya stovpcya Inodi vikoristovuyetsya dlya vklyuchennya vidklyuchennya pid chas vikonannya deyakoyi funkcionalnosti dlya testuvannya abo nalagodzhennya Tak v OS Linux i Solaris pri vikoristanni nalagodzhuvalnih instrumentiv i v deyaki miscya kodu yadra abo program vstavlyayutsya poslidovnosti instrukcij nop Pri vklyuchenni instrumentu deyaki z cih poslidovnostej zaminyuyutsya na bezumovnij perehid na proceduru nalagodzhennya Vikoristannya samopererobnogo kodu dozvolyaye rozstaviti znachnu kilkist tochok v yakih mozhlive nalagodzhennya slabko pri comu vplivayuchi na shvidkist vikonannya z vidklyuchenim nalagodzhennyam U yadri Linux i mozhlivo inshih OS sho vikoristovuyutsya dlya vidklyuchennya chastin yadra ne potribnih v danomu otochenni Pri zavantazhenni Linux viznachaye vikonuyetsya vin na SMP abo na odnoprocesornij mashini U drugomu vipadku chastina primitiviv sinhronizaciyi vidalyayetsya z kodu yadra Pridatnist do procesoriv z garvardskoyu arhitekturoyuV garvardskij arhitekturi pam yat dlya kodu i pam yat dlya danih rozdileni Vidpovidno u nih silno uskladnyuyetsya robota samopererobnogo kodu Hocha arhitektura x86 viznachena yak fon nejmanivska z yedinoyu pam yattyu kodu i danih bilshist suchasnih procesoriv maye rozdilni oblasti keshu dlya kodu ta danih Pri comu kesh kodu ne pidtrimuye zapis i pri zmini zakeshovanoyi dilyanki pam yati mozhe znadobitisya abo aparatno provedene chastkove abo povne skidannya keshu kodu x86 abo yavna instrukciya procesoru na skidannya keshu kodu SPARC Cherez ce tilki zminenij kod mozhe vikonuvatisya povilnishe abo vimagati dodatkovih komand dlya pravilnoyi roboti Takozh zmina kodu skidaye konvejyer procesora Takozh deyaki ideyi garvardskoyi arhitekturi realizuyutsya v OS napriklad v OS Windows v OpenBSD i v procesorah dlya x86 bit NX i podibni U cih realizaciyah okremi fragmenti pam yati mozhut buti pomicheni yak nevikonuvani tobto dani abo yak vikonuvani ale taki yaki nemozhlivo modifikuvati tobto kod bez prava na zminu Vikoristannya samopererobnogo kodu v takih programnih seredovishah uskladnyuyetsya tak yak jogo dovoditsya roztashovuvati abo v nezahishenij oblasti pam yati inodi takoyu oblastyu ye stek abo yavno vidklyuchati zahist dlya kodu yakij pidlyagaye zmini VikoristannyaJIT Just in time kompilyaciya Dinamichna translyaciya Dinamichna rekompilyaciya pri yakij dvijkovij translyator stezhit za chastotoyu vikonannya regionu i yaksho region vikonuyetsya chasto provoditsya rekompilyaciya cogo regionu zi zminoyu jogo kodu pid chas vikonannya Najbilsh doskonali dvijkovi translyatori mozhut mati do 4 5 poslidovnih rivniv optimizaciyi regionu Interpretovani moviMovi Perl i Python dozvolyayut programi stvoryuvati novij kod pid chas vikonannya i vikonuvati jogo vikoristovuyuchi funkciyu eval ale ne dozvolyayut sapopereroblyuvatis isnuyuchomu kodu interactive python shell gt gt gt x 1 gt gt gt eval x 1 2 gt gt gt eval x 1 Ilyuziya modifikaciyi pri tomu sho niyakij mashinnij kod v dijsnosti ne zminyuyetsya dosyagayetsya shlyahom zmini pokazhchika funkciyi yak v comu JavaScript prikladi var f function x return x 1 alert f 0 1 f new Function x return x 2 assign a new definition to f alert f 0 2Div takozhMetaprogramuvannya Mavpolatuvannya dinamichna pidmina vikonuvanih procedur programi pid chas vikonannya bez zmini pochatkovogo kodu PrimitkiDivis napriklad vihidnij kod funkciya ASM PatchRowBytes Posilannyavid Krisa Kasperski