JunkCode – 프로세스 역분석 보호

JunkCode – 프로세스 역분석 보호

정크 코드는 단어 그대로 불필요한 코드를 삽입하여 분석을 어렵게 만드는 용도로 이용된다. 중요한 코드의 실행 전/후나 프로그램 중간 중간에 아래 코드를 삽입하면 불필요 코드가 삽입되면서 프로그램 분석을 어렵게 만들수 있다. 이러한 불필요 코드를 만드는 방법은 간단하다. 먼저 기존 레지스터의 값을 스택에 저장해 놓은 후 해당 레지스터를 이용하여 여러 연산을 진행한다. 이후 스택에 저장해 놓은 레지스터를 복원하는 방식으로 정크 코드를 작성하면 된다. 단 주의할 점은 2부에서 배웠듯이 일부 연산 결과는 항상 특정 레지스터를 이용하여 저장하게 되므로, 연산 명령별 특성을 잘 고려해서 프로그램 코드를 수정하지 않도록 구성하기 바란다.

그럼 예제를 통해 확인해 보자.

junkcode.cpp
#include
<stdio.h>
#include
<windows.h>#define JUNK_CODE_1        \

__asm{PUSH ECX}        \

__asm{MOV ECX, 3}    \

__asm{PUSH EAX}        \

__asm{XOR EAX, EAX}    \

__asm{ADD EAX, 10}    \

__asm{XCHG EAX, ECX}    \

__asm{POP EAX}        \

__asm{OR EAX, ECX}    \

__asm{POP ECX}        \

#define JUNK_CODE_2        \

__asm{PUSH EAX}        \

__asm{MOV EAX, 5}    \

__asm{PUSH EBX}        \

__asm{XOR EBX, ECX}    \

__asm{ADD EBX, 10}    \

__asm{XCHG EBX, EDX}    \

__asm{POP EBX}        \

__asm{OR EAX, EBX}    \

__asm{POP EAX}        \

#define JUNK_CODE_3        \

__asm{PUSH EDX}    \

__asm{MOV EDX, 3}    \

__asm{PUSH EBX}        \

__asm{XOR BX, AX}    \

__asm{ADD EDX, 10}    \

__asm{XCHG DX, CX}    \

__asm{POP EDX}        \

__asm{MOV BX, AX}    \

__asm{POP EBX}        \

void main()

{

JUNK_CODE_3

JUNK_CODE_1

printf(“Hello1”);

JUNK_CODE_2

JUNK_CODE_1

printf(“Hello2”);

JUNK_CODE_3

JUNK_CODE_2

printf(“Hello3”);

return;

}

[예제] 정크 코드를 추가한 Hello 출력 예제

위 예제 프로그램은 3가지 패턴의 정크 코드를 이용해 본문에서 여러 번 반복하여 사용하고 있다.

만약 정크 코드를 넣지 않았다면, 프로그램은 매우 단순하므로 분석 역시 아주 쉽게 이루어지게 된다. 다음은 비교를 위해 정크 코드가 제거된 버전과 추가된 버전을 Ollydbg를 이용해 확인해본 결과이다.

↓정크 코드를 추가하지 않은 상태, 코드가 간결하다. 아래는 정크 코드를 추가하였을 때의 상황이다.

[그림] 정크코드를 추가하여 분석를 어렵게 할 수 있다

예제에서 보여준 정크 코드는 비교적 쉬운 코드들로 작성되었고, 프로그램 구분이 짧아 분석이 쉬웠을 것이다. 여기에 정크 코드 패턴을 늘리고, 복잡한 어셈블리 명령을 삽입과 여러 패턴으로 기입하여 앞서 애기한 패커들과 더불어 사용하면 프로그램 보호 효과를 더욱 높일 수 있을 것이다. 요즘 역분석 트랜드는 분석자를 지치게 하자는 개념이 많은 만큼 이 분야에 대해서 연구해 볼 가치가 있다.

 

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.