최근 코로나 시국으로 원격접속을 통한 재택근무를 하는데, 생각보다 느리다는걸 느끼실껍니다.

그 이유는 mstsc 원격접속으로 접속되는 화면은 그래픽 카드를 쓰는게 아니고
소프트웨어 구현이라 cpu 파워를 쓰기 때문입니다.

 

그래서 별로도 remoteFX라는 것을 설정해서 hw 그래픽 카드를 사용할 수 있도록 하면
진짜 집에서 할만 하다란 생각이 드실겁니다.

en.wikipedia.org/wiki/RemoteFX

 

RemoteFX - Wikipedia

Microsoft RemoteFX is a Microsoft brand name that covers a set of technologies that enhance visual experience of the Microsoft-developed remote display protocol Remote Desktop Protocol (RDP).[1] RemoteFX was first introduced in Windows Server 2008 R2 SP1 a

en.wikipedia.org

설정법

1. 윈도키 + gpedit.msc 로 로컬 그룹 정책 편집기를 엽니다.

2.  컴퓨터구성 -> 관리 템플린 -> Windows 구성요소
        -> 터미널 서비스 -> 원격 데스크톱 세션 호스트 -> 원격 세션 환경으로 갑니다.

3. 모든 원격 데스크톱 서비스 세션에 "하드웨어 그래픽 어탭터 사용"을 "사용"으로 바꿔 줍니다.
나머지는 읽어 보시면서 필요한걸 사용으로 바꿔주도록 합니다.
"하드웨어 그래픽 사용" 이외 셋팅을 하실땐, 가능하면 옆에 노트북 or 옆에 자리 사람 pc 에서 원격 테스트를 하는게 좋습니다. 귀찮다고 모두 사용으로 바꿔 버리면 아래처럼 진짜 집에서 할때 연결이 안되 낭패를 볼 수 있습니다.

  
다 되었으면  RemoteFX For Windows Server 2008 R2 .. 폴더로 들어갑니다.

제 PC의 셋팅값. 성능을 잡으면서 원격 접속 오류가 안나는 셋팅을 찾는게 중요하고 모르겠으면 하드웨어 그래픽 어댑터 사용만 합니다..

4.  Configure RemoteFX (RemoteFX 구성) 을 사용으로 바꿔 줍니다.

 

5. 윈도우키 + lusrmgr.msc 로 로컬 사용자 그룹을 열어 줍니다.

6. 사용자에 원격으로 붙을 계정 속성으로 들어가서 소속 그룹에 Remote Desktop Users 를 추가해 줍니다.

6-a.  추가 방법

이후 리붓하고 노트북등으로 접속해 보면 한결 빨라진걸 느낄 수 있습니다.

 

