# 게임가드 비활성화 방법 (소스코드 내장 기능)

**분석 날짜**: 2025-11-29
**대상**: NeoRylClient 게임가드 비활성화 메커니즘

---

## 개요

NeoRylClient 소스코드에는 **개발 및 테스트 목적**으로 게임가드를 비활성화할 수 있는 여러 방법이 내장되어 있습니다.

---

## 1. 빌드 모드별 자동 비활성화 (가장 간단)

### DEBUG 빌드 시 자동 비활성화

**파일**: `RYLClient/RYLClient/RYLClientMain.cpp:455-461`

```cpp
#ifdef NDEBUG
    m_wAdminMode = ADMIN_NONE;      // 일반유저 (Release 빌드)
    m_bUDPInfo = false;
#else
    m_wAdminMode = ADMIN_L3;        // 관리자 (Debug 빌드)
    m_bUDPInfo = true;
#endif
```

**동작 방식**:
- **Release 빌드** (`NDEBUG` 정의됨): `m_wAdminMode = ADMIN_NONE` → 게임가드 **활성화**
- **Debug 빌드** (`NDEBUG` 미정의): `m_wAdminMode = ADMIN_L3` → 게임가드 **비활성화**

**사용 방법**:
1. Visual Studio에서 빌드 설정을 **Debug**로 변경
2. 프로그램 실행 → 게임가드가 자동으로 비활성화됨

**확인 방법**:
```cpp
// 게임가드 초기화 함수에서 체크
if (GameRYL::SERVER_BATTLE_LOHAN != m_eServerType &&
    ADMIN_L3 != g_ClientMain.m_wAdminMode)
{
    // 게임가드 활성화
}
else
{
    // 게임가드 비활성화 (ADMIN_L3이므로)
}
```

---

## 2. 관리자 레벨 설정 (런타임 제어)

### AdminLevelMode 열거형

**파일**: `RYLClient/RYLClient/RYLClientMain.h:20-28`

```cpp
enum AdminLevelMode
{
    ADMIN_NONE = 0,     // 일반 사용자 - 게임가드 활성화
    SUPPORTER = 1,      // 서포터
    ADMIN_L1 = 2,       // 관리자 레벨 1
    ADMIN_L2 = 3,       // 관리자 레벨 2
    ADMIN_L3 = 4,       // 관리자 레벨 3 - 게임가드 비활성화
    ADMIN_DEV = 5,      // 개발자
};
```

### 사용 위치

**HackShield 초기화** (`RYLNetWorkData.cpp:1307`):
```cpp
if (GameRYL::SERVER_BATTLE_LOHAN != CRYLNetworkData::Instance()->m_eServerType &&
    ADMIN_L3 != g_ClientMain.m_wAdminMode)
{
#ifdef ON_HACKSHIELD
    // HackShield 초기화
    _AhnHS_Initialize(...);
#endif
}
// ADMIN_L3이면 이 블록을 건너뛰어 HackShield 비활성화
```

**HackShield 시작** (`RYLNetWorkData.cpp:1397`):
```cpp
if (GameRYL::SERVER_BATTLE_LOHAN != m_eServerType &&
    ADMIN_L3 != g_ClientMain.m_wAdminMode)
{
    _AhnHS_StartService();
}
// ADMIN_L3이면 서비스 시작 안 함
```

**HackShield 종료** (`RYLNetWorkData.cpp:1429`):
```cpp
if (GameRYL::SERVER_BATTLE_LOHAN != m_eServerType &&
    ADMIN_L3 != g_ClientMain.m_wAdminMode)
{
    _AhnHS_StopService();
}
```

### 수동 설정 방법

소스코드를 직접 수정하여 강제로 `ADMIN_L3` 모드 활성화:

