Skip to content
스토브
마지막 업데이트

보안

이해하기


스토브 Security SDK는 게임 앱의 변조·해킹 시도를 탐지하고 주요 메모리 데이터를 보호하는 보안 서비스예요.
모바일(Android/iOS) 환경을 위한 스토브 Mobile Security SDK와 PC(Windows) 환경을 위한 스토브 PC Security SDK로 구성돼요.

SDK 종류

두 가지 SDK는 제공 환경과 탐지 방식이 다르므로, 게임 플랫폼에 맞는 SDK를 선택해야 해요.

SDK 지원 환경 주요 역할
스토브 Mobile Security SDK Android / iOS App 변조·해킹 환경 탐지, 주요 메모리 데이터 보호, Native 파일 암호화
스토브 PC Security SDK Windows 실행파일·DLL 무결성 검증, 커널 드라이버 감시, 보안 Trap 및 난독화 기술 적용

주요 보안 기능

두 SDK가 공통으로 제공하는 핵심 보안 기능은 아래와 같아요.

기능 설명
파일 변조 탐지 실행코드가 있는 파일의 변조 여부를 탐지
메모리 실행코드 변조 탐지 Memory 영역의 실행코드 변조 여부를 탐지
주요 메모리 데이터 보호 보안변수 적용으로 메모리의 데이터 검색과 조작을 무력화.
메모리값 조작으로 게임에 영향을 미치는 모든 변수에 적용 가능
Hacking Tool 탐지 Memory 변조, Rooting/Jailbreak 탐지 우회 등을 하는 Tool을 탐지
코드 난독화·암호화 난독화, 암호화가 적용되어 리버싱(바이너리 분석)을 어렵게 하는 기술과 탐지 우회 방지 기술 적용
보안 Trap 조작에 대해 다계층 검증으로 변조 여부를 탐지
예외처리 지원 특정 이용자에 한해 보안 기능을 Off할 수 있는 기능을 지원
게임 서버 연동 보안 게임 프로토콜과 보안서버의 연동으로 높은 보안성 제공
Live Update 앱 업데이트 없이 CDN을 통해 보안 SDK를 업데이트. Lazy Update·Configure Update 지원
실시간 로그 Dashboard 탐지 로그에 대한 실시간 Dashboard 제공

추가 탐지 기능

  • Mobile SDK 스토브 Mobile Security SDK는 모바일 환경에 특화된 추가 탐지 기능을 제공해요.
    기능 설명
    Native 파일 암호화 Android 환경의 Native 파일(.so 등) 암호화 지원.
    Unreal Engine, Unity 등의 게임 엔진 암호화 지원
    악의적인 환경 탐지 Rooting/Jailbreak, Security Folder(삼성 보안폴더), Dual App(Parallel Space) 등 악의적 실행 환경을 탐지
    Emulator 환경 탐지 Emulator 환경에서의 App 실행 여부를 탐지
    Macro(Auto Clicker) 탐지 게임에서 의도하지 않은 Touch 자동화를 탐지 (SDK 2.7.0 이상)
    VPN 환경 탐지 디바이스가 VPN에 연결되어 있는지 탐지
    USB/Wifi Debugging 설정 탐지 개발자 옵션의 USB/Wifi Debugging 연결 설정이 Enable 되어 있는지 탐지
    주요 데이터 암호화 앱에서 사용하는 Asset File을 암호화하고 사용할 때 실시간으로 복호화 (SDK 2.6.0 이상).
    앱 실행 시 실시간으로 사용(생성)되는 File을 실시간으로 암/복호화
    패킷 탈취 탐지 (지원예정) Proxy 설정 여부를 통한 패킷 탈취 환경을 탐지

  • PC SDK 스토브 PC Security SDK는 PC 환경에 특화된 추가 탐지 기능을 제공해요.
    기능 설명
    DLL 무결성 감시 외부 프로그램 또는 공격적인 디버거/조작 도구에 의해 DLL이 강제로 Detach(Unload) 또는 훼손되는지 실시간으로 감시.
    설정된 "타깃 DLL 목록" 기준으로 정상 로드 여부를 지속적으로 점검
    드라이버 무결성 감시 커널 모드에서 동작하는 당사 드라이버가 외부 프로세스나 툴에 의해 실행·중지·언로드되는 시도를 감지.
    외부에서 드라이버를 강제 언로드하거나 서비스 상태를 조작할 경우 탐지
    매크로/자동화 탐지 이용자의 입력 데이터(마우스, 키보드, 터치 입력 포함)를 수집하여 서버로 전송해 분석.
    최적화된 데이터 포맷을 사용하여 효율적인 전송을 수행

지원범위

SDK 플랫폼 지원 범위
Mobile Security SDK Android Android 7.0 이상 (API Level 24) /
CPU Architecture: x86, x86_64, armeabi-v7a, arm64-v8a /
에뮬레이터(Nox, Memu, Bluestack, LD Player 등)
Mobile Security SDK iOS iOS 13 이상
PC Security SDK Windows Windows 8.1 이상 /
Unreal Engine 4, Unity 지원

SDK 사용 요청

스토브 Mobile Security SDK 및 PC Security SDK를 전달받기 위해서는
퍼블리싱기술팀(sgs_gsd_t@smilegate.com)에 문의하면 App에 맞는 설정 파일 제작 후 Sample 및 Plugin을 전달해 드려요.

연동 가이드


서비스 구성도



보안 SDK의 전체 서비스 구성도는 아래와 같아요.

  • Game Client Security Module을 통해 getChecksum()을 호출해 무결성 데이터를 생성하고, Token과 함께 Game Server로 전달해요.
  • Game Server 수신한 Checksum과 Token을 Security Server에 전달해 무결성을 검증해요.
  • Security Server Token Server에서 Token을 검증하고, 검증 결과(Checksum Verification Result)를 Log Server에 기록해요.
  • CDN Module Management를 통해 보안 SDK를 업데이트해요.
  • Actor Abuser Management와 Checksum Management를 통해 어뷰저를 관리해요.