제 책 소스(http://rosagigantea.tistory.com/589) 를 실습 하시려다가
에러가 난다고 하시는 분들이 많아서,

이를 좀 정리해서 해결법을 올려 드립니다.

(최근 회사일이 꽤 많이 바뻐서 시간을 못 내드리는 점 죄송합니다.)


 *이번에 github 계정을 만들어서 레파토리 생성했습니다.

https://github.com/galaxywiz/RoseServer.git 이며, 하기와 같이 다운 받을 수 있습니다.


컴파일은 Visual Studio 2017 Community 2017 로 컴파일 했습니다.

회사일 때문에 잠시 손 놓다가 최근 컴파일 해보니, C++ 이 많이 바뀌었네요 (회사에서는 Objective-C로만 작업해요 ;;;)



1. 컴파일이 안되요.

저도 최근 VS 2015가 나와서 기분좋게 깔아보고 구동하려고 하는데 소스 파일들이 에러가 나더군요...

 

이럴땐, 설정에 Platform toolset 항목에서 VS 2013으로 해주면 잘 컴파일이 됩니다.
뭔가 C언어를 또 개조할 생각을 가진건지... MS...참...

이러니 리눅스 계열 사람들이 MS를 싫어한다고 생각해요.. ㅠ.ㅠ

 

 

 

2. 서버를 실행하자마 off 되요.

제 책은 처음 부터 따라하기에는 아직 구성상 뒤죽박죽인 곳이 있습니다 ;ㅁ;..

보통 게임 서버 프로그램은 서버를 구동할때, 자신이 띄어도 되는지 확인하는 코드가 있습니다.

환경 설정 체크용이기도 하고, 사설 서버 감지용이기도 하죠.

제 소스를 보시면, 서버가 뜰때 SMTP, 즉 메일 서버 포트가 열려있는지 체크 합니다.

이 부분을 주석으로 날려주시거나, 서버 실행할때 smtp 서버를 먼저 띄우시면 해결 됩니다.

 

 

 

3. 클라이언트는 키자마자 로그인 에러가 뜹니다.

제 책에서는 서버를 위주로 설명하다 보니, 클라이언트에는 집중하지 못했습니다.

우선 서버가 먼저 떠있어야 클라이언트가 제대로 동작 할겁니다.  (그리고 이건 개별적으로 왜 그런지 찾아보는것도 좋은 공부라 생각합니다)

 

4. 데이터 베이스 설정은 어떻게 하나요?

Hyper-V의 가상 PC를 이용하셔서, MS-SQL express 설치 하시고, 압축해서 풀때 나오는 "게임 기본 쿼리.sql" 를 실행하시면 됩니다.

설정 방법은 책에 자세히 나와 있습니다.

 

* 즉 게임 서버 동작에 대해선

1. MS-SQL 설정을 먼저 합니다

2. smtp 서버 프로그램(책에 소개)를 받던지, 위의 소스를 수정합니다.

3. 서버를 구동합니다 (로그인 / DBAgent / 채팅서버)

4. 클라이언트를 구동합니다. 

   ㄴ 여기서 새 유저 등록 등은 직접 구현 해보시는편이 더 좋을 것 같습니다.

 

http://upaper.net/rosagigantea/1042923


국내 전자책 판매 및 yes24등 출판도 대행해주고 있는것 같더군요.

아직 ECN이 발급이 안되서 일반 인터넷 서점에서 구입이 안되지만, 조만간 될 것으로 보입니다.



지금 만들어 놓은 책 원고는 A4로 작성 했지만, 막상 가제본 만들때 보니

A4는 좀 부담스러운 크기더군요.

 

그래서 그것보다 약간 작은 4x8 배판으로 설정 했습니다.

이미 원고 작성된 상태에서 4x8 (188x254) 사이즈를 만들기는 어려워서 pdf 축소 인쇄를 사용해서 등록했습니다.

기존 크기에서 90%로 인쇄되었는데, 보는데 문제는 없어서 다행이란 생각이 들었습니다.

문제는 맞춤법인데, 개인 출판이다 보니, 전문적으로 교정해 주는 절차가 없어서,

직업 원고를 웹사이트의 맞춤법 교정 사이트로 2번씩 돌려보고, 그 원고를 여러번 읽었지만, 볼 때마다 오타가 생기네요. 

맞춤법으로 보기 언짢으신 분들께 미리 사과 드립니다.

 

또한 제가 현재 회사일 대문에, 책에 대한 질문을 받아드리기 어려운 점도 양해 부탁 드립니다.


<도착한 교보문고 퍼플 pod 책>

 

안의 내용, 인쇄 상태가 양호 합니다

소스 코드는 하이라이트를 했었지만, 책값 절감을 위해 흑백 인쇄를 하였습니다.

 

 

 

왼쪽이 교보문고 pod (4x8배판 인쇄)와 오른쪽 가제본으로 인쇄 업소에서 맡긴 A4판 입니다.

 

온라인 게임과 콘솔 / PC게임 이 두 가지 차이점은 무엇일까요?
당연한 이야기지만, 온라인 게임은 네트워크망을 사용해서 불특정 다수와 관계를 맺어가면서 즐기는 게임입니다.

그에 반해 콘솔 PC게임은 자신 홀로 게임 세계에 들어가 즐기는 게임이죠.


게임을 하다 보면, 이것저것 막힐 때가 있을 겁니다. PC 게임 같은 경우 데이터 파일을 헥사 파일로 열어서 특정 수치를 변조하여 초반부터 최고 레벨로 플레이를 하는 행위가 가능합니다.


하지만 온라인 게임의 경우는 조금 문제가 있습니다.
내 행동이 다른 이들에게 영향을 주는 게임이다 보니, 내가 게임이 지루하다고 내 캐릭터 레벨을 10에서 100으로 올려버리면, 다른 유저들이 힘들게 올린 100레벨은 무의미해지죠 박탈감이 심해져서 열심히 일한 개미(열정적인 유저들을) 떠나게 합니다.
그래서, 이런 치팅을 하지 못하도록 막아야 할 필요성이 생깁니다. 어떤 처리를 넣으면 좋을까요?

 

역사적으로 봤을 때, 인류는 이런 고민을 상당히 오래전부터 하였습니다.
오랜 예부터 특히 군대에서 적군이 눈치채지 않고 인접 아군에게 작전 지시를 내리는데,
전령이 적군에게 사로잡힐 경우를 대비해서 사용했던 암호화가 바로 그것입니다.

 

며칠 몇 시에 어느 곳으로 이동해서 어디를 공략해야 한다는 전술 명령을 산 건너 있는 부대장에게 전달해야 하는데,
이 작전 문서를 평문으로 보내면 어떻게 될까요?
전령병이 산을 넘다가 적에게 포로로 잡히면, 이 작전이 무산되거나, 혹은 명령서를 바꿔서 보내 작전이 원하는 대로 움직이지 않을 것이고 결국 전쟁에서 패배라고 말 것입니다.
그래서 옛날부터 이런 작전 문서의 문자를 암호화하여 난센스 문장을 써서 전달하는 시저 암호나 에니그마 같은 것이 나왔습니다.

 

서버 프로그램도 같습니다. 사실 클라이언트 프로그램이 유저에게 제공되는 순간, 이 클라이언트 프로그램은 소스까지 모두 제공한 거로 보셔야 합니다.

(자세한 건 리버싱 엔지니어링을 공부해 보세요) 그러므로 서버에 접속하는 프로그램이 반드시 제공한 클라이언트일 확신이 없으며, 이 클라이언트가 가짜라는 가정하여야 하고, 패킷은 난독화(Obfuscation)시켜서 송수신해야 합니다.

 

그러면, 키를 넣어 변조시킨 뒤, 다시 같은 키를 넣어 원래대로 데이터를 만드는 방법을 어떻게 하면 좋을까요?
일반적으로 자주 사용되는 방법은 XOR 연산입니다.

 

XOR는 배타적 연산으로 2개의 명제 중 하나만 참일 때 참을 출력하는 로직입니다.
이를 이용해서 3변수를 사용하지 않고 2변수 만으로도 swap 함수를 만들 수 있죠.
그럼 이제 특정 Key를 만들어서 패킷데이터에 XOR연산을 하면 사람이 알아보기 힘든 값이 나오겠군요.

해커들이 보고 한숨 쉴 수 있도록 작업해 봅시다.

추가: /ServerLibrary/ServerLibrary.h 

 

#include "./Net/Packet/PacketObfuscation.h"

 

패킷 난독화 소스를 서버 라이브러리에 추가하였습니다. 실제 구현 소스는 아래와 같습니다.

 

 추가: /ServerLibrary/Net/Packet/PacketObfuscation.h

 

#pragma once

#include "stdafx.h"

 

//--------------------------------------------------------//

// 난독화 최상위, 다른 난독화 알고리즘은 이 클래스를 상속 받을 것

class Obfuscation

{

public:

    virtual void encoding(Byte *packet, size_t len) = 0;

    virtual void decoding(Byte *packet, size_t len) = 0;

};

 

//--------------------------------------------------------//

class XorObfuscation : public Obfuscation

{

    Byte key_;

public:

    XorObfuscation();

private:

    void encoding(Byte *packet, size_t len);

    void decoding(Byte *packet, size_t len);

};

 

//--------------------------------------------------------//

// 패킷 난독화용

class PacketObfuscation : public Singleton < PacketObfuscation >

{

    Obfuscation     *obfuscation_;

public:

    PacketObfuscation();

    ~PacketObfuscation();

 

    void encoding(Byte *packet, size_t len);

    void decoding(Byte *packet, size_t len);

};

 

난독화 알고리즘은 여러 가지이지만, 소스에서 필요한 것은 인코딩/디코딩 정도이므로
이를 강제할 수 있게 최상위 순수 가상 클래스를 작성했습니다.
실제 사용하는 것은 PacketObfuscation 함수인데, 소스 내용은 아래와 같습니다.

 

 추가: /ServerLibrary/Net/Packet/PacketObfuscation.cpp

#pragma once

#include "stdafx.h"

#include "PacketObfuscation.h"

 

XorObfuscation::XorObfuscation()

{

    //암호 선택에 대해서는 조금 고민해 볼것.

    Key_ = 'T';

}

 

void XorObfuscation::encoding(Byte *packet, size_t len)

{

    for (int index = 0; index < len; ++index) {

        packet[index] ^= *key;

    }

}

void XorObfuscation::decoding(Byte *packet, size_t len)

{

    for (int index = 0; index < len; ++index) {

packet[index] ^= *key;

    }

}

 

//--------------------------------------------------------//

PacketObfuscation::PacketObfuscation()

{

    //Todo : xor 말고 다른 알고리즘도 만들어서 config xml에서 선택하게 하기

    obfuscation_ = new XorObfuscation();

}

 

PacketObfuscation::~PacketObfuscation()

{

    SAFE_DELETE(obfuscation_);

}

 

void PacketObfuscation::encoding(Byte *packet, size_t len)

{

    obfuscation_->encoding(packet, len);

}

 

void PacketObfuscation::decoding(Byte *packet, size_t len)

{

    obfuscation_->decoding(packet, len);

}

 

XOR 연산 킷값으로 ‘T’ 라는 단어를 주었습니다.
하지만 이 경우 해커가 key값을 0~255까지 XOR연산 테스트 하는 것만으로도 Key값이 확인 될 겁니다.

대부분 해커들은 채팅 메시지를 테스트 삼아 (‘aaaaa’입력 했을 때 패킷을 캡쳐 해서 분석) 이 XOR 키 값을 찾아갑니다.

 

그러므로 채팅 메시지는 별도로 암호화 처리 하는 것도 좋은 방법이라고 생각되지만,
여러 단어를 XOR값으로 테스트 하다 보면 쉽게 Key값을 알아 차리 겠군요.
좀 더 복잡하게 해서 해커를 혼란스럽게 만들어 봅시다.
...

 

위 내용은 제가 집필한 "게임 서버 프로그래밍 입문" 책의 내용중 일부 부분에 대한 내용입니다.

전체 소스 코드와 책 구입에 대해서는 http://rosagigantea.tistory.com/589 에 링크 시켰습니다.

 

 

+ Recent posts