Inflearn - '[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB, 대형구조, 라이브 준비)'를 스터디하며 정리한 글입니다.
해킹이란 왜 일어나고 어떤 식으로 일어날까?
함수에 대한 호출 정보는 Stack에 쌓여나감
return Link
에 이상한 값이 씌워진 경우 코드의 흐름을 제어할 수 있게 됨
그 이상한 값이 다음과 같은 쉘 코드
의 위치일 경우 실행되는 위치의 데이터도 조작이 가능하게 됨
공격에 사용될 수 있는 취약점 (Window 커널 버그, Chrome, IE 등) 찾으면 초대박!
-> But, 우리 게임 서버와는 특별히 상관이 없음
일반적인 핵 종류 : 스피드핵, 월핵, 맵핵
1). 메모리 조작 (vs 코드 난독화, 메모리 보호 등)
2). 패킷 조작 (vs 암호화 등)
3). 리버싱
Server-based
: 중앙 서버가 심판 역할을 해서 보안 쪽으로는 안전함
P2P
: 한 명이 방장 역할을 맡게 되고 나머지가 방장에게 붙는 관계
암호학 : 데이터를 남이 보더라도 무엇인지 알아채지 못하게 만드는 것
패킷 조작을 막기 위해 암호화를 한다고 해도 결국 리버싱으로 암호를 까볼 수 있음
그럼에도 왜 암호화를 해야 할까?
양방향
단방향 - 사용자의 비밀번호를 DB에 저장할 때 유용
대칭키 암호만으로 Key 자체를 안전하게 보내는 방법은 아직 없음
수학적인 난제를 기반으로 만듦
컨텐츠 패킷 암호화 : 대칭키 암호
로그인 인증, 키 교환 : 비대칭키 암호
비밀번호 DB 저장 : HASH
셋 중에 하나라도 느려지면 게임 느려질 수 밖에 없음
게임은 모든 컨텐츠끼리 서로 맞물려 있는 경우가 많으므로 DB 데이터를 분산하여도 동시에 같이 처리해야 하는 경우가 많기 때문
account 서버 (로그인 서버)
가 하나 더 있어야 함우리 프로젝트에서는 웹서버로 account 서버를 구현할 것