앱 변조 탐지 결과는 보안서버에서 검증 후 실시간 대시보드로 제공되어 게임 운영자가 수동적 이용자 제재를 할 수 있어요.

App 무결성 검증

클라이언트 보안 모듈에서 생성된 Checksum Data의 검증을 위한 Rest API Server예요.
Security Server 방화벽 정책에 따라 Live server는 ACL 정책 없이 자유롭게 데이터 통신이 가능하며,
Sandbox Server는 Game Server의 IP로 ACL 정책을 적용해 운영해요.

  • 무결성 검증 API는 실시간으로 검증 결과를 알려주는 방식이 아니라, 서버에서 데이터만 전달받은 후 결과는 무조건 성공으로 리턴돼요. 변조 여부는 로그를 이용해 확인하는 방식이에요.
  • 해당 API 호출이 실패(connect 등)하더라도 게임 진행에 영향을 주지 않기 위해서 비동기 방식으로 처리해야 해요.
  • ChecksumData는 기본적으로 게임의 중요 프로토콜(게임입장, 로비이동 등)에 포함하여 프로토콜을 우회하지 못하도록 연동하는 것을 권장해요.
  • 별도의 프로토콜을 이용해 Client로부터 ChecksumData를 전달한다면, 반드시 게임서버에서 일정시간 후에 ChecksumData가 정상적으로 전달되었는지 확인하여 로그를 기록해야 해요(보안 SDK 우회 이용자 확인).
항목 내용
Protocol / HTTP Method HTTP/POST
Content-Type application/json;charset=UTF-8
Sandbox URL http://mgs-iv.gate8.com/api/checksums/verify
Live URL http://mgs-iv.playstove.com/api/checksums/verify
  • Request Body 주요 파라미터 구성
    • packageName(게임 패키지명)
    • gameVersion(게임 버전)
    • userInfo(이용자 정보)
    • checksumData(클라이언트에서 전달받은 checksum값)

보안변수

스토브 Security SDK V2 보안변수 모듈은 메모리에 올라간 게임의 주요 데이터를 보호하는 보안 변수를 제공해요.
보안 변수를 적용함으로써 게임 코드의 주요 메모리에 대한 악의적 검색과 조작을 무력화할 수 있어요.

지원되는 변수 타입은 일반적인 데이터형과 같은 의미를 가지며, GvtWrapper.h를 포함시키면 자동으로 정의돼요.
적용 순서는 SDK 모듈 추가 후 API를 연동하는 두 단계로 구성돼요.

C Type C# Type GvtType size (B) Android iOS Unity Windows
char sbyte CGwChar 1 O O O O
unsigned char byte CGwUChar 1 O O O O
short short CGwShort 2 O O O O
unsigned short ushort CGwUShort 2 O O O O
int int CGwInt 4 O O O O
unsigned int uint CGwUInt 4 O O O O
long long CGwLong 8 O O O O
unsigned long ulong CGwULong 8 O O O O
long long N/A CGwLLong 8 O O N/A O
unsigned long long N/A CGwULLong 8 O O N/A O
float float CGwFloat 4 O O O O
double double CGwDouble 8 O O O O
unsigned double N/A CGwUDouble 8 O O N/A O

참고
보안변수 V2 모듈은 Mobile(Android·iOS·Unity)과 PC(Windows·Unreal·Unity) 양쪽 환경에서 별도 모듈로 제공돼요.
모듈 추가 후 GvtWrapper.h(또는 GvtWrapper.cs)를 포함해 사용해요.
Unity는 64비트 타입 일부(long long / unsigned long long / unsigned double)를 지원하지 않으므로 사용 시 다른 타입으로 대체해 주세요.

보안 설정 상태 조회

스토브 서비스 이용자의 계정 보안 설정 상태 정보를 조회하는 API예요.
로그인 차단, OTP 설정, 지정 PC 사용 여부 등 이용자의 계정 보안 설정 상태를 확인할 수 있어요.
조회한 보안 설정 정보를 기준으로 인게임 내 보안 상태 아이콘 표기, 보안 등급에 따른 혜택 제공 및 기능 제어 로직을 구현할 수 있어요.

  • 기본정보: GET /v1.0/security/setting
  • Host: http://api.onstove.com/auth-secure (LIVE) / http://api.gate8.com/auth-secure (SANDBOX)
보안 설정 항목 (key) 설명
OTP_LOGIN_YN OTP 사용 유무
PC_REGISTER_YN 지정 PC 사용 유무
ABROAD_LOGIN_BLOCK_YN 해외 로그인 차단 사용 유무

SDK 실행 확인

검증 작업 권장
운영 환경에 맞춰 SDK 적용에 대한 별도의 테스트 및 확인 작업이 필요합니다.

개발하기


Mobile Security SDK

사전 준비

Mobile Security SDK 연동 전, 아래 항목을 미리 확인하고 준비해 주세요.

항목 내용 비고
SDK 모듈 Android(jar / so), iOS(framework / bundle), Unreal(Plugin), Unity(unitypackage) 중
게임 환경에 맞는 모듈 선택
퍼블리싱기술팀 전달
선행 연동 스토브 로그인(인증)이 완료된 상태여야 SUI에 이용자 식별자 전달 가능 권장
환경 설정 Sandbox / Live 환경 선택, App ID·게임 패키지명·게임 버전 사전 확인 필수
게임 서버 연동 생성된 ChecksumData를 무결성 검증 API Server로 전달할 수 있는 게임 서버 측 구현 필요 필수
Android Packaging RHAPKTool, keystore, JDK 환경 사전 준비 Android 한정
queries 권한 Native / Unity Android 앱은 AndroidManifest.xml 권한 추가 필요
(설치 App 리스트 확인용)
Unreal은 Plugin Setting에 자동 포함

