SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
Game
Programing
Gems
[1.11] 온라인 게임을 위한 프로토콜
2015 – 07 – 02 NHN NEXT 남세현
대부분의 암호화 기술은
“신뢰된 송신자와 신뢰된 수신자가
신뢰되지 않은 네트워크망을 통해 정보를 주고 받을때”를 고려함.
근데 온라인 게임에서는
수신자 (서버) 는 신뢰됨.
허나 송신자는 신뢰 안됨. 
더 큰 문제는, 해커들이 리버스 엔지니어링으로
클라이언트 프로그램을 뒤집어 까볼 수 있다는거임.
100% 안전한 길은 없다
완벽하게 지키는 방법은 없다 – Prof. SM9
대신
공격하기 어렵게, 귀찮게 만들 순 있다!
( 공격 성공률을 낮춰 피해를 없게 만들고
공격이 들어오는걸 확인하면
그 사람을 ‘운영’적으로 조지는게
제일 확실한 방법. 뭐.. 고소 한다던가. )
단어 정의
패킷
◦ 알죠? 찡긋^^
헤더
◦ 알죠? 찡긋^^
페이로드 (= 바디)
◦ 알죠? 찡긋^^
수비 1. 페이로드 조작 막기
대부분의 해커들의 공격 방법
1. 패킷 조금 수정해서 보냄.
2. 무슨 일이 발생하는지 봄.
3. 오호!
이것을 막는 방법 중 하나는 CheckSum
◦ 알죠? 찡긋^^
수비 1. 페이로드 조작 막기
CheckSum
◦ 전체 바이트의 값들을 더한 값(SUM)
에이 이건 뚫기가 너무 쉽잖아?
◦ 저 Sum 값을 해싱해서 보내기. MD5같은거
수비 1. 페이로드 조작 막기
CheckSum
약점
1. 리버스 엔지니어링
◦ 어떻게 CheckSum 만들었는지 코드가 다 보임.
2. 유효한 패킷 하나를 잡아내고,
그걸 계속 보낼 수 있음 - 패킷 리플레이
수비 2. 패킷 리플레이
Packet Replay
평화로운 N 모 회사.
오늘도 활기차게 출근한 변태 남 모 군은
클라이언트 공격 부분을 구현했습니다.
If( 지난 공격한지 (1/공격속도)초 보다 넘었으면)
◦ { 서버에 공격 명령 패킷을 날림 }
그리고 서버에서는 공격 명령 패킷이 올 때마다
공격 퓩 퓩 퓩 땅땅땅빵!
수비 2. 패킷 리플레이
Packet Replay
평화로운 N 모 회사.
오늘도 활기차게 출근한 변태 남 모 군은
클라이언트 공격 부분을 구현했습니다.
If( 지난 공격한지 (1/공격속도)초 보다 넘었으면)
◦ { 서버에 공격 명령 패킷을 날림 }
그리고 서버에서는 공격 명령 패킷이 올 때마다 공격 퓩 퓩 퓩 땅땅땅빵!
해커가 공격 패킷을 1초에 10번 날리면?
X됨. 에이~ 요즘에 그런 서버 가 어디있어?
아직도 있다고 함. 알콜코더님 트윗에서 봄
수비 2. 패킷 리플레이
가장 기본적인 수비 방법
◦ 서버에 똑같은 로직 넣어서 처리하기.
◦ (아직 쿨탐 안끝났으면 패킷 무시)
근데 문제가 있음
◦ 네트워크 문제로 패킷이 뭉쳐서 오면?
◦ 정상 패킷을 비정상으로 오인할 수 있음.
수비 2. 패킷 리플레이
더 나은 수비 방법
◦난수 생성기
패킷 안에 난수를 넣어서 보냄.
아래 둘은 같은 종류의 패킷이지만, 난수가 다름
공격 : X가 Y를 Z만큼 쾅!
난수 : 1155
공격 : X가 Y를 Z만큼 쾅!
난수 : 3421
수비 2. 패킷 리플레이
순서
1. 보낼 패킷 하나를 만듬.
2. 난수 생성기에서 만든 난수를
패킷에 넣음. 난수 만들기 귀찮으면 1씩 증가시켜도 됨. ㅎㅎ
3. 난수 생성기는 다음 난수를 만듬.
서버도 난수 생성기를 똑같이 만듬.
똑같이 난수 만들면서,
와야 할 난수가 제대로 왔는지 확인함.
수비 2. 패킷 리플레이
역시 약점이 있다
1. 시드(Seed) 동기화 문제
◦ 시드를 고정시키면 해커가 금방 찾아냄.
◦ 서버에서 난수를 결정해서 보내주자.
2. 난수 머신 동기화 문제
◦ 패킷이 드랍되면?
◦ 서버에서 판단해서 계산. 정말 드랍때문인
지 판단.
◦ 아니면 TCP 쓰세요 님들아
수비 2. 패킷 리플레이
3. Rand()는 너무 약해요.
◦ 수 많은 질 좋은 Random 함수가 있음.
구글링 ㄱㄱ
4. 하지만.. 역시나 리버스 엔지니어링에
취약함.
◦ 워쩔 수 없어.
◦ 그래서 돈을 많이 벌려면 리버스 엔지니어링을 배우세요.
수비 N. 추가적인 기법
아이디어
해커에게 혼란을 주기 위해서는
동일한 페이로드(바디)를 가진 두 패킷을
다른 모양처럼 보이게 만들어야 한다.
구현
난수 만든거 있죠?
그걸로 클라에서 XOR 연산을 시키자.
서버에서는 복구하고.
수비 N. 추가적인 기법
물론
해커가 눈치 챌 수 있다.
1. 패킷 크기가 똑같아서
◦ -> 똑같은 종류의 패킷이라도 패킷 뒤에 의미없는
더미 데이터 붙여서 문제 해결 가능.
◦ ->->근데 별로 비추. 패킷 크기 증가 == 비용 증가
2. 리버스 엔지니어링을 통해서
수비 N. 추가적인 기법
물론
해커가 눈치 챌 수 있다.
하지만 그건 크게 중요하지 않다.
핵심은 ‘해커가 혼란스럽게 하기’ 이다.
다시 말하지만, “완벽한 수비”는 없다
본질적인 한계
본질적인 한계
◦ 코드 자체가 클라이언트 프로그램에 들어있다.
역시나, 아이디어는 똑같다. 혼란스럽게 하자.
◦ 코드 자체가 클라이언트 프로그램에 있지만,
◦ 그거 분석하기 어렵게 만들자. – 코드 암호화, 심볼 제거 등
◦ 혹시 해커가 분석했으면?
◦ 채용해라.
아니면 핵심 코드들은 서버에서 돌리도록 하자.
◦ (사실 굉장히 당연한 부분)
결론
치팅을 아예 불가능하게 만드는 것?
◦ 너무 소모적이며 불가능할 수도 있다.
그러므로,
치팅에 드는 노력을 최대한 크게
(엄두를 내지 못할 정도로)
하는 것을 목표로 삼는 것이 현실적이다.
요약 : 못막아. 근데 귀찮게 해봐.

