다형성 코드

컴퓨터 용어로 다형성 코드()는
원래의 알고리즘을 건드리지 않고 그대로 유지하면서 뮤테이트(mutate)를 수행하기 위한 다형성 엔진을 사용하는 코드이다. 즉, 실행할 때마다 코드는 스스로 변화되지만 코드의 기능(시맨틱)은 전혀 변하지 않는다. 이를테면 1+3과 6-2는 각기 다른 값과 동작을 사용하지만 둘 다 같은 결과를 수행한다. 이 기법은 컴퓨터 바이러스, 셸코드, 웜이 자신의 존재를 숨기기 위해 사용되곤 한다.

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

암호화 그 자체는 다형성이 아니다. 다형성 행위를 수행하려면 암호화/복호화 쌍이 코드의 각 사본과 함께 뮤테이트(mutate) 처리되어야 한다. 이로써 일부 코드가 버전이 다르더라도 모든 것이 동일하게 기능하게 된다.

예시 
아래 예시는 실제로 다형성 코드는 아니지만 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에 의해 생성된다. 문자열이나 파일 내용을 취한 다음 임의의 암호화 명령을 사용하여 암호화하고 지원되는 수많은 프로그래밍 언어 중 하나로 다형성 복호화 코드를 만들어낸다:
     // 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);

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

각주 

 Spinellis, Diomidis; Reliable identification of bounded-length viruses is NP-complete, IEEE Transactions on Information Theory, 49(1):280–284, January 2003. 

악성 소프트웨어의 유형