개발 흐름

Mobile Security SDK의 클라이언트 ↔ 서버 동작 흐름은 아래와 같아요. 클라이언트가 무결성 데이터를 생성한 후 게임 서버를 거쳐 보안 서버로 전달되는 구조예요.


흐름 단계는 크게 네 가지로 나뉘어요.

  1. 초기화 (SUI) : 스토브 로그인 후 발급받은 이용자 식별자를 SDK에 전달해 보안 SDK 이용자 정보를 설정해요. : Detection Log와 Error Log를 전송할 때 이 정보가 포함돼요.
  2. Scan 시작 (Start) : 게임 버전(versionName)을 입력해 SDK 업데이트와 Scan 기능을 동작시켜요. : 호출 후 SDK는 백그라운드에서 변조 탐지를 시작해요.
  3. 무결성 데이터 생성 (GCS) : Start 호출 약 2초 후 GCS를 호출하면 무결성 데이터(ChecksumData)가 반환돼요. : 이 데이터는 게임의 중요 프로토콜(게임 진입, 로비 입장 등)에 포함해 게임 서버로 전송해야 해요.
  4. 서버 측 검증 : 게임 서버는 수신한 ChecksumData를 무결성 검증 API Server(/api/checksums/verify)로 전달해요. : 응답은 항상 success로 리턴되며, 실제 탐지 결과는 보안 서버의 Log를 통해 확인해요.

App 생명주기 대응
앱이 BackGround로 진입할 때 Pause()를 호출해 메모리 변조 탐지를 일시 중지하고, ForeGround로 복귀할 때 Resume()을 호출해 다시 시작해요.
백그라운드 진입 후에도 ChecksumData는 반드시 전달되도록 구성해야 해요.

SDK 우회 이용자 확인 (SDK 2.5.0 이상)
일부 이용자가 SDK 호출 없이 게임 서버에 접근하는 우회 시도를 막기 위해, 게임 첫 진입 시점에 SDK 모듈에서 이용자 정보를 별도 파일(예: BCJUI)로 기록해요.
게임 서버는 일정 시간 후 이 데이터가 정상 전송되었는지 검증하여 우회 이용자를 식별해요.

이용자 터치 이벤트 전달 (SDK 2.7.2 이상)
Macro(Auto Click) 탐지를 위해 이용자 터치 이벤트를 SDK로 전달해야 해요.
iOS는 CustomApplication.hsendEvent를 오버라이드하고, Unity는 빈 GameObject에 StoveSecurityTouchManager 컴포넌트를 바인딩하는 방식으로 연동해요.

트러블슈팅

연동 과정에서 자주 마주치는 케이스와 권장 처리 방법이에요.

상황 원인 권장 처리
GCS 호출 시 빈 데이터 반환 Start 호출 직후 GCS를 즉시 호출하여 SDK 초기화 미완료 상태 Start 호출 후 약 2초 딜레이 후 GCS 호출
백그라운드 복귀 후 탐지 미작동 Resume 미호출로 Memory 영역 탐지가 일시 중지된 상태로 유지 Activity / ViewController 생명주기 콜백에 Pause / Resume 연동
Android Packaging 후 APK 크기 30~35MB 증가 기본 Packaging은 모든 아키텍처(arm64-v8a / armeabi-v7a / x86 / x86_64) 보안 파일 포함 서비스 환경에 맞는 아키텍처 파일과 필수 파일만 포함하여 최적화
iOS Archive 실패 Bitcode 옵션이 활성화된 상태에서 보안 SDK Framework 사용 Build Settings → Enable Bitcode를 No로 설정
설치 App 리스트가 비어있게 수집됨 Android 11+ 패키지 가시성 제한으로 권한이 누락된 상태 AndroidManifest.xml에 권한 추가
Macro 탐지가 동작하지 않음 이용자 터치 이벤트가 SDK로 전달되지 않은 상태 (SDK 2.7.2+) iOS는 sendEvent 오버라이드, Unity는 StoveSecurityTouchManager 바인딩

샘플 코드

각 플랫폼별 SDK 적용 흐름의 핵심 호출 부분이에요.

java
// 1. SDK 인스턴스 생성
private static RHNativeWrapper rhNativeWrapper = new RHNativeWrapper();

// 2. SDK 초기화 (Stove SDK 로그인 후 발급받은 사용자 식별자 전달)
void startSecuritySDK() {
    rhNativeWrapper.SUI("Stove SDK 사용자 식별자");

    // AndroidManifest.xml의 versionName 입력
    PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
    rhNativeWrapper.Start(this, getApplicationContext().getAssets(), pi.versionName, null);
}

// 3. 무결성 데이터 생성 (Start 후 약 2초 뒤 호출)
String getChecksumData() {
    return rhNativeWrapper.GCS();
}

// 4. App 생명주기 연동
@Override
protected void onPause() {
    super.onPause();
    rhNativeWrapper.Pause();
}

@Override
protected void onResume() {
    super.onResume();
    rhNativeWrapper.Resume();
}

// 5. 사용자 터치 데이터 (SDK 2.7.0+, Macro 탐지)
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    rhNativeWrapper.STE(event);
    return super.dispatchTouchEvent(event);
}

Unity Macro 탐지 (SDK 2.7.0+)
Android는 StoveUnityPlayerActivity를 Custom Class로 사용하고 dispatchTouchEvent에서 g_rh_native_api.STE(event)를 호출해요.
iOS는 빈 GameObject에 StoveSecurityTouchManager 컴포넌트를 바인딩해 터치 이벤트를 SDK로 전달해요.

Packaging (Android)

사전 준비

Android 빌드 결과물에 보안 SDK를 적용하려면 RHAPKTool을 통한 Packaging 작업이 필요해요.