Weitere ähnliche Inhalte

Andere mochten auch

Kgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fKgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fSeungmin Shin
 
장재화, Replay system, NDC2011
장재화, Replay system, NDC2011장재화, Replay system, NDC2011
장재화, Replay system, NDC2011재화 장
 
NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출tcaesvk
 
모바일 게임 보안
모바일 게임 보안모바일 게임 보안
모바일 게임 보안TOAST_NHNent
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규ChangKyu Song
 
게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해Seungmo Koo
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 

Andere mochten auch (8)

Kgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fKgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-f
 
장재화, Replay system, NDC2011
장재화, Replay system, NDC2011장재화, Replay system, NDC2011
장재화, Replay system, NDC2011
 
NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출
 
모바일 게임 보안
모바일 게임 보안모바일 게임 보안
모바일 게임 보안
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
 
게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 

Ähnlich wie Game programing gems 1.11

Art of hacking 발표자료
Art of hacking 발표자료Art of hacking 발표자료
Art of hacking 발표자료Dennis Kim
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013devCAT Studio, NEXON
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요NAVER D2
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법NAVER D2
 
넌프로그래머를 위한 서버/네트워크
넌프로그래머를 위한 서버/네트워크 넌프로그래머를 위한 서버/네트워크
넌프로그래머를 위한 서버/네트워크 Rhea Strike
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기NAVER D2
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011devCAT Studio, NEXON
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhudMinGeun Park
 
Network programming report
Network programming reportNetwork programming report
Network programming reportJongwon
 
Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자용진 조
 
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기flashscope
 

