API 레퍼런스
OZero SDK의 모든 공개 클래스와 메서드에 대한 완전한 레퍼런스입니다. 별도로 명시되지 않은 경우 모든 클래스는 OZeroSDK.Security 네임스페이스에 있습니다.
OZeroSecurityManager OZeroSDK.Security
모든 활성 보안 모듈을 관리하는 중앙 싱글톤입니다. DontDestroyOnLoad를 통해 씬 전환 시에도 유지됩니다. 정적 Instance 프로퍼티로 접근하세요. OZeroBootstrapper가 런타임 시작 시 [RuntimeInitializeOnLoadMethod]를 통해 자동 생성합니다 — 직접 인스턴스화하지 마세요.
프로퍼티
| 이름 | 타입 | 설명 |
|---|---|---|
| Instance | OZeroSecurityManager | 정적 싱글톤 접근자. 활성 인스턴스를 반환합니다. |
메서드
서드파티 콜백을 유저 체인에 등록합니다. 내장 기본 핸들러는 별도 체인에서 동작하므로 유저 콜백을 해제해도 무력화되지 않습니다. 콜백은 모듈 타입, 공개 abort code, 메시지 키, 안전한 진단 메시지, 현재 정책상 앱 종료 여부를 담은 OZeroSecurityEvent를 받습니다.
이전에 등록한 유저 콜백을 제거합니다. 메모리 누수 방지를 위해 OnDisable 또는 OnDestroy에서 반드시 호출하세요.
델리게이트
RegisterUserCallback에서 사용하는 콜백 시그니처입니다. 자체 UI, 로그, 저장 처리 여부를 결정할 때 evt.Type, evt.AbortCodeHex, evt.MessageKey, evt.Message, evt.WillAbort를 읽으세요.
예시
using OZeroSDK.Security;
using UnityEngine;
public class MySecurityListener : MonoBehaviour
{
void OnEnable()
=> OZeroSecurityManager.Instance.RegisterUserCallback(OnThreat);
void OnDisable()
=> OZeroSecurityManager.Instance.UnregisterUserCallback(OnThreat);
void OnThreat(OZeroSecurityEvent evt)
=> Debug.Log(
$"Threat={evt.Type}, Code={evt.AbortCodeHex}, Message={evt.Message}");
}
OZeroSecurityEvent class
RegisterUserCallback에 전달되는 고객 공개용 위반 이벤트 payload입니다. 내부 탐지 세부 정보 대신 안정적이고 안전한 진단 정보만 노출합니다.
| 이름 | 타입 | 설명 |
|---|---|---|
| Type | ModulationType | 위반을 발생시킨 보안 모듈입니다. |
| AbortCode | OZeroAbortCode | 안정적인 공개 abort code 카테고리입니다. |
| AbortCodeValue | int | 서버 로그에 사용하기 좋은 숫자 코드 값입니다. |
| AbortCodeHex | string | 0x0C 같은 16진수 문자열입니다. |
| MessageKey | string | 현지화와 analytics 그룹화에 사용할 수 있는 안정적인 영문 메시지 키입니다. |
| Message | string | 고객에게 노출 가능한 안전한 영문 진단 메시지입니다. |
| WillAbort | bool | 콜백 반환 후 또는 grace timer 만료 후 현재 대응 정책이 앱을 종료할 예정이면 true입니다. |
ModulationType enum
어떤 보안 모듈이 경보를 발생시켰는지 식별합니다. OZeroSecurityEvent.Type으로 전달됩니다.
| 값 | 설명 |
|---|---|
| MemoryModulation | Secure Type 변수가 의심스러운 방식으로 접근됨 |
| SpeedHack | 스피드핵 또는 시간 조작 감지 |
| TimeHack | 시스템 시계 이상 감지 (뒤로 이동, NTP 불일치) |
| Injection | 메모리 인젝션 툴(Frida 등) 또는 불법 DLL 감지 |
| PhysicsHack | 불가능한 위치 변화 감지 (OZeroPhysicsHackDetector에 의해 발생 — 개별 플레이어 오브젝트에 직접 컴포넌트 부착 필요; Bootstrapper에서 자동 생성되지 않음) |
| DeviceBindingModulation | 세이브 데이터가 바인딩된 기기와 다른 기기에서 로드됨 |
| InstallSource | 인가된 스토어가 아닌 곳에서 설치됨 |
| BuildIntegrity | 어셈블리 해시 불일치, 디버거 연결, 또는 플랫폼 검사 실패 |
| EnvironmentModulation | 에뮬레이터 또는 비정상 런타임 환경 감지 |
| SteamAntiPiracy | Steam 소유권 또는 티켓 검증에 실패했을 때 발생합니다. |
OZeroBootstrapper OZeroSDK.Security
별도 와이어링이 필요 없는 자동 부트스트랩 진입점입니다. 이 클래스를 직접 호출할 필요는 없습니다. SDK를 Unity 시작 흐름에 연결하고, 검증된 보안 설정을 로드하며, 게임 시작 전에 활성 탐지기를 자동으로 준비합니다. 가능한 경우 Native 런타임 보호도 이 과정에서 초기화됩니다.
OZeroSecurityConfig 에셋뿐입니다.
OZeroSecurityConfigRuntime OZeroSDK.Security
보호된 빌드 타임 보안 설정의 런타임 로더입니다. 패키지된 설정을 검증하고 인메모리 OZeroSecurityConfig 스냅샷을 준비하며, 검증 실패 시 설정된 위협 대응 정책을 적용합니다.
프로퍼티
| 이름 | 타입 | 설명 |
|---|---|---|
| Current | OZeroSecurityConfig | 블롭에서 하이드레이션된 설정 스냅샷입니다. 처음 접근 시 EnsureLoaded()를 호출합니다. 플레이어 빌드에서는 OZeroSecurityConfig.Instance가 이 프로퍼티를 통해 프록시됩니다. |
메서드
멱등 로더 — 반복 호출해도 안전합니다. 첫 접근에서 패키지 설정을 검증하고 로드하며, 이후 호출은 같은 스냅샷을 재사용합니다. 실패 처리는 전역 위협 대응 정책을 따릅니다.
OZeroSecurityConfig와 Unity 에디터 창으로 보시면 됩니다.
OZero Secure Variables OZeroSDK.Security
기본 타입의 암호화된 드롭인 대체제입니다. 값은 Native C++ 힙에만 저장되고 암호화됩니다. 프레임마다 48바이트 XOR 마스크가 추가 적용되어 메모리 스캐너에는 노이즈만 보입니다. 모든 산술 연산자와 암묵적 변환이 지원됩니다 — 타입 이름만 변경하면 됩니다.
지원 타입
| 클래스 | 대체 타입 |
|---|---|
| OZeroSV_Int | int |
| OZeroSV_Int64 | long |
| OZeroSV_UInt | uint |
| OZeroSV_UInt64 | ulong |
| OZeroSV_Short | short |
| OZeroSV_UShort | ushort |
| OZeroSV_Byte | byte |
| OZeroSV_Float | float |
| OZeroSV_Double | double |
| OZeroSV_Decimal | decimal |
| OZeroSV_Bool | bool |
| OZeroSV_String | string |
| OZeroSV_Vector2 | Vector2 |
| OZeroSV_Vector3 | Vector3 |
| OZeroSV_Buffer | byte[] |
지원 연산자
숫자 타입(Int, Int64, UInt, UInt64, Short, UShort, Byte, Float, Double, Decimal)은 산술(+ - * / %), 비교(== != < > <= >=), 복합 대입(+= -= *= /=), 증감(++ --) 연산자와 기본 타입과의 암묵적 변환을 지원합니다. Vector2·Vector3는 산술 및 동등 연산자를 지원하고, Bool은 동등 연산자만 지원합니다. String은 ==, !=, +를 지원합니다. Buffer는 인덱스 연산자를 통해 바이트 배열에 직접 접근할 수 있습니다.
stackalloc과 네이티브 원자 카운터를 통해 수행되어 프레임당 수천 번 호출되는 핫 패스에서도 안전하게 사용할 수 있습니다.
OZeroSafePlayerPrefs OZeroSDK.Security
Unity의 PlayerPrefs를 암호화된 드롭인 대체제입니다. 키 이름은 message authentication으로 해시되고 값은 key-derivation function 기기 바인딩 키(100,000회 반복)를 사용한 암호화됩니다. 저장된 데이터는 기기 레지스트리(Windows)나 설정 plist(iOS)를 직접 열어봐도 읽을 수 없습니다.
메서드
모든 메서드는 PlayerPrefs와 기능적으로 동일합니다. 마이그레이션 단계가 필요 없습니다 — 클래스 이름만 교체하세요.
OZeroSafePlayerPrefs로 쓴 데이터는 표준 PlayerPrefs와 호환되지 않습니다. 두 가지를 전환하면 기존 데이터를 읽을 수 없게 됩니다.
OZeroSV_File OZeroSDK.Security
내장 무결성 검증과 함께 파일을 암복호화합니다. 키가 앱 수준(기기 바인딩 없음)이므로 스팀 클라우드 세이브와 호환됩니다. 읽기 시 무결성 검증이 먼저 실행되며, 변조된 파일은 손상된 데이터를 자동으로 반환하는 대신 예외를 발생시킵니다.
메서드
contents를 암호화하고 결과(헤더 + 암호문 + 인증 태그)를 path에 씁니다. 디렉터리가 이미 존재해야 합니다.
path의 파일을 읽고 무결성을 검증한 후 복호화된 문자열을 반환합니다. 파일이 변조된 경우 InvalidDataException을 발생시킵니다.
원시 바이트 배열을 암호화하고 path에 씁니다.
WriteAllBytes로 쓴 파일을 읽고 복호화합니다. 반환 전 무결성 태그를 검증합니다.
예시 코드
using OZeroSDK.Security;
string path = Application.persistentDataPath + "/save.json";
string json = JsonUtility.ToJson(saveData);
// Write (encrypts automatically)
OZeroSV_File.WriteAllText(path, json);
// Read (decrypts + integrity check)
try
{
string loaded = OZeroSV_File.ReadAllText(path);
saveData = JsonUtility.FromJson<SaveData>(loaded);
}
catch (System.IO.InvalidDataException)
{
// File was tampered — handle accordingly
Debug.LogError("Save file integrity check failed.");
}
OZeroBuildIntegrityValidator OZeroSDK.Security
빌드 변조, 디버거/타이밍 이상, 플랫폼 네이티브 무결성 검사, 선택적 Pro 서버 검증(attestation)과 OZero 대행 검증(Managed Verification)을 처리하는 런타임 검증기입니다. Build Integrity가 OZeroSecurityConfig에서 활성화되면 OZeroBootstrapper가 자동 생성합니다.
검사 항목
| 검사 | 설명 |
|---|---|
| Assembly / Manifest | 지원 빌드 타겟에서 생성된 무결성 매니페스트와 managed assembly 상태를 검증합니다. |
| Debugger / Timing | 연결된 디버거, 비정상 타이밍 간격, breakpoint에 가까운 지연을 감지하며 일반적인 포커스 손실 오탐은 억제합니다. |
| Platform Native | 활성화 시 Android 패키지/서명, iOS jailbreak, 데스크톱 런타임 상태 같은 플랫폼별 검사를 수행합니다. |
| Pro Attestation | Pro 서버 attestation이 켜져 있으면 로컬 검사 통과 후 서버 발급 attestation 토큰을 요청합니다. Managed Verification이 켜져 있으면 같은 토큰으로 OZero 위임 verdict까지 확인합니다. |
공개 속성
| 이름 | 타입 | 설명 |
|---|---|---|
| Instance | OZeroBuildIntegrityValidator | 모듈이 생성된 경우 현재 validator 인스턴스입니다. |
| LastValidationResult | bool? | 가장 최근 로컬 검증 결과입니다. 첫 검증 전에는 null입니다. |
| IsValidating | bool | 검증 실행 중이면 true입니다. |
| IsIntegrityVerified | bool | 최근 활성화된 로컬 검사를 통과하면 true입니다. |
| AttestationToken | OZeroBuildAttestationToken | 가장 최근 Pro attestation 토큰입니다. 서버 attestation이 성공하거나 실패하기 전까지는 null이며, 토큰에는 재사용 추적을 위한 고유 ID가 포함됩니다. |
이벤트 및 메서드
활성화된 모든 로컬 검사가 통과하면 호출됩니다.
활성화된 로컬 검사 또는 Pro attestation이 빌드를 거부하면 호출됩니다.
Pro 서버 attestation이 성공하고 AttestationToken에 유효한 토큰이 들어오면 호출됩니다.
수동 검증을 시작합니다. 일반 프로젝트는 대시보드의 시작 시/주기적 검증 설정을 사용하는 편이 좋습니다.
OZeroSpeedHackDetector OZeroSDK.Security
5가지 독립적인 감지 신호를 사용하여 스피드핵과 시간 조작을 감지합니다. 신호들이 서로 확인할 때만 위협을 보고하여 오탐을 줄입니다.
감지 신호
| 신호 | 설명 |
|---|---|
| TimeScale | Unity의 Time.timeScale의 무단 변경을 모니터링 |
| API Clock | OS 시간 API를 네이티브 백그라운드 타이머와 비교 |
| Thread Drift | Unity 런타임 시간과 독립 Native 타이밍 소스 사이의 드리프트 측정 |
| Time Backward | 시스템 시간의 뒤로 이동 감지 |
| NTP | 선택적 — 절대 시간 검증을 위해 NTP 서버와 교차 확인(네트워크 필요) |
감지는 ModulationType.SpeedHack 또는 ModulationType.TimeHack으로 OZeroSecurityManager 콜백을 통해 발생합니다. OZeroSecurityConfig에서 설정합니다.
OZeroInjectionDetector OZeroSDK.Security
비정상 런타임 모듈, 후킹, 디버거, 신뢰 모듈 정책 신호를 관찰합니다. 주기 검사는 적용 가능한 경우 Jitter 스케줄링을 사용해 예측 가능한 스캔 타이밍을 줄입니다.
감지 대상
| Runtime module | 예상치 못한 모듈 또는 후킹 관련 런타임 신호 |
| Debugger | 디버거 또는 트레이서 연결 신호 |
| Memory map | 의심스러운 런타임 메모리 또는 모듈 배치 신호 |
| Illegal DLL | 프로세스에 로드된 무단 관리 어셈블리(Windows/Unity Editor) |
감지는 ModulationType.Injection으로 OZeroSecurityManager 콜백을 통해 발생합니다.
OZeroSecurityConfig ScriptableObject
전역 보안 설정을 저장하는 ScriptableObject 에셋입니다. 에디터에서 작성하면 빌드 파이프라인이 플레이어 빌드용 보호된 런타임 설정으로 패키징합니다. 실제 적용 설정은 OZeroSecurityConfig.Instance로 접근합니다.
필드
필드는 중첩된 설정 클래스(Response, Integrity, InstallSource, DeviceBinding, SpeedHack, Injection)로 그룹화되어 있으며, OZeroSecurityConfig.Instance의 동일 이름 프로퍼티로 접근합니다. 자주 조정되는 필드를 아래에 나열했으며, 전체 항목은 에셋의 인스펙터 툴팁을 참고하세요.
| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| — 최상위 — | |||
| developerSecret | string | "" | OZeroSV_File 및 OZeroSafePlayerPrefs의 key-derivation function 키 도출에 사용되는 패스프레이즈. 게임별로 고유해야 하며 출시 후 절대 변경해서는 안 됩니다. |
| enableLog | bool | true | SDK 디버그 로그 활성화(릴리스 빌드에서는 OZeroSecLog로 항상 제거됩니다). |
| — Response — | |||
| response.forceQuitOnDetection | bool | true | 위협 시 강제 종료(OZeroInternalFallbackReceiver가 네이티브 OZ_AbortProcess로 강제). 사용자 콜백 체인만으로 처리하려면 비활성화하세요. |
| — Integrity — | |||
| integrity.useIntegrity | bool | true | 빌드 무결성 모듈 마스터 스위치. |
| integrity.validateOnStartup | bool | true | Start() 시점에 전체 무결성 검사를 실행합니다. |
| integrity.periodicCheckInterval | float | 120 | 주기적 재검증 실행 간격(초). 0 이하로 설정하면 주기 검사를 비활성화합니다. |
| integrity.checkAssemblyHash | bool | true | OZeroAssemblyManifest를 기준으로 컴파일된 어셈블리의 SHA-256 / 공개 키 토큰 검증. |
| integrity.checkDebugger | bool | true | 연결된 매니지드 디버거, Unity 디버그 빌드 플래그, CPU 타이밍 이상 감지. |
| integrity.checkPlatformNative | bool | true | 플랫폼별 네이티브 검사(루팅, 탈옥, APK 서명, Authenticode 등) 실행. |
| integrity.failIfManifestMissing | bool | false* | 어셈블리 매니페스트 누락/로드 실패를 위반으로 처리합니다. *development가 아닌 플레이어 빌드에서는 직렬화 값과 무관하게 true로 강제됩니다. |
| integrity.requireManifestSignature | bool | false* | 어셈블리 매니페스트에 유효한 public-key signature 서명을 요구합니다. 키는 Tools → OZero → Generate Manifest Signing Keys로 생성하세요. *릴리스 플레이어 빌드에서는 true로 강제됩니다. |
| integrity.blockEmulator | bool | true | (Android) 에뮬레이터 감지를 무결성 위반으로 처리. |
| — InstallSource (Android) — | |||
| installSource.useInstallSource | bool | true | 설치 출처 검증 마스터 스위치. |
| installSource.allowGooglePlayStore | bool | true | Google Play 설치 허용(Galaxy Store, Amazon Appstore, AppGallery, OneStore 등 개별 스토어 플래그도 토글 가능). |
| — DeviceBinding — | |||
| deviceBinding.useDeviceBinding | bool | true | 디바이스 바인딩 검증 마스터 스위치. |
| deviceBinding.hardwareChangeTolerance | int (0–3) | 1 | 디바이스를 새 기기로 간주하기 전까지 허용되는 하드웨어 지문 구성 요소 변경 수. |
| — SpeedHack — | |||
| speedHack.useSpeedHack | bool | true | 스피드핵 디텍터 마스터 스위치. |
| speedHack.checkInterval | float | 1.0 | 폴링 간격(초, 0.05–5로 클램프됨). |
| speedHack.requiredDetections | int | 3 | 위반을 발생시키기 위해 필요한 연속 의심 샘플 수(1–10으로 클램프됨). |
| speedHack.useWebTimeValidation | bool | true | 외부 엔드포인트와의 HTTPS HEAD 기반 게임 시간 교차 검증을 활성화합니다. |
| speedHack.webTimeUrls[] | string[] | [] | M-4 보안 강화 (2026-04-24). 라운드 로빈 시간 교차 검증에 사용되는 통합자 제어 엔드포인트 목록. 본인이 통제하는 항목을 2개 이상 설정하세요. 이 목록이 비어 있는 경우에만 더 이상 사용되지 않는 단일 webTimeUrl 필드로 폴백됩니다. |
| speedHack.minSuccessfulEndpoints | int | 2 | 라운드를 성공으로 간주하기 위해 유효한 Date 헤더로 응답해야 하는 webTimeUrls 중 최소 엔드포인트 수. |
| speedHack.maxConsecutiveFailures | int | 6 | onWebTimeUnavailable 에스컬레이션 발화 전까지 허용되는 최대 연속 실패 라운드 수. |
| speedHack.onWebTimeUnavailable | enum | WarnOnly | 웹 시간 엔드포인트가 도달 불가 상태일 때의 정책: WarnOnly(기본 — 로깅 후 계속 실행, 오프라인 우선 게임에 적합), Strict(적대적 환경으로 간주하고 SpeedHack 콜백 발화), Silent(로그/에스컬레이션 없음 — 권장하지 않음). |
| — Injection — | |||
| injection.useInjection | bool | true | 인젝션/후킹 디텍터 마스터 스위치. 빌드 종류별 동작: release → 즉시 종료, development build → 경고만 출력(M-5 보안 강화, 2026-04-24), editor → 무시. |
OZeroLicenseConfig OZeroSDK.Security.License
Resources/OZeroLicenseConfig에서 로드되는 ScriptableObject입니다. 라이선스 티어를 선택하고 Plus/Pro 키와 선택적 Pro 런타임 기능을 설정합니다. 없거나 비어 있으면 Standard/serverless로 동작합니다.
필드
| 필드 | 타입 | 설명 |
|---|---|---|
| tier | OZeroLicenseTier | Standard는 완전 오프라인으로 동작합니다. Plus는 프로젝트 바인딩 native variant를 활성화합니다. Pro는 Plus를 포함하고 서버 기반 런타임 기능을 활성화합니다. |
| licenseKey | string | Plus 키는 OZ-PLS-..., Pro 키는 OZ-PRO-... 형식입니다. 비어 있으면 Standard/serverless로 동작합니다. |
| requireVariantManifestForBuild | bool | Plus/Pro 빌드에서 프로젝트 바인딩 native Variant manifest가 없거나 맞지 않으면 Unity 빌드를 실패시킵니다. |
| variantProjectId | string | 다운로드된 manifest에 project id가 있을 때 Variant 사전 검증에 사용하는 선택적 프로젝트 식별자입니다. |
| serverBaseUrl | string | Pro 활성화와 서버 기능에 사용하는 Base URL입니다. OZero 지원팀이 전용 엔드포인트를 안내하지 않았다면 기본값을 유지하세요. |
| serverPublicKeyHex | string | Pro 라이선스와 함께 제공되는 공개 검증 키입니다. 라이선스 서버의 서명된 응답을 검증하는 데 사용됩니다. |
| previousServerPublicKeyHex | string | 선택적 이전 공개키입니다. 서버 키 전환 중 OZero 지원팀이 안내한 경우에만 입력하세요. |
| tokenTtlSeconds | int | 성공한 Pro entitlement를 오프라인에서 신뢰하는 시간입니다. 만료 후에는 다시 활성화될 때까지 Pro 전용 기능이 비활성화됩니다. |
| activationTimeoutSeconds | float | Pro 활성화를 기다리는 최대 시간입니다. 초과 시 SDK는 Standard/serverless 모드로 계속 진행합니다. |
| enableLog | bool | OZeroSecLog를 통해 라이선스 흐름 진단 로그를 출력합니다. |
| enableDevicePolicyHeartbeat | bool | Pro 전용. 현재 기기가 계속 허용 상태인지 주기적으로 확인합니다. |
| enableSecurityLevelCheck | bool | Pro 전용. 빌드가 기대한 보안 레벨을 선언했는지 서버가 확인할 수 있게 합니다. |
| enableRemoteSpeedHackConfig | bool | Pro 전용. Speed & Time Hack 임계값을 서버 정책으로 갱신할 수 있게 합니다. |
| enableSignedServerTime | bool | Pro 전용. 사용 가능할 때 signed server time을 기본 신뢰 시간 소스로 사용합니다. |
| injectionWhitelistEntries | OZeroInjectionWhitelistEntry[] | 알려진 신뢰 모듈을 위한 선택적 hash/signature whitelist 항목입니다. |
프로퍼티
Resources에서 런타임 설정을 로드합니다. null은 Standard/serverless로 처리하세요.
Standard, Plus 또는 빈 라이선스 키이면 true입니다. Pro 활성화가 필요한 경우에만 false입니다.
Plus와 Pro에서 true입니다. 빌드 사전 검증과 native Variant 바인딩에 사용됩니다.
OZeroLicenseRuntime OZeroSDK.Security.License
현재 라이선스 상태를 읽는 런타임 facade입니다. 앱 시작 시 자동 초기화되므로 대부분의 프로젝트는 상태를 읽거나 HasCapability만 호출하면 됩니다.
프로퍼티
| 이름 | 타입 | 설명 |
|---|---|---|
| Entitlement | OZeroLicenseEntitlement | 현재 활성화된 entitlement입니다. Standard/serverless 모드에서는 null입니다. |
| HasEntitlement | bool | 현재 entitlement가 있으면 true입니다. |
| IsServerless | bool | SDK가 Pro 서버 기능 없이 실행 중이면 true입니다. |
| Initialized | bool | 라이선스 런타임의 첫 시작 처리가 끝나면 true입니다. |
| IsProDowngraded | bool | Pro 활성화 실패 또는 만료 후 SDK가 Standard로 조용히 계속 실행되면 true입니다. |
| DowngradeReason | string | 가장 최근 자동 다운그레이드(기본 보호 전환)의 진단 사유입니다. |
| DeviceIdProvider | Func<string> | 활성화에 사용할 device id를 선택적으로 바꿀 수 있습니다. 프로젝트가 자체 식별자를 써야 한다면 초기화 전에 설정하세요. |
메서드
멱등적인 시작 메서드입니다. 보통 SDK가 자동 호출하며, 커스텀 부트스트랩은 라이선스 상태를 읽기 전에 await할 수 있습니다.
활성 entitlement에 telemetry, signed_time, attestation_v1 같은 capability가 있는지 반환합니다. Standard/serverless에서는 false입니다.
라이선스 서버 런타임 호출
Pro 기능은 /v1 아래의 HTTPS JSON 호출을 사용합니다. 대부분의 호출은 SDK가 자동으로 수행합니다. 자체 게임 서버가 있는 팀은 /v1/validate로 OZA 토큰을 직접 검증하고, 고가치 액션에는 consumeToken=true로 tokenId 재사용을 막을 수 있습니다. 서버가 없는 팀은 Managed Verification 설정으로 OZero 위임 verdict를 사용할 수 있습니다.
| 엔드포인트 | 용도 |
|---|---|
| POST /v1/activate | 현재 기기에서 Pro 라이선스를 활성화하고 로컬 entitlement를 갱신합니다. |
| GET /v1/time | 활성화된 경우 Speed & Time Hack 검증에 사용할 signed server time을 제공합니다. |
| POST /v1/attest | 활성화된 무결성 검사 통과 후 고유 토큰 ID가 포함된 Pro build attestation 토큰을 발급합니다. nonce는 제출된 빌드 증거와 앱 식별 정보에 묶입니다. |
| POST /v1/validate | 게임 서버에서 OZA 토큰을 검증합니다. 랭킹, 결제, 재화 지급 같은 1회성 고가치 액션은 consumeToken=true로 같은 tokenId 재사용을 차단할 수 있습니다. |
| POST /v1/managed-session | 자체 백엔드가 없는 팀을 위해 OZero가 Pro OZA 토큰을 검증하고 allow/warn/block verdict와 짧은 managed session을 반환합니다. SDK는 managed session 만료 전에 자동 재검증을 시도하며, 같은 tokenId의 managed-session 재사용은 차단됩니다. |
| POST /v1/telemetry | telemetry capability가 활성화된 경우 보안 이벤트에 대한 Pro telemetry를 전송합니다. |
OZeroAbortCode 및 이벤트 메시지
확정된 보안 위반이 발생하면 SDK는 OZeroSecurityEvent를 생성합니다. 이벤트에는 ModulationType, 안정적인 공개 OZeroAbortCode, MessageKey, 안전한 영문 Message, WillAbort가 포함됩니다.
Abort code 및 메시지 표
| 코드 | OZeroAbortCode | ModulationType | MessageKey | 메시지 |
|---|---|---|---|---|
| 0x01 | MemoryModulation | MemoryModulation | memory_modulation | Protected memory value changed unexpectedly. |
| 0x02 | Injection | Injection | injection | Unexpected module, hook, or runtime injection signal detected. |
| 0x0A | BuildIntegrity | BuildIntegrity | build_integrity | Build integrity validation failed. |
| 0x0C | SpeedOrTimeHack | SpeedHack | speed_hack | Suspicious time scale or execution speed change detected. |
| 0x0C | SpeedOrTimeHack | TimeHack | time_hack | System clock or trusted time anomaly detected. |
| 0x0E | DeviceOrInstallPolicy | DeviceBindingModulation | device_binding | Device binding policy rejected the current device. |
| 0x0E | DeviceOrInstallPolicy | InstallSource | install_source | Application install source is not trusted. |
| 0x0F | PhysicsHack | PhysicsHack | physics_hack | Abnormal physics behavior exceeded the configured policy. |
| 0x10 | EnvironmentModulation | EnvironmentModulation | environment_modulation | Unsupported or unsafe runtime environment detected. |
| 0x13 | SteamAntiPiracy | SteamAntiPiracy | steam_antipiracy | Steam ownership or ticket validation failed. |
로그나 다국어 UI를 만들 때는 OZeroAbortCode와 MessageKey를 기준값으로 사용하세요. Message는 개발자가 상황을 이해할 수 있도록 안전한 표현으로 정리되어 있어, 개발자용 화면이나 QA 로그에 그대로 표시해도 괜찮습니다.
런타임에서 보안 이벤트 처리
SDK가 abort하기 전에 분석(analytics) 큐를 비우거나, 개발자용 경고를 표시하거나, 진행 중인 게임 데이터를 안전하게 저장해야 한다면 OZeroSecurityManager.RegisterUserCallback으로 핸들러를 등록하세요. 현재 대응 정책이 앱을 종료할지 여부는 evt.WillAbort로 확인할 수 있습니다.
using OZeroSDK.Security;
void OnEnable()
{
OZeroSecurityManager.Instance.RegisterUserCallback(OnHack);
}
void OnHack(OZeroSecurityEvent evt)
{
Debug.LogWarning(
$"OZero: {evt.Type} {evt.AbortCodeHex} {evt.MessageKey} - {evt.Message}");
if (evt.WillAbort)
{
// Last chance to flush your own analytics or save state.
}
Analytics.FlushSync();
}
Injection Detector API OZeroSDK.Security
hash + signer-fingerprint 화이트리스트의 프로그래밍 표면입니다. 런타임에서는 OZeroDispatch를 사용하고, 게임에 함께 배포할 신뢰 항목은 OZeroLicenseConfig에 설정합니다.
DTO — OZeroInjectionWhitelistEntry
[Serializable]
public class OZeroInjectionWhitelistEntry
{
// SHA-256 of the matched module file. Lowercase 64-char hex. Required.
public string HashHex { get; set; }
// SHA-256 of the module's signing certificate. Lowercase 64-char hex.
// Empty ("") means "match by hash only" (only mode for Android .so / Linux ELF).
public string SignerHex { get; set; }
// Module file format hint — "pe" | "macho" | "so". Defaults to "so".
public string Type { get; set; }
// Optional human-readable note (UI / audit only — never sent to native).
public string Comment { get; set; }
}
Unity에서 로컬 신뢰 모듈 항목을 시드해야 할 때 사용하는 DTO입니다. Pro 고객은 보통 같은 정책을 포털에서 관리합니다.
런타임 API — OZeroDispatch
// Returns true when trusted-module policy support is available.
public static bool HasInjectionV3 { get; }
// Replace trusted module entries atomically. Pass null/empty to clear.
// Returns false when the runtime support is unavailable.
public static bool RegisterInjectionWhitelistHash(OZeroInjectionWhitelistEntry[] entries);
// Trusted-module aware scan. Returns true when a relevant runtime signal is observed.
// Output fields are diagnostic context for your review and may be empty.
public static bool DetectAssemblyInjectionV3(
out bool silencedByWhitelist,
out string hashHex,
out string signerHex,
out string matchedModulePath);
세 메서드 모두 static helper입니다. 선택적 기능 표면으로 취급해 먼저 가용성을 확인하고, 로컬 신뢰 항목은 최소한으로 유지하세요.
Config — OZeroLicenseConfig
// Inspector array of OZeroInjectionWhitelistEntry — preferred surface.
public OZeroInjectionWhitelistEntry[] InjectionWhitelistEntries { get; }
public string[] InjectionWhitelistKeywords { get; }
InjectionWhitelistEntries는 신뢰 모듈 정책의 로컬 seed입니다. 직접 배포하거나 명시적으로 신뢰하는 모듈에만 사용하세요.