A számítástechnikában a polimorf kód olyan kód, amely egy polimorf motort használ a mutációhoz, miközben az eredeti algoritmust érintetlenül tartja. Vagyis a kód minden futás közben megváltozik, de a kód funkciója (szemantikája) egyáltalán nem. Például az 1+3 és a 6-2 ugyanazt az eredményt adja, miközben különböző értékeket és műveleteket használ. Ezt a technikát néha számítógépes vírusok, shell-kódok és számítógépes férgek használják jelenlétük elrejtésére.[1]

A forráskód elrejtésére a titkosítás a leggyakoribb módszer. Ezzel a kód törzsét (payload) titkosítják, így értelmezhetetlenül fog megjelenni. Ahhoz, hogy a kód a korábbiakhoz hasonlóan működjön, egy visszafejtési funkcióra van szükség. Ez a hozzáadott funkció a kód végrehajtásakor beolvassa a kód törzsét és visszafejti, mielőtt futtatná azt.

A titkosítás önmagában nem polimorfizmus. A polimorf viselkedés elérése érdekében a titkosító/visszafejtő pár a kód minden példányában mutálódik. Ez lehetővé teszi, hogy azonos működéső kódok többféle verzióban létezzenek.[2]

Rosszindulatú kódSzerkesztés

A legtöbb víruskereső szoftver és behatolás-észlelő rendszer (IDS) úgy próbálja megtalálni a rosszindulatú kódot, hogy átvizsgálja a számítógépes hálózatokon keresztül küldött fájlokat és adatcsomagokat. Ha olyan mintákat talál, amelyek megfelelnek az ismert számítógépes vírusoknak vagy férgeknek, akkor megfelelő lépéseket tesz a fenyegetés semlegesítésére. A polimorf algoritmusok megnehezítik az ilyen szoftverek számára a kártevő kód felismerését, mert állandóan mutálódnak.

A rosszindulatú programozók arra törekednek, hogy a titkosítatlan visszafejtő motor a vírus vagy a féreg minden egyes sokszorozódásakor különbözzön. A vírusirtó szoftver kifinomult mintaelemzéssel keresi meg a mögöttes mintákat a visszafejtő motor különböző mutációi között, remélve, hogy megbízhatóan felismeri az ilyen kártevőket.

A polimorf obfuszkáció leküzdésének egy hatékony módja az emuláció, melynek során egy virtuális környezetben hagyják a kártékony programot kicsomagolódni, mielőtt más módszereket alkalmaznának, például a hagyományos aláírás-ellenőrzést. Az ilyen virtuális környezetet néha homokozónak (sandbox) hívják. A polimorfizmus nem védi meg a vírust az ilyen emulációval szemben, ha a visszafejtett kódtörzs ugyanaz marad, függetlenül a visszafejtési algoritmus változataitól. A felismerés tovább bonyolítása céljából a metamorf kód technikáját is alkalmazzák, minek során a vírus úgy fut le, hogy nincsenek azonosítható kódblokkjai a memóriában, amelyek két fertőzés között ugyanazok maradnának.

Az első ismert polimorf vírust Mark Washburn írta. Az 1260-nak nevezett nevű vírus 1990-ben jelent meg. Egy ismertebb eset a Dark Avenger hacker által 1992-ben létrehozott polimorf vírus, mely elkerülte a vírusirtó szoftverek mintafelismerését. Egy gyakori és igen fertőző polimorf vírus a Virut.

PéldaSzerkesztés

Ez a példa valójában nem polimorf kód, viszont jó betekintést nyújt a titkosítás világába az XOR operátor által. Például egy olyan algoritmusban, amely használja az A és a B változókat, viszont a C változót nem, nagy mennyiségű kód lehet amely megváltoztatja a C változó értékét, de ez nem lenne hatással magára az algoritmusra és az eredményre.

  sok titkosított kód
  . . .
Visszafejtési_Kód:
  C = C + 1
  A = Titkosított