**방법 1**: 초기화 시 강제 설정
```cpp
// RYLClientMain.cpp CClientMain 생성자
CClientMain::CClientMain()
{
    // 기존 코드 주석 처리하고
    // #ifdef NDEBUG
    //     m_wAdminMode = ADMIN_NONE;
    // #else
    //     m_wAdminMode = ADMIN_L3;
    // #endif

    // 항상 ADMIN_L3로 설정
    m_wAdminMode = ADMIN_L3;  // 게임가드 비활성화
    m_bUDPInfo = true;
}
```

**방법 2**: 특정 조건에서 활성화
```cpp
// 예: 특정 커맨드라인 인자가 있을 때
if (CommandLineContains("--nogameguard"))
{
    g_ClientMain.m_wAdminMode = ADMIN_L3;
}
```

---

## 3. 서버 타입별 비활성화

### 배틀로한 서버에서 자동 비활성화

**파일**: `RYLNetWorkData.cpp:1307`

```cpp
if (GameRYL::SERVER_BATTLE_LOHAN != CRYLNetworkData::Instance()->m_eServerType &&
    ADMIN_L3 != g_ClientMain.m_wAdminMode)
{
    // 게임가드 초기화
}
// SERVER_BATTLE_LOHAN이면 게임가드 비활성화
```

**동작 방식**:
- `m_eServerType == GameRYL::SERVER_BATTLE_LOHAN`일 때 게임가드 비활성화
- 배틀그라운드 테스트 서버에서 개발 편의성 제공

**서버 타입 설정**:
```cpp
// RYLNetworkData에서 서버 타입 설정
m_eServerType = GameRYL::SERVER_BATTLE_LOHAN;
```

---

## 4. 컴파일 타임 매크로 (빌드 설정)

### NO_GAMEGUARD 매크로

**파일**: `GlobalScript/GlobalScript.vcxproj:146`

```xml
<PreprocessorDefinitions>
    WIN32;NDEBUG;_LIB;_RYL_GAME_CLIENT_;NO_GAMEGUARD;ON_HACKSHIELD
</PreprocessorDefinitions>
```

**적용**:
```cpp
#ifndef NO_GAMEGUARD
    m_lpNPGameLib = new CNPGameLib(szGameGuardString);
    // GameGuard 초기화
#endif
// NO_GAMEGUARD가 정의되면 이 블록 전체가 컴파일에서 제외됨
```

**사용 방법**:
1. 프로젝트 속성 → C/C++ → 전처리기 → 전처리기 정의
2. `NO_GAMEGUARD` 추가
3. 재빌드

**결과**: GameGuard 관련 코드가 완전히 제거된 실행 파일 생성

### ON_HACKSHIELD 매크로

```cpp
#ifdef ON_HACKSHIELD
    // HackShield 초기화
    _AhnHS_Initialize(...);
#endif
// ON_HACKSHIELD가 정의되지 않으면 HackShield 비활성화
```

**사용 방법**:
1. `ON_HACKSHIELD` 매크로 제거
2. 재빌드

### USE_ANTIHACK 매크로

**파일**: `RYLClient/RYLClient/RYLClientMain.cpp:56`

```cpp
#define USE_ANTIHACK 0  // 0: 비활성화, 1: 활성화
#include "..\\AntiHack.h"
DECLARE_ANTIHACK();
```

**현재 상태**: `USE_ANTIHACK = 0`으로 이미 비활성화됨

---

## 5. 빌드 설정별 게임가드 상태

| 빌드 설정 | NDEBUG | NO_GAMEGUARD | ON_HACKSHIELD | m_wAdminMode | GameGuard | HackShield |
|-----------|--------|--------------|---------------|--------------|-----------|------------|
| **Debug** | 미정의 | 미정의 | 미정의 | ADMIN_L3 | ✅ 코드 존재하나 실행 안됨 | ❌ 비활성화 |
| **Debug_MY** | 미정의 | 미정의 | 미정의 | ADMIN_L3 | ✅ 코드 존재하나 실행 안됨 | ❌ 비활성화 |
| **Release** | 정의됨 | 미정의 | 미정의 | ADMIN_NONE | ✅ 활성화 | ❌ 비활성화 |
| **Release_MY** | 정의됨 | 정의됨 | 정의됨 | ADMIN_NONE | ❌ 코드 제거됨 | ✅ 활성화 |
| **Release_NoGD** | 정의됨 | 정의됨 | 정의됨 | ADMIN_NONE | ❌ 코드 제거됨 | ✅ 활성화 |