항목 내용
RHAPKTool, smali·baksmali·apktool jar, apksigner, JDK
입력 파일 보안 SDK 적용이 완료된 원본 APK/AAB, 서명용 keystore
출력 Packaging이 완료된 APK/AAB(assets/sdata 추가), Checksum 등록용 파일

개발 흐름

Packaging은 packaging.ini 설정과 packaging.bat 실행 두 단계로 동작해요.

  1. packaging.ini 설정 : [config], [package], [apksign], [filesize], [assetencrypt] 섹션별로 경로·옵션 설정. : 게임 엔진 타입(Native / Unity3D / Unreal / Cocos2d), keystore, 서명 옵션, 파일 사이즈 체크, asset 암호화 여부 등을 입력해요.
  2. packaging.bat 실행 : rhapktool -package .\packaging.ini 명령으로 Repackaging 수행. : zipAlign → apksigner 순으로 서명까지 자동 처리돼요.
  3. Packaging 적용 확인 : 결과 APK 내부에 assets/sdata 폴더가 생성되고 보안 SDK 파일들이 추가된 것을 확인해요.
  4. Checksum 등록 (관리 페이지) : Packaging이 완료된 파일을 관리 페이지의 Security SDK 메뉴에서 Drag & Drop으로 업로드하고 Registration을 진행해요.

트러블슈팅

상황 원인 권장 처리
packaging.bat 실행 실패 상대 경로 입력 또는 java_bin 경로 미설정 모든 경로는 절대 경로로 입력
앱 실행 시 서명 오류 Packaging 후 별도 서명 작업 누락 [apksign] 섹션 Use=1 설정으로 자동 서명
최적화 후 특정 단말기 실행 실패 필수 파일(ASGEL·DSDUC·DSIGT·DYASO·JGCDC·STHSD) 또는 해당 아키텍처 파일 누락 필수 파일 + arm64·arm·x86·x86_64 지원 파일을 모두 포함
Checksum 등록 후 무결성 검증 항상 실패 관리 페이지에 빌드 산출물 무결성 미등록 빌드/배포 직후 관리 페이지에서 Registration 수행

샘플 코드

ini
[config]
;0 = apk, 1 = unity, 2 = unreal4, 3 = coco2
type=1

input=C:\Release\app-live-release.apk
manifest_file=AndroidManifest.xml
smali_jar=smali-2.5.2.jar
baksmali_jar=baksmali-2.5.2.jar
java_bin=C:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25\bin\java.exe
backup=1

[package]
OriAPKPath=C:\Release\app-live-release-rh.apk
NewAPKPath=C:\Release\app-live-release-pack.apk
SecurityPath=C:\Release\securitymodule

;0[APK Mode], 1[AAB Mode]
PackagindMode=0
MinSdkVersion=19

[apksign]
Use=1
KeyStorePath=C:\keystore\keystore.jks
keyStorePass=hohoho
KeyAliasName=Testkey
KeyAliasPass=!a1s2d3f4g5
AdtToolPath=C:\Users\user\AppData\Local\Android\Sdk\build-tools\30.0.2

[filesize]
Use=1
filename001=.so
filename002=.dex
filename003=AndroidManifest.xml

[assetencrypt]
Use=0
filename001=test/text.txt
filename002=test/text.xml
filename003=test/test100.dat

PC Security SDK

PC Security SDK는 SDK 모듈 추가 → 클라이언트 연동 → Server 연동 3단계로 적용해요.

  • SDK 모듈 추가 : 개발환경(Windows Native / Unreal Engine / Unity3D)에 맞춰 PC Security SDK 다운로드 및 적용
  • 클라이언트 연동 : Game Client에 STOVE PC Security SDK에서 제공하는 API 연동 작업 진행. : PC Security SDK는 독립된 형태라 필요한 기능만 선택적으로 적용 가능
  • Server 연동 : Client에서 생성된 App 무결성 데이터를 Security Server로 전달하기 위한 Server Side REST API 연동

사전 준비

PC Security SDK 연동 전, 아래 항목을 확인해 주세요.

항목 내용 비고
SDK 모듈 Windows Native(RHCoreSDK.dll + RHCoreSDKWrapper.h), Unreal Plugin(StoveSecuritySDKPlugin), Unity(StovePCSecuritySDK.unitypackage) 퍼블리싱기술실 전달
.SPSS 폴더 RHCoreSDK.dll과 동일 폴더에 위치 필수. 내부 파일은 삭제·수정·이동 금지 숨김 폴더
실행 경로 확보 게임 exe 기준 상대 경로로 DLL 배치. DLL과 .SPSS는 반드시 같은 폴더 (폴더명은 자유) 예: data/RHCoreSDK.dll
선행 연동 이용자 정보(SUI) 입력을 위해 스토브 로그인이 완료된 상태 필요 권장
서버 측 검증 App 무결성 검증 API Server 연동
(Sandbox: mgs-iv.gate8.com / Live: mgs-iv.playstove.com)
필수

  • 폴더 구조 예시 DLL과 .SPSS 폴더는 게임 exe 기준 상대 경로 어디에 두어도 되지만, 반드시 같은 폴더 안에 함께 위치해야 해요. 일반적인 폴더 구조 예시는 아래와 같아요.
    text
    GameProject/
    ├── build/
    │   ├── Game.exe
    │   └── data/                       ← 폴더명 자유
    │       ├── RHCoreSDK.dll
    │       └── .SPSS/                  ← DLL과 동일 폴더 필수
    │           ├── xxxx
    │           └── xxxx
    ├── pc_security_sdk/
    │   ├── RHCoreSDK.dll
    │   └── .SPSS/
    │       ├── xxxx
    │       └── xxxx
    ├── source/
    └── header/
        └── RHCoreSDKWrapper.h
    

  • 환경별 SDK 모듈 추가 절차 각 개발 환경에 맞춰 SDK 모듈을 추가하는 절차는 아래와 같아요. API 연동 호출 순서(Initialize → SUI → Start → GCS → Shutdown)는 모든 환경에서 동일해요.
    환경 절차
    Windows Native 1. RHCoreSDKWrapper.h를 프로젝트 소스 트리에 추가하고 #include로 사용
    2. RHCoreSDK.dll + .SPSS 폴더를 게임 exe 기준 상대 경로(예: data/)에 배치
    3. RHCoreSDKWrapper.hRHCORESDKDLLPATH 매크로를 실제 경로(예: .\\data\\RHCoreSDK.dll)에 맞춰 수정
    Unreal Engine 1. 전달된 보안 SDK의 StoveSecuritySDKPlugin 폴더를 프로젝트의 Plugins 폴더로 복사
    2. Unreal Editor 종료 후 재시작 → "Missing Modules" 다이얼로그에서 "예" 선택해 자동 리빌드
    3. Visual Studio 프로젝트 새로고침(파일 → Visual Studio 프로젝트 새로고침)
    4. 솔루션 탐색기에서 Plugins/StoveSecuritySDKPlugin 포함 여부 확인
    Unity3D 1. Unity 메뉴: Assets → Import Package → Custom Package... 선택
    2. 전달된 StovePCSecuritySDK.unitypackage 파일 선택 후 모든 파일 import
    3. Import 후 폴더 확인: Assets/Editor, Assets/Plugins/Windows/x86_64/RHCoreSDK.dll, Assets/Scripts, Assets/Stove/SDK/Security

