카운터 스트라이크 온라인은 cs 1.6시절부터 내려오는 '데모' 라는 기능이 있습니다.
현재는 사용하는 유저가 많지 않지만,
아직도 스튜디오 모드를 제외한 게임에서 esc버튼을 눌러 메뉴를 호출해보면 해당 기능이 있고,
불법 프로그램 사용 유저를 제보할 때도 데모 영상및 데모 파일을 제보하여야 정확한 확인이 가능하다고 나와있습니다.
그렇다면, 이 '데모' 라는것은 무엇일까요?
대부분의 유저들이 개인 플레이 화면의 녹화 기능 정도로 인식하고 있을텐데,
데모는 '서버와 주고받은 패킷을 저장' 해놓은 파일 입니다.
따라서 이 데모파일은 단순한 화면을 녹화한 것이아닌, 서버와 주고받는 데이터
유저가 '클라이언트' 에서 입력한 명령들과, '클라이언트' 에서 엔진이 계산한 값들이 저장됩니다.
현재도 로비에서 설정에 들어가보면, 데모 재생 버튼을 통하여 데모를 재생할 수 있는데, 데모를 재생하게 되면 앞서 설명한
서버와 주고받은 데이터를 통하여 '녹화 당시 게임 상황을 재현' 하게 됩니다.
따라서 데모는 화면을 저장하는 동영상과는 전혀 다른 방법으로 저장되고, 재생합니다.
데모파일은 크게 [데모 헤더 - 데모 세그먼트 - 디렉토리 엔트리] 의 구조로 나뉘어져 있는데,
컴퓨터 관련 지식이 있는 사람은 알겠지만, 이는 TCP 통신 프로토콜의 형식과 매우 비슷한것을 알 수 있습니다.
1. 데모 헤더
데모 헤더는 데모 데이터를 저장하기 전 데모를 구성하는데 필요한 필수 구성 데이터들을 담고있는 부분으로,
카스온라인에서 방을 생성 후 대기실에 진입하게되면
위와 같이 카스온라인 설치폴더 속 바이너리 파일(bin 파일)안에 demoheader.dmf 파일이 생성되는 것을
확인할 수 있으며, 데모를 녹화할 시 해당 데모헤더 파일이 데모 파일의 가장 앞부분에 위치하게 됩니다.
이 데모헤더 부분에는 프리캐싱한 파일 목록, 함께 플레이한 플레이어와 플레이어의 cvar 정보, 위치한 서버주소,
디렉토리 엔트리의 위치(오프셋 주소)등등의 정보들이 담기게 됩니다.
2. 데모 세그먼트
데모 세그먼트는 본격적인 플레이 데이터를 저장하는 부분입니다.
이 데모 세그먼트는 9가지 타입으로 나뉘어서 해당 패킷이 어떤 패킷인지를 알 수 있도록 해두었습니다.
1. 넷 메세지 - 플레이어의 위치, 시점, 충돌 여부, 콘솔 등등 서버와 통신하여 결정되는 주요 데이터들이 담겨있습니다.
2. 데모 스타트 - 데모 세그먼트가 시작될 때 단 한 번 나오는 타입입니다. 데모 세그먼트의 시작을 알립니다.
3. 커맨드 - 플레이어가 입력한 커맨드를 저장합니다. 언제 어떤 명령을 전송하였는지 64바이트 문자열타입으로 저장됩니다.
4. 클라이언트 데이터 - 클라이언트 자체에서 결정하는 데이터로, 플레이어 위치 시점, Fov등등의 정보가 담겨 있습니다.
5. 세그먼트 종료 - 데모 세그먼트가 종료될 때 단 한 번 나오는 타입입니다. 데모 세그먼트가 종료되는 것을 알리는 타입입니다.
6. 이벤트 프레임 - 다양한 이벤트 프레임을 저장합니다. 이벤트가 일어나는 위치, 파라미터등을 저장합니다.
7. 무기 애니메이션 - 말 그대로 무기의 움직임 정보를 저장합니다.
8. 사운드 버퍼 - 해당 프레임에 어떤 소리가 났는지 소리 정보를 저장합니다. 발걸음 소리 등등 다양한 사운드가 있습니다.
9. 데모 버퍼 - 다음 데모 데이터 저장을 위한 버퍼입니다.
설명한 위 9가지의 데이터가 계속 반복되면서 프레임 별 정보가 순차적으로 나열되게 됩니다.
각각의 데이터가 나오기 전
{ 데이터 타입 (1바이트) } + { 시간 정보 (4바이트 실수형) } + { 프레임 정보 (4바이트 정수형) }
의 헤더가 먼저 선행되어 뒤에 나올 정보가 어떤 정보인지 구분할 수 있도록 되어있습니다.
간단히 예시를 들어보겠습니다. (이게 뭔데 씹덕아 하시는 분들은 밑으로 내려주시면 됩니다.)
위 02 는 데모의 타입으로 데모 타입2는 데모의 시작을 알립니다. 타임정보는 00 00 00 00 즉, 0초의 데이터, 프레임 정보또한 00 00 00 00 즉 0번째 프레임의 데이터를 담았습니다. 데모 타입 2는 따로 담는 정보가 없기때문에 다음 헤더를 찾게 됩니다.
다음 데모타입은 09, 데모 버퍼를 의미합니다. 이후 각각 4바이트는 0초, 0번째 프레임의 데이터임을 설명해줍니다.
데모 버퍼의 첫 4바이트는 데모 버퍼의 크기를 특정해줍니다. 08 00 00 00, 즉 데모버퍼는 8바이트로 확인됩니다.
위 사진에서 표시된 부분이 데모 버퍼입니다.
이런 식으로 각각의 데이터를 순차적으로 담게됩니다.
(당연한 말이지만, 이 데이터는 사람이 일일히 분석하기에는 데이터가 매우 크기 때문에 직접 분석하기엔 비효율적입니다.)
이 데모 세그먼트는 '서버와 통신한 패킷'을 기반으로 만들어지기 때문에 녹화하는 서버에 따라 패킷의 양이 달라집니다.
튜토리얼 모드, 좀비 사건파일 모드, 스튜디오 1인 모드는 카스온라인의 데디 서버를 거치지 않습니다.
일반적인 모드들의 경우
위와 같이 csods (카운터 스트라이크 온라인 데디케이티드 서버) 를 거쳐 방이 만들어짐을 콘솔에서 확인 가능한데,
좀비 사건파일 혹은 튜토리얼 모드 등 랜 서버를 사용하는 모드의 경우
위와 같이 데디 서버를 거치지 않는 호스트 서버로 개설됨을 알 수 있습니다.
호스트 서버의 경우 사용자의 컴퓨터가 서버의 역할을 겸하기에, 데모에 기록되는 패킷의 양 또한 많습니다.( 매 프레임마다 기록됨)
반대로 데디 서버의 경우 넥슨 서버와 통신을 하기에, 통신 패킷의 양만큼만 저장됩니다.
데디 서버와 통신하는 빈도는 1초에 16번입니다. 이는 스튜디오모드 api의 갱신 빈도, 산달폰 등등 범위 공격 무기의 범위 이동 빈도 등등 카스온라인 전반의 갱신은 해당 빈도로 이루어집니다.
따라서 일반 모드에서 녹화한 데모를 재생해보면 확실히 끊겨보이는 것을 확인할 수 있지만, 위에서 언급한 튜토리얼 모드, 사건파일 모드에서 녹화한 데모는 끊겨보이지 않고 재생 되는것을 확인 가능합니다.
여기서 스튜디오 1인모드의 경우는 왜 언급하지 않는지 궁금해 하시는 분들이 있을 수 있는데, 데모파일은 bsp 파일 (맵 파일) 기반으로 작성되도록 구성되어있습니다.
하지만, 스튜디오 모드의 경우 vxl 파일 (스튜디오용으로 개발된 넥슨 독자 규격)로 맵 데이터를 받아오기 때문에 데모의 녹화가 불가능합니다.
(여담으로 vxl 안에는 청크 별 데이터 및 맵 밝기, 안개 색, 하늘 종류, 루아 데이터등등의 정보가 담겨있어, vxl파일을 파싱하여 플레이하는 맵의 루아를 무단으로 가져올 수 있었습니다. 현재는 버그리포팅을 통하여 수정되었습니다. )
이러한 데모 세그먼트 데이터를 통하여
위와 같은 플레이어의 이동 경로,
커맨드 및 프레임 데이터 등등을 확인가능합니다.
이러한 데이터를 통하여 위 데모와 같은 비정상 데이터를 가진 불법 프로그램(핵) 사용 유저를 잡아낼 수 있습니다.(놀랍게도 '+strafe', '-strafe' 명령어는 카스온라인에 존재하는 명령어입니다. 덕팅핵으로 프레임이 비정상적으로 높아진 것으로 핵임을 알 수 있습니다.)
또한 반복된 명령 입력을 하는 매크로 유저또한 데모를 통하여 검거가 가능합니다. (덕팅 매크로, 버니합 매크로 딱대!!)
3. 디렉토리 오프셋
디렉토리 오프셋은 위에서 설명한 데모 세그먼트 데이터의 바로 뒤에 나오는 데이터로, 데모파일에서 길잡이 역할을 하게 됩니다. 직접 예시를 통하여 설명하겠습니다.
위에서 설명한 데모 세그먼트에서 타입 5가 나왔습니다. 00 80 76 3F = 0.962891 초의 데이터, 5F 00 00 00 = 95번째 프레임의 데이터로 데모가 끝이 납니다.
그 이후 나오는 데이터들이 디렉터리 오프셋입니다. 디렉토리 오프셋은 데모 세그먼트의 오프셋 주소, 프레임 수, 총 길이 등의 정보가 저장됩니다.
2D FF 00 00 = 65325가 데모 세그먼트 주소임을 알려줍니다. 위에서 데모 세그먼트 시작을 알려주는 타입2의 주소를 확인해보시면 동일함을 알 수 있습니다.
여기까지 데모파일의 구조에 대해 설명해드렸습니다.
+여담으로, 카스온라인의 데모는 cs1.6의 데모구성과 달라 많은 연구가 필요하였습니다.
데모 저장 방식이 달라 위와 같이 cs 1.6의 데모분석기로 카스온라인 데이터를 분석하려하면 오류가 발생합니다.
이 때문에 1대 1문의를 통하여 문의해보았지만,
언제나 그렇듯 든든한 운영진의 답변(..)
만들기로 마음먹은지 한달정도 걸려 최종 완성하였지만, 덕분에 퇴근하고 삽질 엄청나게 했습니다. 여기엔 설명하지 않았지만, 데모 세그먼트의 넷 메세지는 386가지의 데이터가 각자 다른 형(정수형, 실수형, 부호 모두 다 다름)과 각자 다른 크기로 저장되어있고, 클라이언트 데이터 또한 수십가지의 데이터가 각자 다른 형태로 흩어져 있어 매우 많은 데모녹화와 데모분석을 통하여 알아내야 했습니다(..)
데모 분석기의 경우에는 운영 약관 ⑤항으로 인하여 배포하려다 중단한 상황이고, 1대1문의를 통하여 확인 후 괜찮다는 답변이 오면 배포용 버전의 데모분석기를 배포해보려 합니다.
++ 데모 분석기의 배포는 불가능할 것으로 보입니다.
안타깝네요.