---

## 6. 실전 사용 시나리오

### 시나리오 1: 개발 중 게임가드 없이 테스트

**방법**: Debug 빌드 사용
```
1. Visual Studio에서 빌드 설정을 "Debug"로 변경
2. F5로 실행 또는 Ctrl+F5로 디버깅 없이 실행
3. 자동으로 m_wAdminMode = ADMIN_L3 설정
4. 게임가드 비활성화 상태로 실행
```

### 시나리오 2: Release 빌드에서도 게임가드 비활성화

**방법 1**: 소스 코드 수정
```cpp
// RYLClientMain.cpp 생성자에서
CClientMain::CClientMain()
{
    // 강제로 ADMIN_L3 설정
    m_wAdminMode = ADMIN_L3;
}
```

**방법 2**: 커맨드라인 인자 추가
```cpp
// main 함수나 WinMain에서
int APIENTRY WinMain(...)
{
    // 커맨드라인 파싱
    if (strstr(lpCmdLine, "/nogameguard") != NULL)
    {
        g_ClientMain.m_wAdminMode = ADMIN_L3;
    }
}

// 실행 시
Client.exe /nogameguard
```

### 시나리오 3: 특정 빌드만 게임가드 제거

**방법**: 커스텀 빌드 설정 생성
```
1. Configuration Manager에서 새 설정 추가 "Release_NoAntiCheat"
2. 전처리기 정의에 "NO_GAMEGUARD;NO_HACKSHIELD" 추가
3. 해당 설정으로 빌드
```

---

## 7. 코드 위치 참조

### GameGuard 비활성화 체크 위치

| 기능 | 파일 | 라인 | 조건 |
|------|------|------|------|
| GameGuard 생성 | RYLNetWorkData.cpp | 70-79 | `#ifndef NO_GAMEGUARD` |
| GameGuard 초기화 | RYLNetWorkData.cpp | 1447+ | `ADMIN_L3 != m_wAdminMode` |
| HackShield 초기화 | RYLNetWorkData.cpp | 1307 | `ADMIN_L3 != m_wAdminMode` |
| HackShield 시작 | RYLNetWorkData.cpp | 1397 | `ADMIN_L3 != m_wAdminMode` |
| HackShield 종료 | RYLNetWorkData.cpp | 1429 | `ADMIN_L3 != m_wAdminMode` |
| AdminMode 설정 | RYLClientMain.cpp | 455-461 | `#ifdef NDEBUG` |
| AntiHack 활성화 | RYLClientMain.cpp | 56 | `USE_ANTIHACK` |

### 핵심 조건문

**게임가드 활성화 조건**:
```cpp
if (GameRYL::SERVER_BATTLE_LOHAN != m_eServerType &&  // 배틀로한 서버가 아니고
    ADMIN_L3 != g_ClientMain.m_wAdminMode)             // ADMIN_L3이 아닐 때
{
    // 게임가드 활성화
}
else
{
    // 게임가드 비활성화
}
```

**비활성화 조건 (OR 관계)**:
1. `m_eServerType == GameRYL::SERVER_BATTLE_LOHAN` **또는**
2. `m_wAdminMode == ADMIN_L3`

---

## 8. 주의사항

### 보안 위험

**문제점**:
```cpp
// Debug 빌드면 무조건 ADMIN_L3
#ifdef NDEBUG
    m_wAdminMode = ADMIN_NONE;
#else
    m_wAdminMode = ADMIN_L3;  // 게임가드 완전 비활성화!
#endif
```