Ciklus:
  B = * A
  C = 3214 * A
  B = B XOR Kulcs
  *A = B
  C = 1
  C = A + B
  A = A + 1
  UGRÁS Ciklus HA A != Visszafejtési_Kód
  C = C ^ 2
  UGRÁS Titkosított
Kulcs:
  valami_véletlen_szám

A titkosított kód a kód törzse (payload). A kód különböző verzióinak elkészítéséhez minden másolatban megváltoznak a C változót manipuláló értelmezhetetlen sorok. A „Titkosított” részben („sok titkosított kód”) levő kód a Visszafejtési_Kód és a Kulcs között keres, valamint minden hasonló új algoritmusban. Általában a programozó nulla kulcsot használ (A xor 0 = A) a vírus első generációjához, megkönnyítve ezzel a dolgát, mert így a kód még nincs titkosítva. Ezután bevezet egy növekedő vagy egy véletlenszerű algoritmust a kulcs generálásához.

Polimorf titkosításSzerkesztés

A polimorf kód felhasználható titkosító algoritmus létrehozására is. Az alábbi kód a StringEncrypt szolgáltatától származik.[3] Egy karakterláncot vagy egy fájl tartalmát véletlenszerű titkosítási parancsokkal titkosítja, és polimorf visszafejtő kódot generál hozzá:

// encrypted with https://www.stringencrypt.com (v1.1.0) [C/C++]
// szLabel = "Wikipedia"
wchar_t szLabel[10] = { 0xB1A8, 0xB12E, 0xB0B4, 0xB03C, 0x33B9, 0xB30C, 0x3295, 0xB260,
                        0xB5E5, 0x35A2 };
 
for (unsigned int tUTuj = 0, KRspk = 0; tUTuj < 10; tUTuj++)
{
    KRspk = szLabel[tUTuj];
    KRspk ^= 0x2622;
    KRspk = ~KRspk;
    KRspk--;
    KRspk += tUTuj;
    KRspk = (((KRspk & 0xFFFF) >> 3) | (KRspk << 13)) & 0xFFFF;
    KRspk += tUTuj;
    KRspk--;
    KRspk = ((KRspk << 8) | ( (KRspk & 0xFFFF) >> 8)) & 0xFFFF;
    KRspk ^= 0xE702;
    KRspk = ((KRspk << 4) | ( (KRspk & 0xFFFF) >> 12)) & 0xFFFF;
    KRspk ^= tUTuj;
    KRspk++;
    KRspk = (((KRspk & 0xFFFF) >> 8) | (KRspk << 8)) & 0xFFFF;
    KRspk = ~KRspk;
    szLabel[tUTuj] = KRspk;
}
 
wprintf(szLabel);

Ebben a C++ példában minden karaktert Unicode formátumban, titkosított formában tároltak. Különböző titkosítási parancsokat használtak, mint például bitszintű XOR, NOT, összeadás, kivonás, rotálás. Minden véletlenszerű: a titkosítási kulcsok, a rotációk mennyisége, a titkosítási parancsok sorrendje. A kimeneti kód C / C++, C #, Java, JavaScript, Python, Ruby, Haskell, MASM, FASM és AutoIt nyelveken generálható, és minden alkalommal más. Nem lehet általános visszafejtő programokat írni, és a polimorf titkosítással lefordított kódot minden egyes újratitkosításkor elemezni kell.

JegyzetekSzerkesztés

  1. Raghunathan, Srinivasan (2007). Protecting anti-virus software under viral attacks. M.Sc. Thesis, Arizona State University
  2. Wong, Wing; Stamp, M. (2006). Hunting for Metamorphic Engines. Journal in Computer Virology. Department of Computer Science, San Jose State University.
  3. Wójcik, Bartosz (2015). String & File Encryption

ForrásokSzerkesztés

FordításSzerkesztés

Ez a szócikk részben vagy egészben a Polymorphic code című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

További információkSzerkesztés