개발 흐름

PC Security SDK는 Visual Studio·Unreal·Unity 환경 모두 동일한 호출 흐름을 가져요.

각 호출 단계 의미는 아래와 같아요.

  1. Initialize : API 사용을 위한 초기화 작업. 보안 SDK DLL의 경로를 입력받아 로드해요. : Initialize와 Shutdown은 각각 1회만 호출해요.
  2. SUI : 이용자 식별자를 SDK에 전달해 Detection Log와 Error Log에 이용자 정보를 포함시켜요. : 이용자 로그인 ID, 이메일과 같이 이용자를 직접 특정할 수 있는 정보는 입력하지 않아요.
  3. Start : 게임 버전과 패키지명을 입력해 SDK를 초기화하고 Scan을 시작해요. : 게임 로딩 단계 초반에 호출하는 것을 권장해요.
  4. GCS (Generate Checksum) : App의 무결성 데이터를 생성해 반환해요. : Start 호출 후 약 2초 뒤 호출하고, 최초 1회만 호출해요. : 게임 종료 후 다시 시작 화면으로 돌아가는 경우 재호출하지 않아도 돼요.
  5. Shutdown : API 사용을 마무리하고 정리 작업을 수행해요.

Unreal 언치터 모듈 사용 시 (SDK 권장 사항)
언치터(Anti-cheat) 모듈 감시 기능을 사용하는 경우 언치터 호출 후 StoveSecurityStart() 함수를 호출해 주세요.

트러블슈팅

상황 원인 권장 처리
Initialize 실패 (DLL 로드 오류) RHCORESDKDLLPATH 경로가 게임 exe 기준 상대 경로와 일치하지 않음 RHCoreSDKWrapper.h의 RHCORESDKDLLPATH를 .\\data\\RHCoreSDK.dll과 같이 정확히 설정
Start 후 SDK 동작 안 함 .SPSS 폴더가 누락되었거나 DLL과 다른 폴더에 위치 .SPSS를 RHCoreSDK.dll과 동일 폴더로 이동. 폴더 구조 변경 금지
GCS 반환값이 빈 문자열 Start 직후 GCS 호출 또는 Start 미호출 상태 Start 후 약 2초 뒤 GCS 호출, Initialize → SUI → Start → GCS 순서 준수
Unreal에서 plugin이 자동 포함되지 않음 Visual Studio 프로젝트 새로고침 미수행 또는 Editor 재시작 미진행 Editor 종료 후 재시작 → "Missing Modules" 다이얼로그 "예" 선택 → VS 프로젝트 새로고침
Initialize / Shutdown 다중 호출 시 비정상 Initialize와 Shutdown은 각각 1회만 호출하도록 설계됨 앱 시작 시 1회 Initialize, 종료 시 1회 Shutdown만 호출
DLL 위치 변경이 필요한 경우 DLL을 다른 폴더로 이동 또는 이름 변경 Initialize() 인자로 변경된 경로/이름을 직접 전달

샘플 코드

cpp
#include "RHCoreSDKWrapper.h"

// 게임 시작 시
if (!RHCoreSDK::Initialize()) {
    MessageBox(hWnd, L"RHCoreSDK.dll 로드 실패", L"Error", MB_OK | MB_ICONERROR);
    // SDK 로드 실패 처리
}

std::string user_info    = "tester";
std::string game_version = "5.0.0";
std::string game_package_name = "com.stove.mobilegamesecurity";

// 사용자 정보 설정
RHCoreSDK::SUI(user_info.c_str());

// 보안 SDK 시작
RHCoreSDK::Start(game_version.c_str(), game_package_name.c_str());

// 무결성 데이터 생성 후 서버 전송 (Start 후 약 2초 뒤, 게임 진입/로비 이동 시점)
const char* checksum = RHCoreSDK::GCS();
// → checksum을 게임 프로토콜에 포함하여 게임 서버로 전송

// 게임 종료 시
RHCoreSDK::Shutdown();

Blueprint Function 제공
Unreal에서는 다음과 같은 Blueprint Function 형태로도 제공돼요: StoveSecuritySDK.Detect.SUI, StoveSecuritySDK.Detect.Start, StoveSecuritySDK.Detect.GCS

보안변수(Ghost Variable) V2

