맨위로가기

다형성 코드

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

다형성 코드는 주로 악성 코드에서 발견되며, 안티바이러스 소프트웨어의 탐지를 회피하기 위해 사용된다. 악성 코드 제작자는 코드를 지속적으로 변경하여 백신 프로그램의 패턴 인식을 어렵게 만든다. 이러한 기술은 암호화된 복호화 엔진을 재작성하거나, 변형 코드를 사용하여 탐지를 더욱 복잡하게 만든다. 다형성 코드는 또한 StringEncrypt와 같은 도구를 통해 암호화 알고리즘 생성에도 활용될 수 있다.

더 읽어볼만한 페이지

다형성 코드
개요
유형자체 수정 코드
목적바이러스 백신 프로그램 또는 역공학 방해
특징암호화, 코드 삽입, 순열, 치환, 쓰레기 코드 삽입, 코드 재정렬, 하위 루틴 재정렬
분류악성코드
상세 정보
설명자신을 복제하면서 겉모습과 내부 구조를 계속 바꾸는 악성코드 기술
원리암호화, 코드 삽입, 순열, 치환, 쓰레기 코드 삽입, 코드 재정렬, 하위 루틴 재정렬 등을 통해 시그니처 기반 탐지 우회
탐지 방법휴리스틱 분석, 행위 기반 분석 등
대응 방법백신 프로그램 업데이트, 의심스러운 파일 실행 금지 등
활용
사용 예시파일 감염, 시스템 손상 등

2. 악성 코드

다형성 코드는 주로 악성코드에서 발견되며, 백신 소프트웨어 및 침입 탐지 시스템(IDS)의 탐지를 어렵게 만드는 데 사용된다.

최초의 알려진 다형성 바이러스는 마크 워시번(Mark Washburn)이 1990년에 작성한 1260이다. 1992년에는 해커 다크 어벤저가 백신 소프트웨어의 패턴 인식을 피하기 위한 수단으로 더 잘 알려진 다형성 바이러스를 만들었다. 파일 감염자 Virut는 일반적이고 매우 치명적인 다형성 바이러스 중 하나이다.

2. 1. 안티바이러스 소프트웨어의 탐지 회피

백신 소프트웨어 및 침입 탐지 시스템(IDS)은 컴퓨터 네트워크를 통해 전송되는 컴퓨터 파일과 데이터 패킷을 검색하여 악성 코드를 찾으려고 시도한다. 보안 소프트웨어가 알려진 컴퓨터 바이러스 또는 웜과 일치하는 패턴을 발견하면 위협을 무력화하기 위한 적절한 조치를 취한다. 다형성 알고리즘은 악성 코드가 끊임없이 변하기 때문에 이러한 소프트웨어가 악성 코드를 인식하기 어렵게 만든다.

악의적인 프로그래머는 바이러스나 웜이 전파될 때마다 암호화되지 않은 복호화 엔진(및 암호화된 페이로드)을 다시 작성하여 안티바이러스 소프트웨어의 패턴 기반 탐지를 회피하려 한다. 백신 소프트웨어는 복호화 엔진의 서로 다른 변형 내에서 기본적인 패턴을 찾아 이러한 악성코드를 안정적으로 감지하기 위해 정교한 패턴 분석을 사용한다.

2. 2. 에뮬레이션을 통한 탐지

에뮬레이션은 악성 코드가 가상 환경에서 스스로 디스멩글하게 함으로써 다형성 난독화를 무력화하는 데 사용될 수 있다. 이러한 가상 환경을 샌드박스라고 부른다.[3] 복호화된 페이로드가 복호화 알고리즘의 변형에 관계없이 동일하게 유지되는 경우 다형성은 이러한 에뮬레이션으로부터 바이러스를 보호하지 못한다.[3]

2. 3. 변형 코드와의 결합

변형 코드 기술은 바이러스가 감염될 때마다 식별 가능한 코드 블록이 메모리에 전혀 없이 실행될 수 있도록 하여 감지를 더욱 복잡하게 만든다. 이는 다형성 코드보다 더 발전된 형태로, 감염될 때마다 코드 자체를 완전히 재작성한다.

3. 다형성 암호화

다형성 코드는 암호화 알고리즘 생성에도 사용될 수 있다.[5] 이 코드는 온라인 서비스 StringEncrypt에 의해 생성된다.

3. 1. StringEncrypt

StringEncrypt[5]와 같은 온라인 서비스는 문자열이나 파일 내용을 임의의 암호화 명령으로 암호화하고, 다양한 프로그래밍 언어로 다형성 복호화 코드를 생성한다. 다음은 C/C++ 코드 예시이다.

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

4. 역사

최초로 알려진 다형성 바이러스는 1990년 마크 워시번(Mark Washburn)이 작성한 1260이다.[1]

4. 1. 다크 어벤저