Ähnlich wie Game programing gems 1.11 (20)

Art of hacking 발표자료
Art of hacking 발표자료Art of hacking 발표자료
Art of hacking 발표자료
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
Docker
DockerDocker
Docker
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
 
넌프로그래머를 위한 서버/네트워크
넌프로그래머를 위한 서버/네트워크 넌프로그래머를 위한 서버/네트워크
넌프로그래머를 위한 서버/네트워크
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Scalable webservice
Scalable webserviceScalable webservice
Scalable webservice
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
Network programming report
Network programming reportNetwork programming report
Network programming report
 
Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자
 
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
 

Mehr von Sehyeon Nam

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17Sehyeon Nam
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11Sehyeon Nam
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10Sehyeon Nam
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Sehyeon Nam
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuSehyeon Nam
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획Sehyeon Nam
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 Sehyeon Nam
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티Sehyeon Nam
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 Sehyeon Nam
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 Sehyeon Nam
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법Sehyeon Nam
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법Sehyeon Nam
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmarySehyeon Nam
 

Mehr von Sehyeon Nam (15)

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong Yu
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmary
 
D2 ppt
D2 pptD2 ppt
D2 ppt
 

Game programing gems 1.11

  • 1. Game Programing Gems [1.11] 온라인 게임을 위한 프로토콜 2015 – 07 – 02 NHN NEXT 남세현
  • 2. 대부분의 암호화 기술은 “신뢰된 송신자와 신뢰된 수신자가 신뢰되지 않은 네트워크망을 통해 정보를 주고 받을때”를 고려함. 근데 온라인 게임에서는 수신자 (서버) 는 신뢰됨. 허나 송신자는 신뢰 안됨.  더 큰 문제는, 해커들이 리버스 엔지니어링으로 클라이언트 프로그램을 뒤집어 까볼 수 있다는거임.
  • 3. 100% 안전한 길은 없다 완벽하게 지키는 방법은 없다 – Prof. SM9 대신 공격하기 어렵게, 귀찮게 만들 순 있다! ( 공격 성공률을 낮춰 피해를 없게 만들고 공격이 들어오는걸 확인하면 그 사람을 ‘운영’적으로 조지는게 제일 확실한 방법. 뭐.. 고소 한다던가. )
  • 4. 단어 정의 패킷 ◦ 알죠? 찡긋^^ 헤더 ◦ 알죠? 찡긋^^ 페이로드 (= 바디) ◦ 알죠? 찡긋^^
  • 5. 수비 1. 페이로드 조작 막기 대부분의 해커들의 공격 방법 1. 패킷 조금 수정해서 보냄. 2. 무슨 일이 발생하는지 봄. 3. 오호! 이것을 막는 방법 중 하나는 CheckSum ◦ 알죠? 찡긋^^
  • 6. 수비 1. 페이로드 조작 막기 CheckSum ◦ 전체 바이트의 값들을 더한 값(SUM) 에이 이건 뚫기가 너무 쉽잖아? ◦ 저 Sum 값을 해싱해서 보내기. MD5같은거
  • 7. 수비 1. 페이로드 조작 막기 CheckSum 약점 1. 리버스 엔지니어링 ◦ 어떻게 CheckSum 만들었는지 코드가 다 보임. 2. 유효한 패킷 하나를 잡아내고, 그걸 계속 보낼 수 있음 - 패킷 리플레이
  • 8. 수비 2. 패킷 리플레이 Packet Replay 평화로운 N 모 회사. 오늘도 활기차게 출근한 변태 남 모 군은 클라이언트 공격 부분을 구현했습니다. If( 지난 공격한지 (1/공격속도)초 보다 넘었으면) ◦ { 서버에 공격 명령 패킷을 날림 } 그리고 서버에서는 공격 명령 패킷이 올 때마다 공격 퓩 퓩 퓩 땅땅땅빵!
  • 9. 수비 2. 패킷 리플레이 Packet Replay 평화로운 N 모 회사. 오늘도 활기차게 출근한 변태 남 모 군은 클라이언트 공격 부분을 구현했습니다. If( 지난 공격한지 (1/공격속도)초 보다 넘었으면) ◦ { 서버에 공격 명령 패킷을 날림 } 그리고 서버에서는 공격 명령 패킷이 올 때마다 공격 퓩 퓩 퓩 땅땅땅빵! 해커가 공격 패킷을 1초에 10번 날리면? X됨. 에이~ 요즘에 그런 서버 가 어디있어? 아직도 있다고 함. 알콜코더님 트윗에서 봄
  • 10. 수비 2. 패킷 리플레이 가장 기본적인 수비 방법 ◦ 서버에 똑같은 로직 넣어서 처리하기. ◦ (아직 쿨탐 안끝났으면 패킷 무시) 근데 문제가 있음 ◦ 네트워크 문제로 패킷이 뭉쳐서 오면? ◦ 정상 패킷을 비정상으로 오인할 수 있음.
  • 11. 수비 2. 패킷 리플레이 더 나은 수비 방법 ◦난수 생성기 패킷 안에 난수를 넣어서 보냄. 아래 둘은 같은 종류의 패킷이지만, 난수가 다름 공격 : X가 Y를 Z만큼 쾅! 난수 : 1155 공격 : X가 Y를 Z만큼 쾅! 난수 : 3421
  • 12. 수비 2. 패킷 리플레이 순서 1. 보낼 패킷 하나를 만듬. 2. 난수 생성기에서 만든 난수를 패킷에 넣음. 난수 만들기 귀찮으면 1씩 증가시켜도 됨. ㅎㅎ 3. 난수 생성기는 다음 난수를 만듬. 서버도 난수 생성기를 똑같이 만듬. 똑같이 난수 만들면서, 와야 할 난수가 제대로 왔는지 확인함.
  • 13. 수비 2. 패킷 리플레이 역시 약점이 있다 1. 시드(Seed) 동기화 문제 ◦ 시드를 고정시키면 해커가 금방 찾아냄. ◦ 서버에서 난수를 결정해서 보내주자. 2. 난수 머신 동기화 문제 ◦ 패킷이 드랍되면? ◦ 서버에서 판단해서 계산. 정말 드랍때문인 지 판단. ◦ 아니면 TCP 쓰세요 님들아
  • 14. 수비 2. 패킷 리플레이 3. Rand()는 너무 약해요. ◦ 수 많은 질 좋은 Random 함수가 있음. 구글링 ㄱㄱ 4. 하지만.. 역시나 리버스 엔지니어링에 취약함. ◦ 워쩔 수 없어. ◦ 그래서 돈을 많이 벌려면 리버스 엔지니어링을 배우세요.
  • 15. 수비 N. 추가적인 기법 아이디어 해커에게 혼란을 주기 위해서는 동일한 페이로드(바디)를 가진 두 패킷을 다른 모양처럼 보이게 만들어야 한다. 구현 난수 만든거 있죠? 그걸로 클라에서 XOR 연산을 시키자. 서버에서는 복구하고.
  • 16. 수비 N. 추가적인 기법 물론 해커가 눈치 챌 수 있다. 1. 패킷 크기가 똑같아서 ◦ -> 똑같은 종류의 패킷이라도 패킷 뒤에 의미없는 더미 데이터 붙여서 문제 해결 가능. ◦ ->->근데 별로 비추. 패킷 크기 증가 == 비용 증가 2. 리버스 엔지니어링을 통해서
  • 17. 수비 N. 추가적인 기법 물론 해커가 눈치 챌 수 있다. 하지만 그건 크게 중요하지 않다. 핵심은 ‘해커가 혼란스럽게 하기’ 이다. 다시 말하지만, “완벽한 수비”는 없다
  • 18. 본질적인 한계 본질적인 한계 ◦ 코드 자체가 클라이언트 프로그램에 들어있다. 역시나, 아이디어는 똑같다. 혼란스럽게 하자. ◦ 코드 자체가 클라이언트 프로그램에 있지만, ◦ 그거 분석하기 어렵게 만들자. – 코드 암호화, 심볼 제거 등 ◦ 혹시 해커가 분석했으면? ◦ 채용해라. 아니면 핵심 코드들은 서버에서 돌리도록 하자. ◦ (사실 굉장히 당연한 부분)
  • 19. 결론 치팅을 아예 불가능하게 만드는 것? ◦ 너무 소모적이며 불가능할 수도 있다. 그러므로, 치팅에 드는 노력을 최대한 크게 (엄두를 내지 못할 정도로) 하는 것을 목표로 삼는 것이 현실적이다. 요약 : 못막아. 근데 귀찮게 해봐.