**위험성**:
1. Debug 빌드를 배포하면 게임가드 없는 클라이언트 유출
2. 소스코드 접근 가능자가 쉽게 비활성화 가능
3. `m_wAdminMode` 값만 메모리에서 변경하면 우회 가능

### 메모리 수정 취약점

**공격 시나리오**:
```
1. 프로세스 메모리에서 m_wAdminMode 위치 찾기
2. 값을 ADMIN_NONE(0)에서 ADMIN_L3(4)로 변경
3. 게임가드 즉시 비활성화
```

**대응 방안**:
```cpp
// 안전한 방법: 서버에서 관리자 레벨 검증
bool IsAdminLevel3()
{
    // 서버에서 받은 권한 레벨 확인
    return ServerValidatedAdminLevel >= ADMIN_L3;
}

if (GameRYL::SERVER_BATTLE_LOHAN != m_eServerType &&
    !IsAdminLevel3())  // 서버 검증된 값 사용
{
    // 게임가드 활성화
}
```

### 빌드 설정 관리

**권장 사항**:
1. **Release 빌드는 항상 게임가드 활성화**
2. **Debug 빌드는 내부 개발용으로만 사용**
3. **배포용 빌드에는 NO_GAMEGUARD 제거**
4. **관리자 권한은 서버 인증 후에만 부여**

---

## 9. 개발자를 위한 팁

### 개발 중 게임가드 우회 (합법적)

**목적**: 디버깅 및 테스트

**방법 1**: Debug 모드 사용
```
장점: 소스 수정 불필요, 간단
단점: Debug 빌드라 성능 저하
```

**방법 2**: 조건부 컴파일
```cpp
#ifdef DEVELOPER_BUILD
    m_wAdminMode = ADMIN_L3;
#endif
```

**방법 3**: 환경 변수 체크
```cpp
char* devMode = getenv("ROW_DEV_MODE");
if (devMode != NULL && strcmp(devMode, "1") == 0)
{
    m_wAdminMode = ADMIN_L3;
}

// 실행 전에
set ROW_DEV_MODE=1
Client.exe
```

### HackShield 일시 정지 (API 지원)

**HackShield는 Pause/Resume 기능 제공**:

```cpp
// 일시 정지 (특정 기능만)
_AhnHS_PauseService(AHNHS_CHKOPT_MESSAGEHOOK);

// 작업 수행
DoSomethingThatTriggersHackShield();

// 재개
_AhnHS_ResumeService(AHNHS_CHKOPT_MESSAGEHOOK);
```

**주의**: 현재 소스코드에서는 사용되지 않음

---

## 10. 정리

### 가장 쉬운 방법 (개발자용)

1. **Debug 빌드로 실행**
   - 소스 수정 불필요
   - 자동으로 ADMIN_L3 설정
   - 게임가드 완전 비활성화

### 가장 안전한 방법 (프로덕션용)

1. **Release 빌드 사용**
2. **NO_GAMEGUARD 매크로 제거**
3. **ADMIN_L3 권한은 서버에서 검증**
4. **배포 전 빌드 설정 확인**

### 빠른 참조

| 비활성화 방법 | 난이도 | 영구성 | 보안 위험 |
|---------------|--------|--------|-----------|
| Debug 빌드 | ⭐ 매우 쉬움 | 빌드 단위 | 🔴 높음 (배포 시) |
| m_wAdminMode 수정 | ⭐⭐ 쉬움 | 영구적 | 🔴 매우 높음 |
| NO_GAMEGUARD 매크로 | ⭐⭐ 쉬움 | 영구적 | 🔴 매우 높음 |
| 서버 타입 변경 | ⭐⭐⭐ 보통 | 영구적 | 🟡 보통 |
| 커맨드라인 인자 | ⭐⭐⭐ 보통 | 실행 단위 | 🟡 보통 |

---

**작성 날짜**: 2025-11-29
**목적**: 개발 및 테스트 편의성 제공
**경고**: 프로덕션 환경에서는 게임가드를 절대 비활성화하지 마세요!
