VMProtect

안상준·2025년 5월 21일

VMProtect

목록 보기
1/6

VMProtect 공식 manual 살펴보기

Introduction

먼저 VMProtect는 Anti-Reversing 적용을 통해 소프트웨어를 보호하는 프로그램 이다.

Glossary

  • Bytecode : 실제 프로세서의 명령을 가상 머신의 명령으로 변환한 코드
  • Virtualiation : 명령 체계, 아키텍처, 로직을 가상머신의 명령으로 변환하는 프로세서. 변환된 가상 명령어들은 인터프리터에 의해 실행된다.
  • Watermark : 해킹된 프로그램의 합벅적 소유자를 확실히 식별할 수 있게 해주는 각 사용자마다 고유한 바이트 배열
  • Mutation : 원래 명령을 아날로그 명령이나 동일한 결과를 생성하는 특정 명령 세트로 교체하는 것
  • Packing : 프로그램 또는 라이브러리의 실행 파일을 비정형 알고리즘을 사용하여 압축하여 프로그램 코드를 보호하는 방법.

VMProtect

Compiler

  • Delphi
  • Borland C++ Builder
  • Visaul C/C++
  • Visual Basic(native)
  • Visual Pascal
  • Xcode

장점

  • 가상화된 코드 조각을 실행하는 가상 머신이 보호된 애플리케이션의 결과 코드 안에 내장된다 -> 별도의 외부 라이브러리나 모듈 없이도 동작이 가능
  • 하나의 애플리케이션 내의 서로 다른 코드 조각들을 각각 다른 가상 머신으로 보호하는 기능도 제공 -> 해킹 과정이 복잡하짐

특징

  • 어플리케이션 코드 변형 방식은 난독화를 기반(garbage, dead, random jumps)
  • 스택 기반 실행 -> 제어흐름 은닉, 정적 분석 방해
  • 어플리케이션 코드에 워트마크를 삽입 -> 해킹된 프로그램의 공식 소유자를 명확하게 식별이 가능

Edition

에디션은 Lite, Professional, Ultimate가 존재
각 에디션별 사용 가능한 기능들

Protect Project

비밀번호를 입력하고 맞는지 확인하는 간단한 코드를 이용하여 보호기법을 적용하는 예시 설명

Code


입력한 번호를 17로 나눈 나머지가 13이면 올바른 번호

보호 절차

위 코드를 보호할 기능에 대해서 소개

1. PDB/MAP 파일을 이용한 보호

컴파일러가 코드를 컴파일 하는 과정을 통해 모든 함수의 이름, 시작 주소, 크기 정보를 담은 .map/.pdb 파일을 생성
VMProtect GUI를 통해 보호할 함수를 지정할 수 있다.

2. 소스 코드에 마커 삽입


다음과 같은 마커를 삽입하여 특정 함수 일부만 보호할 수 있다.

3. 실행 파일(exe)에서 직접 주소 지정

보호하고 싶은 범위를 주소로 입력하여 보호하는 방식

정리

VMProtect에서 보호할 함수를 지정할 수 있다.
세 가지 방식이 있지만 PDB/MAP 방식을 이용한 보호 방식을 추천
마커나 주소 지정 방식의 경우 함수의 prologue/epilogue가 보호가 되지 않는 경우가 있어 우회 가능성이 있다.

SDK Marker

Protet Code

VMProtect Begin

void VMProtectBegin(const char *MarkerName);

VMProtect에서 설정한 기본 보호 기법 적용

VMProtectBeginVirtualization

void VMProtectBeginVirtualization(const char *MarkerName);

가상화 영역 시작을 식별하는 마커

void VMProtectBeginVirtualizationLockByKey(const char *MarkerName);

Virtualization + Serial Number Lock 보호 기법 적용

VMProtectBeginMutation

void VMProtectBeginMutation(const char *MarkerName);

코드 변형 영역을 식별하는 마커

VMProtectBeginUltraLockByKey(const char *MarkerName);

Ultra + Serial Number Lock 보호 기법 적용

VMProtectBeginUltra

void VMProtectBeginUltra(const char *MarkerName);

Ultra 보호 기법 적용(Virtualization + Control Flow Flattening + Random jumps, fake handlers, opaque predicates)

Anti-Debugging/Anti-VM

VMProtectIsProtected

bool VMProtectIsProtected(void);

현재 실행 중인 바이너리가 VMProtect로 실제로 보호되었는지 여부 확인

VMProtectIsDebuggerPresent

bool VMProtectIsDebuggerPresent(bool CheckKernelMode);

현재 어플리케이션이 디버거에 의해 분석되고 있는지 확인

VMProtectIsVirtualMachinePresent

bool VMPfrotectIsVirtualMachinePresent(void);

현재 환경이 VMWare, VirtualBox, Sandboxie 같은 가성 머신인지 여부 탐지

VMProtectValidImageCRC

bool VMProtectIsValidImageCRC(void);

실행 중인 프로세스의 코드 섹션이 훼손되었는지 감지

문자열 암호화/복호화 함수

VMProtectDecryptStringA

const char * VMProtectDecryptStringA(const char *Value);

ANSI 문자열을 런타임에 복호화
평문을 숨김으로써 리버싱으로 부터 보호

VMProtectDecryptStringW

const wchar_t * VMProtectDecryptStringW(const wchar_t *Value);

유니코드 문자열을 런타임에 복호화

VMProtectFreeString

bool VMProtectFreeString(const void *Value);

DecryptStringA/W로 복호화된 문자열을 메모리에서 안전하게 제거
복호화된 문자열이 노출되지 않도록 하기 위함

GUI

섹션


Project 섹션

Functions 섹션

Details 섹션

License


사용자가 입력한 정보를 기반으로 라이선스 키를 생성
위에서 사용한 시리얼 번호를 입력하여 보호하는 기법에 사용된다.

Add Function


보호할 함수를 선택이 가능, 기법은 Virtualization, Mutation, Ultra 세 가지

복잡도 선택도 가능

File Section


파일 섹션을 통해 보호된 EXE 파일에 이미지, 데이터 파일, 텍스트 리소스, 동적 연결 라이브러리 추가 가능

Script Section


스크립트 추가가 가능하다

Option Section

출처 : https://vmpsoft.com/vmprotect/user-manual

0개의 댓글