VMProtect 공식 manual 살펴보기
먼저 VMProtect는 Anti-Reversing 적용을 통해 소프트웨어를 보호하는 프로그램 이다.
에디션은 Lite, Professional, Ultimate가 존재
각 에디션별 사용 가능한 기능들

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

입력한 번호를 17로 나눈 나머지가 13이면 올바른 번호
위 코드를 보호할 기능에 대해서 소개
컴파일러가 코드를 컴파일 하는 과정을 통해 모든 함수의 이름, 시작 주소, 크기 정보를 담은 .map/.pdb 파일을 생성
VMProtect GUI를 통해 보호할 함수를 지정할 수 있다.


다음과 같은 마커를 삽입하여 특정 함수 일부만 보호할 수 있다.
보호하고 싶은 범위를 주소로 입력하여 보호하는 방식
VMProtect에서 보호할 함수를 지정할 수 있다.
세 가지 방식이 있지만 PDB/MAP 방식을 이용한 보호 방식을 추천
마커나 주소 지정 방식의 경우 함수의 prologue/epilogue가 보호가 되지 않는 경우가 있어 우회 가능성이 있다.
void VMProtectBegin(const char *MarkerName);
VMProtect에서 설정한 기본 보호 기법 적용
void VMProtectBeginVirtualization(const char *MarkerName);
가상화 영역 시작을 식별하는 마커
void VMProtectBeginVirtualizationLockByKey(const char *MarkerName);
Virtualization + Serial Number Lock 보호 기법 적용
void VMProtectBeginMutation(const char *MarkerName);
코드 변형 영역을 식별하는 마커
VMProtectBeginUltraLockByKey(const char *MarkerName);
Ultra + Serial Number Lock 보호 기법 적용
void VMProtectBeginUltra(const char *MarkerName);
Ultra 보호 기법 적용(Virtualization + Control Flow Flattening + Random jumps, fake handlers, opaque predicates)
bool VMProtectIsProtected(void);
현재 실행 중인 바이너리가 VMProtect로 실제로 보호되었는지 여부 확인
bool VMProtectIsDebuggerPresent(bool CheckKernelMode);
현재 어플리케이션이 디버거에 의해 분석되고 있는지 확인
bool VMPfrotectIsVirtualMachinePresent(void);
현재 환경이 VMWare, VirtualBox, Sandboxie 같은 가성 머신인지 여부 탐지
bool VMProtectIsValidImageCRC(void);
실행 중인 프로세스의 코드 섹션이 훼손되었는지 감지
const char * VMProtectDecryptStringA(const char *Value);
ANSI 문자열을 런타임에 복호화
평문을 숨김으로써 리버싱으로 부터 보호
const wchar_t * VMProtectDecryptStringW(const wchar_t *Value);
유니코드 문자열을 런타임에 복호화
bool VMProtectFreeString(const void *Value);
DecryptStringA/W로 복호화된 문자열을 메모리에서 안전하게 제거
복호화된 문자열이 노출되지 않도록 하기 위함

Project 섹션

Functions 섹션

Details 섹션


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

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

복잡도 선택도 가능

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

스크립트 추가가 가능하다