사전 준비

보안변수 V2 모듈은 메모리 영역의 주요 데이터를 보호하는 별도 모듈로, 보안 SDK와 함께 사용할 수 있어요.

항목 내용
Library 파일 Android(libGvt.so), iOS(Gvt.framework), Windows(Gvt.dll). 프로젝트 내 library 폴더(예: lib)에 복사
Wrapper 파일 C/C++: GvtConfig.h(객체 환경), GvtObject.h(객체 정의), GvtWrapper.h(래퍼 객체 정의), GvtWrapper.cpp(래퍼 객체 구현)
C#: GvtWrapper.cs(래퍼 객체 정의)
지원 변수 타입 CGwChar / CGwUChar / CGwShort / CGwUShort / CGwInt / CGwUInt / CGwLong / CGwULong / CGwLLong / CGwULLong / CGwFloat / CGwDouble / CGwUDouble (지원 매트릭스는 2. 연동 가이드의 보안변수 표 참고)

  • SDK 모듈 추가 (환경별) 플랫폼별 library 파일을 프로젝트에 포함하고, wrapper 파일을 적용 소스에 추가해요.
    환경 절차
    Android Native ABI별 libGvt.so를 jniLibs(또는 동일 역할의) 디렉터리에 배치, wrapper 파일을 적용 소스에 추가
    iOS Gvt.framework를 프로젝트에 추가하고 wrapper 파일을 import
    Windows Native Gvt.dll을 게임 exe 기준 상대 경로에 배치, wrapper 파일을 프로젝트에 추가
    Unity 1. libraryAssets\Plugins 폴더에 (없다면 생성) 복사
    2. GvtWrapper.cs를 소스에 추가
    3. 보안변수 OFF 옵션 사용 시: [File] → [Build Settings] → [Player Settings] → [Other Settings] → [Scripting Define Symbols]NO_USING_GHOST_VAR_TYPE 입력

Windows IL2CPP 정적 연동 (선택)

STOVE PC Security SDK는 기본적으로 Gvt.dll을 사용하는 동적 연동 방식을 제공해요.
Windows IL2CPP 환경에서는 Gvt.lib를 GameAssembly.dll에 정적으로 링크하여 Gvt.dll 없이 배포할 수 있어요.

지원 환경
  • Unity Windows x64
  • IL2CPP
  • Architecture = x86_64
사전 준비
  1. Unity Hub → Windows Build Support (IL2CPP) 설치
  2. Player Settings → Windows → Scripting Backend = IL2CPP
  3. Architecture = x86_64 설정
  4. Build Settings에 Scene 등록
프로젝트 구성
text
Assets/Stove/Plugins/Windows/
├── Gvt.lib
└── GvtBridge.cpp

Assets/Editor/
└── GvtIl2CppLinker.cs

Assets/Stove/SDK/Security/
└── GvtWrapper.cs
연동 절차
  1. Gvt.lib를 프로젝트에 추가해요.
  2. GvtBridge.cpp를 추가하여 GVT 심볼이 링크되도록 설정해요.
  3. GvtIl2CppLinker.cs를 추가하여 IL2CPP 빌드 시 정적 라이브러리가 링크되도록 설정해요.
  4. Plugin Importer를 설정해요.
  5. GvtWrapper.cs를 수정하여 DllImport("__Internal")를 사용하도록 변경해요.
  6. Callback 등록 시 Delegate가 GC 대상이 되지 않도록 관리해요.
  7. Windows IL2CPP Build 결과물에서 동작을 검증해요.
Plugin Importer 설정
항목설정
Any PlatformOFF
EditorOFF
Win64ON
CPUx86_64
WebGLOFF
LinuxOFF
macOSOFF
GvtWrapper.cs 수정

Windows IL2CPP 환경에서는 Native 함수를 __Internal을 통해 호출하도록 수정해야 해요.

