{{위키데이터 속성 추적}}
컴퓨터 용어로 '''다형성 코드'''({{llang|en|polymorphic code}})는
원래의 [[알고리즘]]을 건드리지 않고 그대로 유지하면서 뮤테이트(mutate)를 수행하기 위한 [[다형성 엔진]]을 사용하는 코드이다. 즉, 실행할 때마다 코드는 스스로 변화되지만 코드의 기능([[의미론|시맨틱]])은 전혀 변하지 않는다. 이를테면 1+3과 6-2는 각기 다른 값과 동작을 사용하지만 둘 다 같은 결과를 수행한다. 이 기법은 [[컴퓨터 바이러스]], [[셸코드]], [[웜]]이 자신의 존재를 숨기기 위해 사용되곤 한다.<ref name="rugha">Raghunathan, Srinivasan (2007). ''Protecting anti-virus software under viral attacks''. M.Sc. Thesis, Arizona State University.[https://pdfs.semanticscholar.org/0676/da6041ea51a3e8d80c597e503680e925aed0.pdf]{{깨진 링크|url=https://pdfs.semanticscholar.org/0676/da6041ea51a3e8d80c597e503680e925aed0.pdf }}</ref>

[[암호화]]는 코드를 숨기는 가장 흔한 방식이다. 암호화와 함께 코드의 주요 본체(페이로드라고도 함)는 암호화되며 의미없는 것으로 나타난다. 이전처럼 코드가 기능하려면 복호화 함수를 코드에 추가해야 한다. 코드가 실행될 때 이 함수는 페이로드를 일고 실행 전에 복호화를 수행한다.

암호화 그 자체는 다형성이 아니다. 다형성 행위를 수행하려면 암호화/복호화 쌍이 코드의 각 사본과 함께 뮤테이트(mutate) 처리되어야 한다. 이로써 일부 코드가 버전이 다르더라도 모든 것이 동일하게 기능하게 된다.<ref name="wongstamp">Wong, Wing; Stamp, M. (2006). ''Hunting for Metamorphic Engines''.  Journal in Computer Virology. Department of Computer Science, San Jose State University. [http://www.truststc.org/pubs/237/hunting.pdf] {{웨이백|url=http://www.truststc.org/pubs/237/hunting.pdf |date=20170809113655 }}</ref>

== 예시 ==
아래 예시는 실제로 다형성 코드는 아니지만 [[배타적 논리합|XOR]] 연산자를 통해 암호화 세계로 들어가는 역할을 한다. 이를테면 변수 C를 사용하지 않고 변수 A와 B를 사용하는 알고리즘의 경우 C를 변경하는 코드의 양이 상당히 많을 수 있으며 알고리즘 그 자체에는 영향을 미치지 않은 채 최종 결과가 어떻게 되든지 신경쓰지 않고 무한정 변경이 가능하다.

     수많은 암호화된 코드
     ...
 Decryption_Code:
     C = C + 1
     A = Encrypted
 Loop:
     B = *A
     C = 3214 * A
     B = B XOR CryptoKey
     *A = B
     C = 1
     C = A + B
     A = A + 1
     GOTO Loop IF NOT A = Decryption_Code
     C = C^2
     GOTO Encrypted
  CryptoKey:
     some_random_number

암호화된 코드는 페이로드(payload)이다.

== 다형성 암호화 ==
다형성 코드는 암호화 알고리즘 생성에 사용될 수도 있다. 이 코드는 온라인 서비스 StringEncrypt에 의해 생성된다.<ref name="stringencrypt">[https://www.stringencrypt.com Wójcik, Bartosz (2015). ''String & File Encryption'']</ref> 문자열이나 파일 내용을 취한 다음 임의의 암호화 명령을 사용하여 암호화하고 지원되는 수많은 프로그래밍 언어 중 하나로 다형성 복호화 코드를 만들어낸다:
<syntaxhighlight lang="cpp">
     // 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);
</syntaxhighlight>

== 같이 보기 ==
* [[자체 수정 코드]]
* [[셸코드]]
* [[소프트웨어 크래킹]]
* [[난독화]]

== 각주 ==
<references/>
* Spinellis, Diomidis; [http://www.spinellis.gr/pubs/jrnl/2002-ieeetit-npvirus/html/npvirus.html ''Reliable identification of bounded-length viruses is NP-complete''], IEEE Transactions on Information Theory, 49(1):280–284, January 2003. {{doi|10.1109/TIT.2002.806137}}

[[분류:악성 소프트웨어의 유형]]