5. Singleton (mathematics)
In mathematics, a singleton, also known as a unit set,[1] is a
set with exactly one element. For example, the set {0} is a
singleton.
The term is also used for a 1-tuple (a sequence with one
element).
싱글턴 패턴(Singleton pattern)
주어진 임의의 시점에서 시스템 내에 단 하나의 인스턴스만 존재하는 객체를 가리킨다.
예, XxxManager 클래스
6. Global object vs Singleton object
- 전역객체의 진화
- 객체의 생성/소멸 시점 제어
Singleton 고려사항
- Singleton 객체의 생성, 소멸시점
- Thread safe 고려
Singleton 다양한 구현
- Scott Meyers style
- 함수에 static 지역 변수를 넣고 싱글턴을 구현한 방식
- Phoenix, Loki, Mordern C++ design
- etc
12. Interface Design (잠깐 생각해보기)
비행기 조종석의 인터페이스는 어느 쪽인가?
단순함 vs 복잡함 vs 혼란스러움
- 의미 구별
- 단순함은 복잡함의 반대가 아니다
복잡함은 세상의 모습이고, 단순함은 마음의 상태다.
User는 Simple과 Complex 둘 중 무엇을 원하는가?
Clear 명확한 이해
우리에겐 보이는 심플함보다 제품을 이해
하고 쉽게 사용할 수 있는 적절한 복잡함이
필요하다.
- 도널드 노먼
13. Purpose
- 실행 시점에서 함수를 외부로 노출시키고, (실행속도, 편의성을 유지하며)
동적으로 바인딩하는 한 가지 방법에 대해 설명
Scripting Engine의 요구사항
- 스크립트에서 코드의 함수(인자포함)를 호출할 수 있도록 한다
RPC의 요구사항
- 원격으로 함수를 호출할 수 있도록 한다
- ID와 function pointer의 맵핑
Function call의 요구사항
- Function name
- Memory 상의 function 위치
- Function arguments
14. 시도#1
- 게임의 함수를 스크립트에서 호출할 수 있도록 하는 RPC로 네트웍을 통해 전달하
는 범용적 방법을 시도한다
void Foo();
void Bar(); Function g_Functions[] =
{
enum eFunction { ”Foo”, Foo, FUNCTION_FOO },
{ { ”Bar”, Bar, FUNCTION_BAR },
FUNCTION_FOO, //…
FUNCTION_BAR, };
//….
};
struct Function 사용
{ - ID로 전송 및 함수 호출
typedef void (*Proc)();
const char* m_Name; 문제점
Proc m_Proc; - 함수 인자 처리
eFunction m_Function;
};
15. 시도#2
- 시도#1의 부분적 해결책 : 함수 파라미터를 처리한다
struct Parameters void Foo(Parameters& params)
{ {
std::vector<unsigned char> m_Data; int p1 = params.ExtractInt();
float p2 = params.ExtractFloat();
bool ExtractBool(); // p1,p2를 사용
int ExtractInt(); }
float ExtractFloat();
const char* ExtractString();
void AddBool(bool);
void AddInt(int);
void AddFloat(float);
사용
void AddString(const char*);
- ID로 전송 및 함수 호출
};
struct Function
{
문제점
typedef void (*Proc)(Parameters&);
- 함수 인자 타입 불일치 문제
- 함수 호출 처리의 불편함
std::string m_Name;
Proc m_Proc;
eFunction m_Function;
};
16. 절반의 해결
- 일반화된 방식으로 함수를 호출하기 위한 함수 사양 테이블을 이용한다.
struct Function
{
enum eVarType // 간단한 변수 사양
{ VAR_VOID, VAR_BOOL, VAR_INT, VAR_FLOAT, VAR_STRING, };
enum eCallType // 가능한 함수 호출 규약들
{ CALL_CDECL, CALL_FASTCALL, CALL_STDCALL, CALL_THISCALL, };
typedef std::vector<eVarType> ParamVec;
std::string m_Name;
void* m_Proc;
unsigned int m_SerialID;
eVarType m_ReturnType;
ParamVec m_ParamTypes;
eCallType m_Calltype;
};
typedef std::vector<Function> FunctionVec;
FunctionVec g_Functions; // 노출할 함수들의 사양들을 담을 벡터
17. 해결책의 완성
- EXE의 익스포트 테이블로부터 함수정보를 얻는 방식을 적용하여 함수를 일반화된
방식으로 호출하는 시스템을 갖추어 사용한다.
결론
- 함수를 일반화된 방식으로 호출하는 시스템을 갖추어 사용한다.
소감
- 초반에는 기대를 했지만 후반부로 갈 수록 그다지 와 닿지는 않음.
- 그러나 다른 곳에 이러한 방법을 적용해 볼 수 있었다.
- Python object Extract 시에 사용해봄.
19. Purpose
- 온라인 게임을 위한 응용 수준 통신 프로토콜의 구축에 대한 몇 가지 기법 소개.
네트워크 패킷의 구성
- 헤더, 바디(페이로드)
Packet 변조 공격
- 페이로드의 값 변경 : checksum 적용으로 해결 (MD5 해싱알고리즘)
- 취약점
- 클라이언트 프로그램에 체크섬 코드가 존재 : 리버스엔지니어링 위험
- 패킷 리플레이
Packet Replay 공격
- 클라에서 보내는 패킷을 스니핑해서 짧은 시간에 여러 번 재전송이 가능
- wpepro같은 툴로 가능
- 방어
- 서버 측 : 일정 시간 내 정해진 개수만큼 수신 제한
- Sequence number
- Prime number
20. 결론
- 초기 버전부터 암호화 기법을 적용하자.
- 치팅을 불가능하게 만드는 것을 목표로 삼는 것은 너무 소모적이며 불가능할 수 있
다.
- 치팅에 드는 노력을 최대한 크게 하는 것을 목표로 삼는 것이 현실적이다.
소감
- 적용