csharp
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR
[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GVTGetFL(ref int size);
#endif

또한 LoadLib() 내부에서 Windows IL2CPP Build 시 GVTGetEFL()을 사용하도록 수정해야 합니다.

빌드 및 검증
  1. File → Build Profiles → Windows (IL2CPP) → Build
  2. Build 로그에서 Gvt.lib 링크 여부 확인
  3. 생성된 exe 실행
  4. GVT 정상 로드 여부 확인
  5. Callback 정상 동작 여부 확인
제한사항
  • Editor Play Mode에서는 Native GVT가 동작하지 않아요.
  • Windows IL2CPP Build 결과물에서만 동작해요.
  • Gvt.dll 없이 배포가 가능해요.
참고
방식 설명
Gvt.dll 기본 동적 연동 방식
Gvt.lib Windows IL2CPP 정적 연동 방식
Editor Play Mode Native GVT 미지원
Windows IL2CPP Build Native GVT 지원

개발 흐름

보안변수 V2의 적용은 두 단계로 구성돼요.

  1. SDK 모듈 추가 플랫폼별 library 파일과 wrapper 파일을 프로젝트에 포함해요.
  2. API 연동 (Option Interface) Option Interface 함수를 통해 SDK 동작 옵션을 설정한 후, 코드 내에서 일반 데이터 타입처럼 보안 변수를 사용해요.

  • Option Interface 4종
    함수 역할
    NO_USING_GHOST_VAR_TYPE 보안변수 모듈의 변수보호 기능을 OFF하는 매크로. #define NO_USING_GHOST_VAR_TYPE으로 적용. Unity는 Scripting Define Symbols에 설정
    SetSwapLinkNum 변수 저장소 개수 설정 함수. 3~100 사이 값 설정 가능, 미설정 시 기본값으로 설정
    SetMemRolling 변수 저장소 메모리 재할당 함수. 미설정 시 기본값으로 설정
    SetModEventCallbackObj 변수 값 변조 탐지 시 게임 코드의 Callback 호출 함수. 미설정 시 변조 탐지가 발생해도 아무 이벤트가 발생하지 않음

성능 이슈 가능성
밀리초(ms) 간격으로 값이 변하는 변수(예: 위치 등)에는 사용을 금지해요.
단, 아래 샘플 코드와 같이 Set / Get 함수를 직접 호출하는 방식이면 사용 가능해요.


  • 명시적 캐스팅이 필요한 경우 보안 변수 객체를 사용할 때 아래 세 가지 케이스에서는 명시적 캐스팅이 필요해요.

    ① 문자열 출력 포맷과 같이 사용할 때

    cpp
    printf("gUInt = %d\n", (int)gUInt);
    

    ② 상수값 뒤 연산자 사용 시

    cpp
    CGwInt gnInt;
    gnInt = 100;
    int nTemp = 5 + (int)gnInt;
    

    ③ 타입이 다른 보안 변수 객체 간 변환

    cpp
    CGwInt gnInt;
    gnInt = 100;
    
    CGwShort gnShort;
    gnShort = (short)gnInt;
    

    {.is-info}

트러블슈팅

상황 원인 권장 처리
고빈도 변수에서 프레임 저하 ms 간격으로 변하는 위치·시간 변수에 보안변수를 연산자로 사용 해당 변수는 일반 타입 유지 또는 Set/Get 직접 호출 패턴 사용
컴파일 오류 (캐스팅 관련) 문자열 출력 포맷 / 상수 연산 / 타입이 다른 보안 변수 객체 간 변환 명시적 캐스팅 적용 (위 명시적 캐스팅이 필요한 경우 참고)
변조 탐지 콜백 미호출 SetModEventCallbackObj 미설정 CGhostVarModHandler 상속 핸들러 구현 후 SetModEventCallbackObj에 등록
Unity 빌드에서 64비트 타입 사용 오류 CGwLLong / CGwULLong / CGwUDouble은 Unity에서 미지원 CGwLong, CGwULong, CGwDouble 등 지원되는 타입으로 대체
Unity에서 보안변수 OFF 옵션이 적용되지 않음 Scripting Define Symbols 미설정 Player Settings → Other Settings → Scripting Define Symbols에 NO_USING_GHOST_VAR_TYPE 추가

샘플 코드

cpp
#include "GvtWrapper.h"

class CGhostVarModHandler : public IGvtModEventHandler
{
public:
    CGhostVarModHandler() {};
    virtual ~CGhostVarModHandler() {};

public:
    void ModEventCallback(G_DOUBLE a_dOrg, G_DOUBLE a_dMod)
    {
        printf("[*modified-callback*] org = %f, mod = %f \n", a_dOrg, a_dMod);
    }
};

void GvtInit()
{
    if (!CGvtWrapper::_LoadLib())
    {
        printf("fail to load lib");
        return;
    }

    static CGhostVarModHandler GhostVarModHandler;
    CGvtWrapper::_SetModEventCallbackObj(&GhostVarModHandler);
    CGvtWrapper::_SetSwapLinkNum(50);
}

헤더 포함 시 주의
보안변수 모듈을 적용할 소스의 헤더 부분에 GvtWrapper.h를 추가해요. 단, Unity의 경우 wrapper 사용을 위해 using GVT;만 추가해요.

자주 묻는 질문



Q. [Mobile] Stove Mobile Security SDK는 상용 보안 솔루션을 대체하는 것인가요?
A. 네 맞습니다. 상용 솔루션 대신 Security SDK를 적용하시면 돼요.
상용 솔루션을 같이 운영하시고 싶다면 중복 적용도 가능해요.
다만 일부 기능 충돌로 정상 실행이 안된다면 SDK의 해당 기능 Disable 처리로 적용 가능해요.
Q. [PC] Stove PC Security SDK는 상용 보안 솔루션을 대체하는 것인가요?
A. PC Security SDK는 상용 보안 솔루션을 완전히 대체하는 목적이 아니라, 필요한 기능을 추가로 지원하는 형태이에요.
기존 상용 솔루션과 함께 운영이 가능하며, 중복 적용도 가능해요.
일부 기능 충돌이 발생할 경우, SDK에서 해당 기능을 Disable 처리하여 정상 동작하도록 조정할 수 있어요.
Q. [공통] Security SDK의 보안 탐지는 믿을 수 있을 정도로 잘 하나요?
A. 해킹툴이나 실행 환경 탐지 기능을 포함하고 있지만 탐지 기능을 우회하는 New/Unknown 해킹툴이 있을 수 있어요.
이러한 이슈들은 SDK의 Live update를 통해 빠르게 대응이 가능해요.
파일/메모리 코드 조작(변조앱) 형태의 해킹 탐지는 복잡하고 지능화된 보안기술 적용으로 우수하게 작동할 것이에요.
Q. [Mobile] 왜 상용 솔루션보다 Stove Security SDK를 선택해야 하나요?
A. 모든 게임 보안 솔루션은 기능들이 비슷비슷해요.
게임 해킹 대응에서 가장 중요한 것은 대응 품질과 속도이에요.
  - Stove는 자체 해킹 분석 인력, SDK 개발 인력을 보유하고 있어 그룹사 대응을 최우선으로 하고 있어요.
  - 넷마블, 넥슨, NC 등 대형 게임사들이 자체 보안 SDK를 보유하고 운영하는 이유이기도 해요.
별도 상용 솔루션 도입 비용이 필요 없습니다.
Q. [공통] Security SDK의 대응 속도는 어떤가요?
A. 해킹 이슈들마다 많이 다릅니다.
  - 단순히 해킹툴, 환경 등의 탐지 정보 데이터만 업데이트 : 1일 이내
  - Security SDK의 탐지 로직을 우회한 경우로 SDK 모듈을 업데이트 : 약 1주일 ~ 2주일 정도(분석-개발-QA)
Q. [공통] Stove SDK하고는 어떤 관계이고 적용은 동일한 구조인가요?
A. Stove SDK(Auth/Billing/Push/…)와 Stove Security SDK와는 별개의 서비스이고 lib도 다르고, 적용방법도 다릅니다.
즉, Stove Security SDK는 Stove SDK과는 독립적으로 적용을 하고 연관성은 없습니다.
Q. [Mobile] AppSealing처럼 적용하기 쉽나요?
A. AppSealing이나 LIAPP 솔루션에 비해서는 어렵습니다.
  - 두 솔루션은 Client App(Apk)에만 자동 적용되는 형태로 적용은 매우 쉬우나 보안성은 매우 취약해요.
보안성을 위해서 최소한의 게임 서버 연동이 필요해요.
Android/iOS 및 Unreal, Unity3D Interface 지원을 해요.
  - Game Client App에서의 호출 API 수 : 5개
  - Game Server에서의 호출 API 수 : 1개
  - Game Client → Game Server 프로토콜 내 보안 데이터 전송
Q. [공통] 보안 SDK로 인한 게임 서비스 장애 대응 방법 및 영향은 어떻게 되나요?
A. 보안 SDK 모듈의 오류로 인해 게임앱이 비정상 종료되는 장애
  - 설정 정보 update를 통해 오류를 발생 시키는 특정 기능 비활성화로 빠른 대응이 가능해요.
보안 SDK 모듈의 전체 이용자 업데이트로 인해 불특정 다수의 오류 또는 비정상 종료되는 장애
  - Lazy Update(점진적 업데이트)를 이용해 Live 안정성 검증을 확보하면서 업데이트를 할 수 있어요.
보안 서버(무결성 검증, 보안토큰 발급)의 장애로 인한 영향
  - 보안 서버에서의 응답 실패로 인한 영향은 없는 구조로 적용 돼요.
Q. [공통] 어떻게 하면 게임 보안 이슈 없이 안정화된 서비스를 할 수 있나요?
A. 게임 보안의 완벽한 방패는 불가능해요.
보안에 가장 안전한 형태는 게임 스트리밍 서비스 형태입니다만 Auto Clicker Hack, 작업장은 여전히 문제이에요.
스트리밍 서비스 형태가 아니라면 아래와 같은 게임보안 관리체계가 필요해요.
  - 서비스 전
    - 게임 개발에서의 보안을 고려한 설계/구현 (서버 연산 및 Client data 검증, 클라이언트의 메모리 보안 기술 적용 등)
    - Security SDK 적용
    - 서비스 전 보안 검수를 통한 취약성 검증 및 제거
  - 서비스 후
    - 어뷰징 커뮤니티 및 판매/공유 사이트 모니터링
    - 게임 개발사, 보안기술/보안 SDK 개발부서와의 협업을 통한 신속한 대응
Q. Security Server에 무결성 데이터 등록은 어떻게 진행 되나요?
[Mobile]
관리 페이지에서 제공하는 Packaging 기능을 이용하여 자동으로 무결성 데이터 등록이 진행돼요.
예외적인 사항에 대해서는 게임보안개발팀과 협의 후 등록 방식을 결정할 수 있어요.
SDK 적용 후 Stove Mobile Security SDK가 정상적으로 잘 적용되었는지 테스트도 같이 진행돼요.

[PC]
SDK 적용 시 PC 무결성 데이터는 자동으로 등록돼요.
예외적인 사항이 발생할 경우, 보안플랫폼개발팀과 협의하여 등록 방식을 조정할 수 있어요.
SDK 적용 후 Stove PC Security SDK가 정상적으로 잘 적용되었는지 테스트도 같이 진행돼요.
Q. [Mobile] 매번 빌드가 생성될 때마다 Packaging 및 무결성 데이터 등록을 해야 하나요?
A. 최종 테스트 빌드(Sandbox)와 Live 빌드에서만 Packaging 및 무결성 데이터 등록을 진행하면 돼요.
Stove Mobile Security SDK는 Packaging이 되지 않더라도 게임 진행 및 개발하시는데 문제가 없으며 Packaging이 되지 않았을 경우에는 Toast 메시지를 통해 안내돼요.
개발 단계에서 Stove Mobile Security SDK 의 API를 호출하지 않기를 원하신다면 게임 구동시 환경 값을 가지고 API 호출 여부를 판단하시면 돼요.
Q. 서비스 되는 빌드가 여러개 존재할 경우에는 어떻게 해야 하나요?
[Mobile]
Stove Mobile Security SDK는 같은 버전에 여러개의 빌드 파일을 지원해요.
서비스 하고자 하시는 빌드 파일 (국가별, GPG빌드, AAB/APK 등) 전부 관리 페이지에 등록하시면 등록되어 있는 파일은 모두 정상적인 무결성 검증 대상에 포함이 돼요.

[PC]
Stove PC Security SDK는 같은 버전에 여러개의 빌드 파일을 지원해요.
서비스 하고자 하시는 빌드 파일 전부 관리 페이지에 등록하시면 등록되어 있는 파일은 모두 정상적인 무결성 검증 대상에 포함이 돼요.
Q. 모듈은 어떻게 전달 받을수 있나요?
[Mobile]
Stove Mobile Security SDK를 전달받기 위해서는 퍼블리싱기술실(sgp_publishtech_d@smilegate.com)에 문의해 주시면 App에 맞는 설정 파일 제작 후 Sample 및 Plugin을 전달해 드립니다.

[PC]
Stove PC Security SDK를 전달받기 위해서는 퍼블리싱기술실(sgp_publishtech_d@smilegate.com)에 문의해 주시면 게임에 맞는 설정 파일 제작 후 SDK를 전달해 드립니다.



직접 문의하고 싶으신가요? stove.developers@smilegate.com