게임 프로그래밍
Received: July. 08. 2019 Revised: Oct. 23. 2019 Accepted: Oct. 26. 2019
Corresponding Author: Youngsik Kim (Korea Polytechnic University)
E-mail: [email protected]
ISSN: 1598-4540 / eISSN: 2287-8211
Ⓒ The Korea Game Society. All rights reserved. This is an open-access article distributed under the terms of the Creative Commons Attribution Non-Commercial License (http://creativecommons.otg/licenses/by-nc/3.0), which permits unrestricted non-commercial use, distribution, and reproduction in any medium, provided the original work is properly cited.
IOCP 게임 서버 및 게임 변수 난독화 프로그램 성능 평가※
차은상, 김영식
한국산업기술대학교 게임공학부 [email protected], [email protected]
Performance Evaluation of IOCP Game Server and Game Variable Obfuscation Program
Eun-Sang Cha, Youngsik Kim
Dept. of Game and Multimedia Engineering, Korea Polytechnic University
요 약
본 논문은 상용 게임 엔진인 언리얼 엔진이 지원하는 네트워킹 기능과 사용자 제작 IOCP 게 임 서버의 성능을 게임 내의 변수 전달 관점에서 비교 분석하였다. 이를 위하여 언리얼 엔진 4 를 기반으로 3D 게임과 IOCP 게임 서버를 자체 제작하였다. 그리고 코드 변조 게임 해킹 프로 그램의 메모리 수정을 방지하기 위해서 게임 변수 난독화 프로그램에 관하여 고찰한다. 이를 위하여 언리얼 엔진 솔루션 인 SCUE4 안티-치트 Solution을 활용하여 메모리 수정을 하는 것 을 방지하는 방법을 연구하고 성능 트레이드 오프에 대한 분석을 수행한다.
ABSTRACT
This paper analyzes performance difference between Unreal Engine's built-in network solution and IOCP server. To do this, we developed IOCP server and 3D game with Unreal Engine 4. Also we considered the game variable obfuscation program to prevent the modification of the memory of the code-modulated game hacking program. This paper used SCUE4 Anti-Cheat Solution, which is Unreal Engine's solution, to study preventing memory modification and to analyze performance trade-offs.
Keywords : Unreal Engine 4(언리얼 엔진 4), IOCP Game Server(IOCP 게임 서버),
Game Variable Obfuscation(게임 변수 난독화), Performance Evaluation(성능 평가)
1. 서 론
게임 내의 네트워크 기능은 게임 장르에 따라 가장 중요한 구현 요소로 자리 잡을 수 있다. 하지 만 게임 서버 구현은 다중 접속에 따른 시간 제약 문제, 동시성 지원, 보안 문제 등의 까다롭다는 문 제를 해결하여야 한다.
상용 게임 엔진에서는 이를 위해 독자적으로 네 트워킹을 위한 기능을 지원하여 편의성을 높여 게 임 엔진의 장점인 개발 기간의 단축 및 개발비용 의 절감하게 할 수 있다.[1]. 하지만 독자적으로 게 임서버를 구축하여 게임 서버 성능 최적화 및 보 안 문제 해결을 시도하는 노력이 많이 이루어지고 있다.
독작적인 게임 서버를 구축할 때는 IOCP (Input Output Completion Port) 게임 서버를 많 이 사용한다. 윈도우 소켓 입출력 모델 중 가장 뛰 어난 성능을 제공하기 때문이다[2]. 사용자 제작 게임 서버는 성능 최적화를 직접 수행하여야 하며 보안 문제 또한 해결해야 한다.
그 이유는 싱글 플레이 게임과 달리 멀티플레이 게임에서 사용자가 함부로 변수 값을 조작하는 행 위를 통해 타 사용자에게 상대적인 박탈감을 주어 게임 매출에 영향을 끼칠 수 있기 때문이다[3].
[Fig. 1] Unreal marketplace
이러한 문제점으로 인해 보안 강화를 위해 논문 [4]가 제시했던 것은 게임 보안 전용 솔루션 개발,
게임용 클라이언트 방화벽 설치 의무화, 인적 네트 워크 구축이 있으나 적은 인원의 독립 게임에는 비용 문제로 적용하기 힘든 부분이 있다.
비용을 절약하기 위해 독자 구현을 하려 해도 암호화 알고리즘 등, 여러 가지 생각할 부분들이 많고 시간도 많이 투자하여만 한다. 따라서 독자 구현은 힘들다. 대안으로 게임 엔진의 기능을 사용 하면 사용자가 원하는 특정한 부분들의 보안을 강 화에는 게임 엔진 자체의 기능들이 부족하다. 하지 만 Fig.1.에서 보이는 마켓에서는 관련 자료들을 찾을 수 있다.
마켓에서 보안에 관련한 에셋들은 대부분 암호 화 기능을 제공해 주는 것이 많으며 이러한 보안 대응은 메모리 해킹 및 코드 변조를 방지하며 사 용자가 직접 업데이트를 해주지 않아도 판매자가 업데이트를 하여 논문[5]에서 서술하였던 바와 같 이 우회를 할 수 있기 때문에 필요했던 지속적 업 데이트를 고려하지 않아도 되는 장점이 있다.
참고문헌 [6]에서는 메모리 해킹 및 코드 변조가 한국에서는 심각하지 않으면 해외에서 많이 발생하 고 있고, 해킹 툴 자체도 미약한 수준이라고 했지 만 관련 문제로 여러 게임들이 문제를 겪었다.
대표적인 예로서 슈퍼크리에이티브에서 개발한 에 픽세븐(Epic 7Seven) 게임 [10]의 치트오매틱 (Cheat ‘O Matic) 사태를 들 수 있다.
에픽세븐 치트 오매틱 사태란 모바일 게임인 에
픽세븐에서 메모리 스캐닝 프로그램 중 하나인 치
트오매틱에 의해 프로그램 조작이 가능했다는 것
이 알려지게 되면서 게임 사용자들이 관련 게임
커뮤니티에 불만을 나타내는 게시글을 올리고 게임
을 그만두는 등 일련의 사태를 의미한다. 이 사태
로 인해 매출의 영향을 끼칠 것으로 예상된다.
[Fig. 2] Cheat ‘O Matic
Fig.2에 보이는 치트오매틱은 메모리 스캐닝 프 로그램으로써 메모리값을 조정하여 기존 체력이 100이었으면 데이터상에서 100인 값을 찾아 그 값 을 10000으로 변경하는 등, 사용자의 능력치를 마 음대로 바꿀 수 있는 치트 프로그램 중 하나이다 [7, 8].
위의 사례를 보아 에셋을 추가하여 보안을 강화 하면 좋지만 대부분 에셋이 사용하는 기능인 암호 화는 암호화 부하가 걸리게 되어 게임 성능에 영 향을 끼치게 되고 이로 인해 논문[9]에서는 대책으 로 데이터 중요도에 따른 암호화 수치 등급화를 제시하여 암호화 부하를 최소한도로 줄인다. 하지 만 에셋을 사용하였을 때 암호화는 에셋이 제시하 는 암호화만 사용 가능하기 때문에 에셋을 사용하 여 암호화를 하였을 때 낮은 성능이 나올 수 있다.
본 논문에서는 언리얼 엔진으로 자체 제작한 3D 게임의 네트워크를 IOCP로 구현한 다음, 플레이어 들을 P2P로 연결할 때와 언리얼 엔진 내의 독자 네트워킹 간의 성능 비교를 하였고, 논문[8]이 제 시한 것처럼 로그 분석을 통한 치트 프로그램 탐 지가 아닌 에셋을 사용하여 메모리 스캐닝 프로그 램들을 방어하는 방법을 서술하고 에셋으로 암호화 를 하였을 때 암호화 부하에 의한 게임 성능 하락 동반[9]에 대해 알아본다.
2. 게임서버 제작 및 네트워크 성능평가
2.1 자체 제작 IOCP 게임 서버
언리얼 엔진 내의 네트워크 기능들은 이용하기 쉽게 돼있다. 사용자가 직접 코딩을 하는 것이 아 니어도 블루프린트를 이용해서 만들 수 있다.
블루프린트는 언리얼 엔진에서 제공하는 비주얼 스크립트이다. 프로그래머가 아닌 디자이너나 기획 자들도 쉽게 이용할 수 있게 만든 스크립트이다.
블루프린트를 사용하여 언리얼 엔진 네트워크 기능 을 이용할 경우 C++를 사용하여 네트워크를 구성 했을 때보다 성능이 떨어질 수 있다. 하지만 본 논 문에서 성능 테스트를 할 때 게임 엔진의 편의성 강조와 네트워크 성능 차이를 극대화하기 위해 블 루프린트를 사용하였다.
[Fig. 3] Unreal blueprint networking
Fig.3은 현재 언리얼 엔진 내에서 키 하나를 네 트워크 통신할 때의 모습을 구현한 것이다. 위와 같이 언리얼 독자 네트워크 기능은 간단하게 네트 워크 통신을 구현할 수 있다는 장점이 있다.
Fig.3의 작동 방식은 다음과 같다. Switch Has
Authority 함수를 통해 클라이언트와 서버를 구분
해 클라이언트에서 키를 눌렀을 때 리플리케이트
옵션이 Run on Server로 되어있는 이벤트를 호출
한다. 호출된 이벤트는 Run on Server 옵션에 따
라 서버에서 이벤트를 실행하게 된다. 이벤트를 실
행한 서버는 리플리케이트 옵션이 멀티캐스트인 이 벤트를 호출하게 되고 멀티캐스트 옵션에 따라 접 속된 모든 클라이언트에게 전송한다. 다른 경우로 서버에서 키를 눌렀을 때는 리플리케이트 옵션이 멀티캐스트인 이벤트를 호출하고 끝낸다.
사용자 네트워크 구성은 언리얼 엔진을 기반으 로 자체 제작한 3D 게임 Robogang을 사용한다.
Robogang의 네트워크는 IOCP와 언리얼 독자 네 트워킹 기능을 함께 사용하였으며, IOCP 구현은 언리얼 엔진 내에 존재하는 게임인스턴스를 C++
클래스로 만들어서 구현하였다. 게임인스턴스내에 는 서버 역할과 클라이언트 역할의 코드가 같이 들어있다.
자세한 Robogang의 네트워크 동작 방식은 다음 과 같다. 언리얼 엔진에서 제공하는 기능인 온라인 서브시스템 스팀 API(application program interface)를 통해 사용자가 게임을 접속했을 때 다른 유저와의 접속을 할 수 있게 하고 사용자가 세션이라 불리는 게임 플레이 공간을 만들었을 때 호스트, 다른 사용자의 세션에 참가할 때 클라이언 트로 구분하고 사용자의 이름은 스팀의 사용자 아 이디로 구분을 짓는다.
호스트에서는 자신의 게임 세션에 클라이언트가 접속할 시 언리얼 내부 네트워킹 기능을 이용하여 자신의 IP를 클라이언트에게 전해주게 되고, 그 후 클라이언트는 호스트에게 받은 IP를 통해 연결요 청을 보낸다. 연결된 이후 클라이언트에서 키 입력 을 하면, 키에 따라 달리 만들어져 있는 패킷 구조 체들을 통해 서버에 전송되고, 서버는 받은 패킷 구조체에 따라 다른 함수를 실행하게 된다.
클라이언트에게 서버가 패킷 구조체를 보낼 경 우에는 언리얼 내부 함수인 Tick에서 대기하고 있 던 윈도우 소켓이 입력값을 받게 되어 다시 언리 얼 내부로 전달하게 된다. 하지만 이러한 방식을 썼을 때 프레임마다 작동하는 Tick보다 빠르게 값 이 계속 전달된다면 데이터 누락 같은 현상이 발 생 할 수 있다.
클라이언트로 값을 받을 때 다른 쓰레드를 만들
고 무한 루프를 돌면서 값을 받지 못한 이유는 현 재 게임에서 언리얼 내부에서 가장 많이 반복되는 Tick 함수보다 많이, 더 빠르게 반복을 하므로 언 리얼 내부에서 오류로 판단하여 값을 무시했다 예 측된다.
[Fig. 4] Unreal GameInstance
Fig.4는 현재 만든 IOCP 네트워크가 들어간 게 임인스턴스의 헤더 모습 중 일부이다. 사용자가 키 를 눌렀을 때 키에 따라 사용할 함수들을 보여주 고 있다. 함수가 호출될 때 종류에 따라 다른 패킷 구조체들을 호출한 다음 구조체들을 서버로 보내는 방식이다.
블루프린트를 이용한 언리얼 네트워크 기능을 구현한 결과, 10개 내외의 함수들이 필요했다. 그 함수들은 언리얼 내부에 이미 구현되어 있어 프로 그래머가 아니더라도 쉽고 빠르게 구현할 수 있었 다.
[Fig. 5] IOCP CODE
Fig.5는 IOCP를 사용해 네트워크를 구현한 Robogang 코드 모습이다. Fig.5에서는 이미 많은 변수를 옮길 수 있으나 하나의 변수를 옮긴다고 가정하더라도 소켓 연결과 통신을 일일이 구현해야 한다. 서버와 클라이언트에 각자 연결과 연결 요청 함수가 필요하며, 둘 다 필요한 것은 데이터 전송 함수, 데이터 수신 함수가 필요했다. 서버에는 추 가로 연결 종료 함수 등이 필요하다. 위에 내용은 winsock을 사용하여 구현하였고 데이터 한 종류만 옮긴다는 가정 하에는 약 100줄이 넘는 코드가 필 요하게 된다.
2.2 성능 평가
[Fig. 6] Screen Shot of 3D Game, Robogang, based on Unreal Engine 4.
Fig.6에서 보이는 것은 본 논문에서 실험에 사 용한 Robogang 게임이다. Robogang은 본문 2.1 에서 언급했던 바와 같이 게임 매칭은 언리얼 엔 진의 기능 중 하나인 세션 매칭을 사용하고 있다.
게임 판매 플랫폼인 스팀의 사용자 아이디를 통해 매칭을 잡고 있으며 플레이 도중 키를 눌렀을 때 값 이동은 IOCP를 통해 통신한다.
성능 테스트는 서버 컴퓨터(Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz 3.00GHz 16GB RAM 64bit Windows 10), 클라이언트 컴퓨터 (Intel(R) Core(TM) i7-6700 CPU @ 2.60GHz 2.60GHz 16GB RAM 64bit Windows 10)에서 언리얼 에디
터의 독립형 게임 모드를 이용하여 측정하였다.
테스트는 2가지를 독립적으로 실시한다.
첫 번째, Robogang 게임 내에 IOCP 속도 테스 트 기준에서는 크기가 2바이트인 구조체인 cs_packet_networking을 생성하여 클라이언트에서 게임인스턴스 클래스를 통해 보낸 후 서버에서 다 시 클라이언트로 같은 내용의 패킷을 보냈을 때 걸리는 시간을 밀리초 단위로 구하였다. 언리얼 자 체 네트워크 사용도 클라이언트에서 서버로 전송하 는 리플리케이트 이벤트를 호출한 후, 리플리케이 트 이벤트에서 다시 클라이언트 호출 이벤트를 부 르는 방식을 사용하여 IOCP와 마찬가지로 클라이 언트가 서버를 거쳐 다시 클라이언트로 되돌아왔을 때 걸리는 시간을 구하였다.
두 번째, Robogang 게임 내부는 마우스를 이용 한 캐릭터의 회전과 총알 방향 등이 IOCP로 움직 이게 설계되어 있으나 IOCP 연결을 실패하였을 경우 언리얼 자체 네트워크로 움직이게 되어있다.
IOCP로 움직이는 경우와 언리얼 자체 네트워크로 구현할 경우의 성능 차를 구하였다.
첫 번째 테스트 결과는 Fig. 7과 Fig. 8에 Fig.
9에 나타난다. Fig.7은 IOCP의 네트워크 테스트 결과이다. 평균 36ms가 걸렸다. Fig.8은 언리얼 엔 진 자체 네트워크 기능 테스트 결과로써, 평균 29ms가 걸렸다. Fig.9는 두 그래프를 겹치게 하고 평균값을 추가한 그래프다.
[Fig. 7] Performance Evaluation for In-House IOCP Game Server in terms of Packet
Transmission Time(msec).
[Fig. 8] Performance Evaluation for Unreal Engine 4 Game Server in terms of Packet Transmission
Time(msec).
[Fig. 9] IOCP 네트워크와 언리얼 엔진 네트워크의 평균 값 그래프
두 번째 테스트 결과는 Fig.10과 Fig.11이다.
Fig.10은 IOCP를 사용했을 때 Robogang의 랜더 링 타임, Fig.11은 언리얼 엔진 네트워크를 사용했 을 때 랜더링 타임을 나타낸다. IOCP를 사용했을 때 프레임 당 랜더링 타임 평균값은 12.64ms, 언 리얼 엔진 네트워크를 사용했을 때 프레임 당 랜 더링 타임 평균값은 13.26ms를 보이고 있다.
IOCP로 구동했을 때 평균 랜더링 타임은 0.62ms 차이가 나며 약 5%의 속도 차이를 보인다.
[Fig. 10] Rendering time for the IOCP network
[Fig. 11] The rendering time of the unreal engine's own network
이와 같은 결과는 언리얼 자체 네트워크의 속도
가 느리지 않다는 것을 보여줬고 오히려 사용자가
직접 네트워크를 구성했을 때보다 빠를 수 있다는
것을 보여준다. 하지만 이 내용이 IOCP를 사용자
가 직접 구성했을 때보다. 반드시 자체 네트워크
기능이 빠르다는 것이 아니다. 본 논문에서 쓰인
Robogang 게임에서는 클라이언트에서 데이터를
받을 때 언리얼 내부의 Tick 함수를 사용하여 받
기 때문에 보편적 방법인 새로운 쓰레드를 생성하
여 While 루프를 통해 데이터를 받는 것보다 속도 가 느린 한계가 예상된다.
3. 언리얼 엔진의 보안
3.1 언리얼 엔진의 보안 구성
게임 보안은 여러 종류에서 고려해야 한다. 역할 에 따라 게임 클라이언트 내부 보안, 게임 서버 보 안 등을 생각하여야 하며 막아야 할 대상에 따라 유저 해킹, 백도어, 게임 핵, 패킷 핵, 데이터베이 스 침해 등이 있으나[4] 본 논문에서는 게임 핵을 막는 방법에 관해 서술한다.
게임 핵이란 사용자의 게임 캐릭터 능력치를 비 정상적으로 만드는 행위를 통칭한다. 예로 캐릭터 의 체력이나 공격력을 비정상적으로 높게 만드는 행위 등 있다.
게임 핵은 게임 내의 변수를 조작하여 작동하게 된다. 그러한 방법을 메모리 조작 해킹이라 하며 특정 프로그램들을 통해 쓸 수 있고 그런 프로그 램들은 메모리 수정프로그램이라 불리며 인터넷 검 색을 통해 손쉽게 접해 볼 수 있다.
메모리 수정프로그램의 작동 원리는 메모리 해 킹 및 코드 변조 기법을 사용하는 것으로, 대표적 인 예로써 치트-엔진은 오픈 소스로써 구하기 쉽 고 완성도 높은 메모리 수정 프로그램이다[5]. 이 프로그램을 사용할 시 사용자가 선택한 변수의 실 행 코드를 찾아 코드 조작을 도와주며, 사용자 해 킹 툴 자체 제작 기능, 게임이 치트 프로그램을 감 지하는 경우를 대비하여 은폐기능을 제공한다[6].
게임 핵의 대응 방법은 서버에서의 데이터 검증 을 이용하는 방법이 있으나 그 방법은 P2P 체제에 서는 서버 역할도 사용자가 맡게 되므로 사용할 수 없고, 사용하기 위해서는 치팅 행위를 감지하는 서버가 따로 필요하게 된다. 다른 방법으로는 데이 터를 암호화하여 메모리 수정프로그램에서 데이터 를 읽지 못하게 하는 방법이 있다.
두 방법 중 언리얼 엔진에서는 게임 핵을 막는
기본 기능으로 암호화 기능을 제공한다. 하지만 그 기능만으로는 치트-엔진과 같은 메모리 수정프로 그램을 막기 힘들다.
[Fig. 12] Cheat-Engine
Fig.12는 치트-엔진 화면이다. 원하는 게임 프로 세스를 클릭해 그 게임 내의 값을 접근하여 수정 할 수 있다.
[Fig. 13] Unreal Encryption/signing Key Generator
Fig.13은 언리얼 엔진에 있는 암호화 패널이다.
암호화는 보편적으로 게임에서 사용하는 보안 기능
인 난독화[7]를 사용한 것으로 이 패널의 옵션들을
수정하면 ini, Uasset과 같은 형식의 파일들을 암
호화 할 수 있다. 이렇게 난독화를 하게 되면 데이
터에 대한 보안이 강화되나 성능이 하락하게 되고
치트-엔진에 대한 변조를 방지할 수 없다.
[Fig. 14] Used Cheat-Engine in Unreal Engine
Fig.14은 언리얼 엔진으로 패키징한 게임에서 치트-엔진을 사용하였을 때 사용 모습이다. 사용 방법은 간단하다. 체력이 기존에 100이 있다면 치 트-엔진에 100을 쳐서 값이 100인 목록을 찾고 그 후 사용자가 체력 값에 변화를 주면 어떤 위치에 값이 들어있는지 파악할 수 있고 그 후, 값을 수정 할 수 있다. Fig.14에서는 현재 게임에 333으로 저장한 Test라는 int형 변수를 찾기 위해 게임 내 부에 P키를 눌렀을 때 Test는 111씩 증가하게 해 두었고 값이 111씩 증가하는 값들을 찾아 어떠한 값이 Test인지 파악할 수 있었다. 이러한 치팅은 언리얼 엔진의 암호화 패널을 사용하더라도 방지할 수 없었다.
[Fig. 15] SCUE4 Anti-Cheat Solution
그 대안으로 치트-엔진을 막기 위해 사용하는 것이 마켓의 보안 에셋이다. 그 중 본 논문에서는
마켓에 있는 Fig.15 SCUE4 Anti-Cheat Solution 을 사용한다. 줄여서 안티-치트이라 서술하겠다.
안티-치트의 사용법은 설치하여 플러그인을 체크 하고 Game Instance Class를 Safe Game Instance로 지정하거나 자신이 직접 Safe Game Instance를 부모로 하는 클래스를 만들어서 사용하 여도 된다.
그 후 변수 유형을 Safe 구조체로 변경하여 사 용한다. Safe 구조체로 변경하게 되면 외부에서 상 수를 이용한 값 변경이 차단된다. 이러한 방식으로 메모리 수정을 방지 할 수 있다.
[Fig. 16] Unreal Engine Safe value
Fig.16은 본 논문에 사용한 게임인 Robogang의 총 발사 부분이다. 현재 1초로 설정된 Safe RPSLimit이라는 Safe 구조체의 Safe float 형식인 보안 변수를 이용하여 외부에서 값 변수를 하려면 해독을 통해 보안 변수에 걸린 암호화를 해제해야 한다. 그로 인해 게임 핵 사용자가 암호를 해독하 지 못한다면 총 발사는 1초에 한 번 이상으로 발 사될 순 없다.
이 안티-치트를 사용한 게임을 실행 중일 때 치
트-엔진을 실행하여 Select a process to open을
클릭하였을 경우 자동으로 Cheat-Engine은 종료
된다. 안티-치트를 사용한 게임을 실행하면 게임
프로세스를 제외하고 ‘SCUE4’라는 독자 프로세스
가 켜지며 이 프로세스는 다른 프로세스의 이름을
감지한다. 만약 이름이 Cheat, hack가 포함되어 있
으면 프로세스를 강제로 종료시킨다. 이는 치트 프 로그램의 이름만 다르게 할 시 프로세스 감지를 빗겨갈 수 있다는 것을 보여준다.
[Fig. 17] Unreal Engine SCUE4 scan process code
이와 같은 역할을 하는 것이 Fig.17에 있는 TimerScanProcesses이다. 시간에 따라 계속하여 호출되고 있다. 에셋을 사용하지 않더라도 프로세 스 제거 함수인 TerminateProcess을 사용하여 만 들 수 있다.
위와 같은 경우로 보아 안티-치트을 사용한다 해도 모든 치팅을 막을 수 있는 것이 아니다. 게임 핵 경우만 서술하였으며 암호화 같은 경우에도 충 분히 해독할 여지가 남아있다. 본 논문에서 사용한 Robogang과 같은 P2P 게임에서는 게임 핵을 제 외하고도 치팅을 감지하려면 반드시 호스트를 제외 한 치팅 감지 서버가 필요하다[8].
3.2 언리얼 보안 에셋 성능 평가
보안 성능 테스트는 자체 제작 게임을 사용하지 않고 언리얼 엔진의 기존 프로젝트인 ThirdPerson Example을 이용하여 제작하였다.
성능 테스트는 네트워크 테스트에서 서버로 이 용하였던 (Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz 3.00GHz 16GB RAM 64bit Windows 10)을 사용하였다.
테스트 방법은 안티-치트를 사용하여 기존 변수 를 보안 변수로 변환시키고 언리얼 내부 함수인
Tick이 호출될 때마다 보안변수를 100번씩 호출하 여 if문 비교를 사용해봤다. 기존 변수를 사용했을 때 테스트를 해봤으며 테스트 결과는 언리얼 에디 터 상의 Game Stat을 이용하여 Tick이 한번 호출 될 때 완료될 때까지 걸리는 시간의 평균값을 밀 리초 단위로 구하였다.
언리얼의 Tick 함수는 프레임당 한 번씩 주기적 으로 호출되는 함수이다. 실험에 쓰인 컴퓨터에서 는 평균적으로 120프레임을 유지했다. 그러므로 1/120초마다 보안 변수 혹은 기존 변수를 100번 호출한다는 예측이 가능하다.
[Fig. 18] Performance Profiling using SCUE4 Anti-Cheat Solution Variables
Fig.18는 보안 변수를 사용했을 때의 성능 프로
파일링이다. 게임 내에서 Tick을 호출했을 때 완료
까지 걸리는 평균 시간이 5.60ms이다.
[Fig. 19] Performance Profiling using Normal Variables
Fig.19는 일반 변수를 사용했을 때의 성능 프로 파일링이다. 게임 내에서 Tick을 호출했을 때 완료 까지 걸리는 평균 시간은 3.48ms이다.
보안 변수를 사용했을 경우 걸리는 시간이 약 40% 증가하는 모습을 보이며 성능 하락이 반드시 동반된다는 것을 보여줬다. 이를 통해 보안 변수를 사용한다면 변수 중요도를 구분 지어 중요도가 높 은 부분에만 사용하고 중요도가 낮은 부분은 XOR 과 같은 간단한 암호화 알고리즘을 사용하거나 사 용하지 않는 선택적 암호화[9]를 통한 성능 하락을 최소한으로 막는 대책이 필요할 것으로 보인다.
4. 결 론
네트워크는 사용자가 직접 IOCP 네트워크를 구 성했을 때 36ms, 언리얼 독자 네트워크를 사용했 을 때 29ms 전송 속도를 보이며 오히려 언리얼 내부 기능을 사용했을 때 속도가 빠른 모습을 보 였다. 또한 구현 편의성 면에서 언리얼 독자 네트 워크 기능이 우월하므로 본 논문에서 테스트한 것 과 같이 적은 수의 인원을 쓰는 네트워크 게임이 라면 언리얼 독자 네트워크 기능을 사용하는 것이
좋다는 결론을 낼 수 있다.
보안에 경우 언리얼의 암호화 패널 옵션을 사용 하였을 때 치트-엔진을 막을 수 없었다. 하지만 안 티-치트을 사용했을 때 메모리 수정 프로그램인 치트-엔진을 이용해 변수 수정을 시도할 시 치트- 엔진이 종료되는 것을 보아 치트-엔진을 이용한 메모리 변조를 막아주는 것을 알 수 있다. 또한
안티-치트의 기능인 보안 변수를 사용하게 되면, 특정 암호화 키를 알지 못하는 이상 치트-엔진 말 고도 여러 메모리 수정 프로그램을 이용하여 침입 하였을 때의 보안도 보장하게 된다.
하지만 보안 변수를 사용하였을 때 일반 변수와 비교해 걸리는 시간이 40% 증가하는 모습을 보이 며 성능 하락이 반드시 동반된다는 것을 보여줬다.
이를 통해 보안 변수를 사용한다면 변수의 중요도 를 구분 지어 중요도가 높은 부분에만 사용하여 성능 하락을 최소한으로 막는 대책이 필요할 것으 로 보인다[9].
5. 향후 연구 내용
본 논문에서 사용한 Robogang의 언리얼 엔진
네트워크 형식은 언리얼 학습 자료인 멀티플레이어
슈팅을 참고하여 P2P 형식으로 제작하였다. 서버-
클라이언트 형식에 맞춘 게임을 사용하여 언리얼
엔진 네트워크와 자체 제작 네트워크의 성능을 비
교하고, 대중적으로 쓰이는 네트워킹 기법에선 위
와 같은 결론인 언리얼 독자 네트워크 기능이 속
도가 빠르다가 나오는지 향후 객관적인 실험을 통
해 알아볼 필요가 있다.
REFERENCES