Polimorf kód
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ód
[szerkeszté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 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élda
[szerkeszté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ás
[szerkeszté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.
Jegyzetek
[szerkesztés]- ↑ Raghunathan, Srinivasan (2007). Protecting anti-virus software under viral attacks. M.Sc. Thesis, Arizona State University
- ↑ Wong, Wing; Stamp, M. (2006). Hunting for Metamorphic Engines. Journal in Computer Virology. Department of Computer Science, San Jose State University.
- ↑ Wójcik, Bartosz (2015). String & File Encryption
Források
[szerkesztés]- Spinellis, Diomidis; A korlátozott hosszúságú vírusok megbízható azonosítása NP-teljes, IEEE Transaction on Information Theory, 49 (1): 280–284, 2003. január. doi:10.1109/TIT.2002.806137
Fordítás
[szerkeszté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 és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.