다형성 코드

위키백과, 우리 모두의 백과사전.

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

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

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

예시[편집]

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

     // 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);

같이 보기[편집]

각주[편집]

  1. Raghunathan, Srinivasan (2007). Protecting anti-virus software under viral attacks. M.Sc. Thesis, Arizona State University.[1][깨진 링크(과거 내용 찾기)]
  2. Wong, Wing; Stamp, M. (2006). Hunting for Metamorphic Engines. Journal in Computer Virology. Department of Computer Science, San Jose State University. [2] Archived 2017년 8월 9일 - 웨이백 머신
  3. Wójcik, Bartosz (2015). String & File Encryption