1992년, 해커 다크 어벤저는 백신 소프트웨어의 패턴 인식을 피하기 위한 수단으로 다형성 바이러스를 제작했다.[1] 일반적이고 매우 치명적인 다형성 바이러스로는 파일 감염자 Virut이 있다.[1]

4. 2. Virut

일반적이고 매우 치명적인 다형성 바이러스에는 파일 감염자인 Virut이 있다.[1]

5. 예시

아래 예시는 실제 다형성 코드는 아니지만 XOR 연산자를 통해 암호화의 원리를 간략하게 보여준다. 예를 들어 변수 C를 사용하지 않고 변수 A와 B를 사용하는 알고리즘의 경우, C를 변경하는 코드를 추가하면 알고리즘 자체에는 영향을 미치지 않으면서 최종 결과는 그대로 유지할 수 있다.

이 외에도, NOP(아무것도 하지 않음) 명령어를 적절히 삽입하는 등의 다형성 기술이 있다.

5. 1. 의사 코드 예시

다음은 의사 코드로, 암호화된 코드의 일부를 해독하여 실행하는 코드이다.

```

시작:

Decryption_Code로 이동

Encrypted:

...

암호화된 코드 열

...

Decryption_Code:

A = Encrypted

Loop:

B = *A

B = B XOR CryptoKey

  • A = B

A = A + 1

A = Decryption_Code가 아니면 Loop로 이동

Encrypted로 이동

CryptoKey:

어떤 난수

```

위 코드는 변수 C를 사용하지 않고, XOR 연산자를 이용하여 암호화를 수행한다. Decryption_Code와 CryptoKey 사이의 코드를 통해 암호화된 코드를 해독하고, 변수 A와 B를 사용하여 실행한다.

다음은 위와 동일한 코드를 불필요한 변수 C를 추가하여 위장한 예시이다.

```

시작:

Decryption_Code로 이동

Encrypted:

...

암호화된 코드 열

...

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

A = Decryption_Code가 아니면 Loop로 이동

C = C^2

Encrypted로 이동

CryptoKey:

어떤 난수

```

"Encrypted" 이하의 암호화된 코드를 해독하여 실행할 때, Decryption_Code와 CryptoKey 사이의 코드를 조사하고, 변수 C를 변경하는 부분을 삭제한다. 이후 암호화할 때 C를 변경하는 불필요한 코드를 새로 생성한다. 보통 처음에는 암호 키로 0을 사용하는데, 이렇게 하면 해독 시에 아무런 변화가 없어 암호화되지 않은 일반적인 코드와 동일하게 유지된다. 이후 1회 실행 시 새로운 암호 키를 생성하는 방식으로 암호화한다.

이 외에도, NOP(아무것도 하지 않음) 명령어를 적절히 삽입하는 등의 다형성 기술이 있다.

5. 2. C/C++ 코드 예시 (StringEncrypt)

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

```[5]

5. 3. 불필요한 변수 추가

XOR 연산자를 통해 암호화하는 예시에서, 변수 C는 알고리즘에 영향을 주지 않으면서 코드 분석을 어렵게 만들 수 있다. 예를 들어, 변수 A와 B를 사용하는 알고리즘에서 C를 변경하는 코드를 추가하면, 최종 결과에는 영향을 미치지 않지만 코드 분석은 훨씬 어려워진다.

아래는 불필요한 변수 C를 추가하여 위장한 의사 코드 예시이다.

```text

시작:

Decryption_Code로 이동

Encrypted:

...

암호화된 코드 열

...

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

A = Decryption_Code가 아니면 Loop로 이동

C = C^2

Encrypted로 이동

CryptoKey:

어떤 난수

```

"Encrypted" 이하의 암호화된 코드를 해독하여 실행할 때, Decryption_Code와 CryptoKey 사이의 코드를 조사하고, 변수 C를 건드리는 부분을 삭제한다. 이후 다시 암호화할 때 C를 건드리는 불필요한 코드를 새로 생성한다. 일반적으로 처음에는 암호 키로 0을 사용하는데, 이렇게 하면 해독 시에 아무런 변화가 없어 암호화되지 않은 일반적인 코드 그대로 남는다. 이를 1회 실행할 때 새로운 암호 키를 생성하는 방식으로 암호화한다.

5. 4. NOP 명령어 삽입

NOP 명령어는 코드 실행 결과에 영향을 주지 않으면서 코드의 형태를 변경하기 위해 코드 중간에 삽입되는 명령어이다.[1]

참조

[1] 학위논문 Protecting anti-virus software under viral attacks Arizona State University 2007
[2] 학술지 Hunting for Metamorphic Engines 2006
[3] 학위논문 Protecting anti-virus software under viral attacks https://pdfs.semanti[...] Arizona State University 2007
[4] 학술지 Hunting for Metamorphic Engines http://www.truststc.[...] Department of Computer Science, San Jose State University 2006
[5] 웹사이트 String & File Encryption https://www.stringen[...] 2015



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com