목차

반응형

자꾸 firebase 플러그인 설치하고나서부터 이런 로그가 엄청뜬다.

 

로그는 아래와 같다. 한 20개쯤 쌓인다.

Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll.mdb: editor enabled True, build targets [] (current target Android)

UnityEngine.Debug:Log(Object)

 

Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll metadata will be checked

UnityEngine.Debug:Log(Object)

 

 

Assets > Play Services Resolver > Version Handler > Settings > Verbose logging

Verbose logging를 비활성화 하고 OK를 하면 이제 로그가 안뜬다.

반응형

'Unity' 카테고리의 다른 글

유니티 포물선 운동의 모든 것 - 작성중  (0) 2020.09.26
유니티 파이어베이스 이벤트 로깅  (0) 2020.09.22
유니티 꿀팁  (0) 2019.02.27
유니티 물체 따라다니도록 하기  (0) 2019.02.24
유니티 씬 관리  (0) 2019.02.17
반응형

노드에서 파이어베이스 실시간 DB를 사용하려고 하면 

아래 코드에서 오류가 발생한다.

var db = admin.database();

찾아보니 파이어베이스의 컴포넌트가 제대로 설치가 안돼서 그렇다고 한다.

 

프로젝트에서 아래 명령어로 라이브러리 설치를 해주면 해결된다.

npm install --save @firebase/app

 

출처

https://github.com/firebase/firebase-admin-node/issues/722

반응형
반응형

1. 개요

2. 해상도와 비율

3. 대응법

3.1 롤

3.2 벽돌깨기

3.3 철권

3.4 예시 게임

 

 

 

1. 개요

본인은 게임 개발 초기 해상도가 달라지면 어떻게 해야 하는지 복잡해서, 어떻게 해야 하는지 감조차 안 잡혔는데 게임 개발을 시작하는 분들께서 감을 잡을 수 있도록 지금까지 터득한 해상도 대응에 대하여 정리하는 글을 써본다.

먼저 해상도 문제는 왜 발생하는 것인지 그리고 다른 게임들은 어떻게 대처하였는지 짚고 넘어가자.

 

 

2. 해상도와 비율

해상도에 대해서 먼저 탐구를 해보자.

유니티 모바일 기준으로 크게 고려할만한 해상도는 핸드폰, 패드 정도 되겠다.

두 해상도는 다음과 같다.

핸드폰 아이폰 기준 2688 x 1242  비율 2.166

아이패드 2224 x 1668 비율 1.333

 

비율을 보면 핸드폰은 긴 쪽이 짧은 쪽보다 2.166배 길고 아이패드는 1.333배 길다고 보면 된다.

간단하다!

그러면 우리는 대충 2.166, 1.333의 비율의 해상도에서 게임이 정상적으로 작동하게끔 게임을 만들면 나머지 해상도에서도 얼추 돌아가겠거니(시간이 지나면 비율이 3이 되는 디스플레이도 나올지도 모른다.) 생각하면 된다.

 

3. 대응법

해상도에서의 대응법에 대해서 생각해보자.

유니티 카메라로 서로 다른 해상도에 대처를 할 때 두 가지를 고려해야 한다.
1. UI -> 앵커를 이용해서 적당히 꾸겨넣으면 된다.
2. 인게임 요소 -> 게임 플레이가 달라질 수 있기 때문에 생각해봐야 한다.

UI는 앵커를 이용해서 적당히 꾸겨넣으면 된다는 부분은 다른 유니티 강의에서 많이 언급하고 찾아보면 나오기 때문에 넘기도록 하겠다.

유니티 카메라를 정확히 제어하기 위해서는 유니티 유닛(유니티의 카메라로 표기하는 단위)에 대해서도 정확히 알고 있어야 하는데 다음 게시물에서 설명하도록 하겠다.
추후에 해상도별로 몇 유니티 유닛을 나타낼 것인지 계산하는 방법과 실습까지 해보도록 하겠다.

 

먼저 몸풀기로 롤, 벽돌깨기, 철권, 내가 만든 게임 이렇게 4개의 게임을 해상도별로 대응할 때 어떻게 해야 하는지 살펴볼 것이다.(실제 게임과 다를 수도 있음)

 

3.1 롤

만약에 세상의 모든 유저가 1:1 비율의 디스플레이를 가진 컴퓨터로 롤을 한다고 생각하자.

 

1:1 비율의 디스플레이에 롤을 넣어봤다. 모든 사람이 1:1 비율이니까 고려할 사항이 전혀 없다. 모두 행복한 세상이다~

 

그런데... 누군가가 16:9 ( 흔히 알고 있는 1920 x 1080 해상도 ) 비율로 스크린을 만들었다. 그래서 그 해상도에 맞도록 게임을 지원해줘야 한다. -> 하단의 스킬 아이콘은 UI 앵커를 이용해서 적당히 해결된다.

인게임 화면의 경우 롤이나 스타크래프트 같은 게임은 그냥 달라진 비율에 상관없이 보이는 대로 그대로 화면을 보여주면 된다. 문제 될 것이 별로 없다!

 

3.2 벽돌깨기

이번엔 다른 타입의 게임에서 생각해보자.

벽돌깨기는 어떨까?

 

 

1:1 비율의 화면을 기준으로 벽돌깨기 게임을 만들었다.

그리고 모바일 버전으로 만들어야 해서 이 게임을 모바일 화면으로 이식을 한다고 치자. 모바일 화면중 세로가 더 길도록 2:1 비율로 만들었다. 세로 방향으로 기존보다 두배의 공간이 생긴 것이다. 어떻게 처리하겠는가?

 

 

회색 공간은 기존 해상도에 비해서 확장된 영역이다.

당연히 상식이 있다면 위의 화면처럼 처리할 것이다. 비율이 바뀐다고 그에 따라 인게임 화면을 꽉 채워버리면 게임 요소들이 영향받으면 게임이 바뀌기 때문이다. 이렇게 처리하는 것을 레터박스(필러박스)로 채운다고 한다.

이해가 잘 안 가면 나무 위키의 사례를 한번 보자. 아마 아 대충 이런 거 얘기하는 거구나 이해가 갈 것이다.

https://namu.wiki/w/%ED%95%84%EB%9F%AC%EB%B0%95%EC%8A%A4

 

필러박스 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다. 나무위키는 백과사전이 아니며 검증되지 않았거나, 편향적이거나, 잘못된 서술이 있을 수 있습니다. 나무위키는 위키위키입니다. 여러분이 직접 문서를 고칠 수 있으며, 다른 사람의 의견을 원할 경우 직접 토론을 발제할 수 있습니다.

namu.wiki

 

여기까지는 이해하기 쉬울 것이다. 하지만 좀 더 복잡한 문제가 발생한다.

 

3.3 철권

이번 예시는 철권이다.

 

철권을 2:1 비율(portrait) 스크린으로 제작했다. (슈퍼 로우 폴리버전이다. 퀄리티는 신경쓰지말자)

 

이 철권을 1:1 비율로 제작해야 하는 상황이 발생하였다. 벽돌깨기와 마찬가지로 레터박스를 사용하면 이렇게 표현해야 한다. 하지만 여기서 한 가지 생각해볼 만한 점이 있다.

 

만약에 철권 캐릭터들이 유저에게는 보이지 않지만 위의 빨간색 박스만큼만 이동할 수 있다면 해상도가 달라져도 빨간색 박스만 화면에 잡히도록 한다면 게임 플레이에는 크게 영향을 안주는 것 아닌가?

그렇다면 어떠한 해상도에서든 빨간색 박스가 잡히도록 카메라를 확대, 축소를 해버리고 지금 필러박스로 가려진 부분을 그냥 공개해버리면 문제없는 것이다.

 

왼쪽처럼 필러박스로 되어 있는 부분을 그냥 화면에 잡히도록 하고 위아래를 꾸며주는 것이다. 하늘과 땅바닥으로 표현했다.

다만 다양한 해상도를 처리하다 보면 빨간색 영역이 너무 작게 잡힐 수도, 너무 크게 잡힐수도 있다. 그래서 유니티에서는 유니티 단위를 계산하여 화면에 최대한 빨간색 영역이 가득 차도록 카메라 확대 배율을 조절할 수 있다.

이게 뭐가 중요하느냐? 싶을 수 있다. 다음 예시를 보자

 

3.4 예시 게임

직접 만들고 있는 게임으로 예시를 들어보겠다.

 

위 사진은 현재 개발 중인 게임을 유니티에서 게임을 자유시점으로 본 것이다. 위의 빨간색으로 쳐져있는 부분이 캐릭터들 이동하는 영역이라서 아까 철권 게임의 빨간 박스가 위의 빨간 박스라고 보면 된다.

 

1. 별다른 처리 없음

1번 예시의 롤같이 해상도에 상관없이 그냥 보여주는 경우다. 게임 플레이가 불가능하다. 조치가 필요하다.

 

2. 필러박스 이용

필러박스를 이용하면 문제는 없지만 게임 몰입을 방해하고 산만해진다.

 

3. 게임을 방해하지 않는 선에서 최대한 확대하는 방식

어떤가 왼쪽은 모바일 해상도, 오른쪽은 패드 해상도다. 화면에 빨간색 영역이 최대한 꽉 차도록 계산하지 않았다면 1번처럼 너무 커서 잘리거나 반대로 너무 작게 보일 수 있다.

 

다음 포스트에서는 유니티 유닛과 카메라에서 어떤 관계를 가지고 있는지 알아보고 해상도별로 대응하는 법을 배워보도록 하겠다.

 

반응형
반응형

1. 개요

2. 준비사항

3. 여행지 안전 확인, 위험한 지역인지, 지진 관련 정보

4. 예산

5. 항공 예약 및 전자티켓

6. 오션플레이어 예약

7. 여행 보험

8. 비행기 탑승수속, 인천공항 대기

9. 가방에 넣을수있는거 없는 거 확인

10. 태풍 확인

11. 가격 바가지, 흥정, 툭툭이

12. 기념품

13. 비행기 수하물 추가

 

 

 

1. 개요

세부 오션플레이어를 통해서 9박 10일간 여행을 갔다 왔다.

여행 도중 습득한 정보에 대하여 주루룩 기재하도록 한다.

 

2. 준비사항

여권, 사본

돈(USD) -> 4번 목차에서 자세히 기재

항공편 예약 -> 5번 목차에서 자세히 기재

오션플레이어 예약 -> 6번 목차에서 자세히 기재

래시가드 상의, 하의

반팔, 반바지 위주의 여벌 옷 : 멋 부릴 생각 하지 말고 그냥 편한 반팔 반바지 들고 오셈 긴팔 옷 입으면 더워 죽음

정말 편한 슬리퍼

선크림(방수)

샴푸, 비누, 때수건(워낙 물에 자주 들어가 있어서 때가 잘 밀림...)

면도용품

필기구

 

3. 여행지 안전 확인, 위험한 지역인지, 지진 관련 정보

필리핀의 경우 지역마다 위험한 경우가 있으니 본인이 가는 지역이 위험할 수 있는 지역인지 정보글을 보며 확인

여행 가려는데 필리핀 위쪽 섬에서 지진이 났는데 내가 가려는 막탄섬에는 영향이 없다고 함.

 

4. 예산

비행기 티켓 값

왼쪽 : 서울 -> 세부     오른쪽 : 세부 -> 서울

인당 비행기 값 388,621만원

크리스마스가 껴 있는 성수기라서 꽤 비싼 편인데 원래 비성수기에는 저가항공 이용하면 20만 원 안으로 티켓팅이 가능하다. 그나마 이게 5개월 미리 한 거라서 싼 편이다.

근데 여행 와서 어떤 분한테 얘기 들어보니 티켓 가격을 계속해서 확인하다 보면 더 싼 비행기 티켓이 가끔 나온다고 한다. 그분은 10월에 예약했는데 왕복 30만 원으로 끊었다고 했다.

 

스쿠버 다이빙 가격

나는 오픈워터를 따서 오픈워터 자격증이 없는 친구들과 다이빙 플랜이 다르다. 두 개의 다이빙 플랜별로 가격을 기재하겠다.

 

내 일정

21일 펀다이빙 1회 40불 : 40불

22일 펀다이빙 2회, 숙박비 100불

21일 40불 펀1회

22일 100불 펀2회

23일 120불 3회

24~25일 어드 320블

26일 펀 2회 80 + 나이트 200불

27일 딥 200불

28일 n/d 20불

합계 1200불



친구들 일정


21일~25일 오픈+어드 620불
26일 펀 2회 80불 + 나이트 200불
27일 딥 200불
28일 n/d 추가 비용 X
합계 1220불

 

5. 항공 예약 및 전자티켓

트립 닷컴에서 예약

 

Trip.com Official Site‎‎ | Travel Deals and Promotions

Choose from over 1.2 million hotels in more than 200 countries, 30 million real guest reviews. Book flights to over 5,000 destinations worldwide. 24/7 Customer Service.

www.trip.com

 

 

저가항공이라 환불, 교환, 양도 힘들 수 있음!

시간대는 가는 건 별로 상관없는데 오는 건 버스 막차 고려해서 9시 전에는 도착하는 게 좋음!

 

6. 오션플레이어 예약

 

http://oceanplayerdive.com/home/sub05.php?mid=43

 

오션플레이어 :: 수중세계로 초대합니다.

전체 글 : 21,135 개 번호 제목 작성자 작성일 조회수 세부 공항에 도착하셔서 <오션플레이어> 피켓을 찾아 주세용.^ ^ oceanplayer 12307 ★예약은 어떻게 해야되요~??★ oceanplayer 29632 21135 예약합니다 NEW! 김민경 4 21134 레스큐교육신청입니다. NEW! 장영윤 2 21133 정말 죄송합니다. 예약 취소 부탁드립니다. NEW! 김지원 6 21132 정말 죄송합니다. 예약 취소 부탁드립니다. NEW! 김지원

oceanplayerdive.com

위의 주소에서 일정 예약 문의글을 남길 수 있다.

 

필요한 정보

1. 이름&성별&인원 :

2. 교육코스&일정 :

3. 항공편 (IN/OUT 시간&날짜) :

4. 플레이어하우스 이용 (유,무) :

4-1. 플레이어하우스 이용하지 않을 시, 외부 호텔or리조트 이름 :

5. 연락처(필수) :

6. 장비 렌탈 사이즈 : 키/몸무게/발사이즈

7. 참고사항 or 특이사항 :

예) 시력보정 마스크, 음식알레르기, 1인실 이용 등등 필요하신 사항을 알려주세요~

위와 같은 정보가 필요하다.

숙소가 외부 숙소, 내부 숙소가 있는데 외부 숙소로 배정받으면 정말 힘들다.(다이빙 샵으로 차타고 이동해야 돼서 붕 뜨는 시간 동안 뭘 하기가 굉장히 애매하다.)

미리 예약해서 외부 숙소 배정받는지 물어보고 외부 숙소면 차라리 일정을 바꿔서라도 내부 숙소로 배정받는 것을 추천한다.

 

7. 여행 보험

여행 보험을 찾아보니 굉장히 많았는데 나는 여기서 들었다.

일단 마이 리얼 트립 이걸로 들었다.

https://market.bomapp.co.kr/travel/mrt/introduce

 

마이리얼트립X보맵파트너

해외여행이 걱정되시나요? 보맵의 해외여행보험에게 걱정거리를 맡기고 떠나세요. 여행이 끝날 때까지 든든히 지켜드릴게요.

market.bomapp.co.kr

 

8. 비행기 탑승수속, 인천공항 대기

인천공항 사이트에서 본인의 체크인 카운터를 확인해서 탑승 수속을 밟는다.

https://www.airport.kr/ap/ko/dep/depPasSchList.do

 

인천국제공항

출발시간 항공사별, 도시별 출발정보를 안내합니다.

www.airport.kr

 

 

9. 가방에 넣을 수 있는 거 없는 거 확인

다시 한번 더 비행기로 반입할 수 없는 물품을 확인한다.

https://m.post.naver.com/viewer/postView.nhn?volumeNo=16811396&memberNo=387676&vType=VERTICAL

 

비행기 기내 반입 금지 물품 총정리!

[BY 산소통] 이번 카드뉴스에서는 여행객들이 헷갈려 하는 비행기 기내 반입 금지 물품을 모두 알려드립...

m.post.naver.com

 

10. 태풍 확인

 

윈디라는 앱을 사용하면 태풍 확인이 가능하다. 스쿠버다이빙 일정에 굉장히 큰 영향을 줄 수 있는데 태풍으로 확인을 해보도록 하자.

 

https://play.google.com/store/apps/details?id=com.windyty.android

 

Windy.com - 바람, 파도 및 태풍 예보 - Google Play 앱

Windyty로도 알려져있는 Windy는 기상예보 시각화를위한 특별한 도구입니다. 이 빠르고, 직관적이며, 상세하고 가장 정확한 날씨 앱은 전문 조종사, 패러글라이더, 스카이다이버, 서퍼, 선원, 어부, 스톰체이서 및 날씨 덕후, 심지어는 정부, 군대 및 구조 팀도 신뢰할 수 있습니다. 태풍이나 악천후를 찾거나, 여행 계획을 세우거나, 좋아하는 야외 스포츠를 계획하든, 아니면 이번 주말에 비가 내릴 지 알 고 싶은 사람들에게 Windy는 가장 최신의 일기

play.google.com

 

11. 가격 바가지, 흥정, 툭툭이

얘기를 들어보니 세부의 물가를 한국인들이 가격을 망쳐놓았다고 한다.

한국인들이 바가지를 당해도 노력도 안 하고 푼돈이라고 그냥 내버리니까 계속해서 비싸지는데 너도나도 은근슬쩍 가격이 올라가버리니까 아예 물가가 올라가는 것이다.

실제로 맥주값이나 툭툭이 가격이 갈 때마다 점점 비싸지는 것 같다.

바가지 당하지 않도록 조심하자

 

12. 기념품

세부 내에 기념품샵이 간간히 있는데 공항에서 4~5배의 가격으로 파니까 공항에서 살 생각하지 말고 미리 사두자

 

13. 비행기 수하물 추가

다시 한국으로 돌아갈 때 저가항공을 이용한다면 수하물 무게를 초과하기 쉽다. 그래서 해당 항공사 사이트로 가서 비행기 수하물을 구매하도록 하자. 나는 그렇게 해서 500페소 정도 절약했다.

 

세부 오션플레이어 스쿠버다이빙 여행글 목록

세부 스쿠버다이빙 오션플레이어 여행 정보글

세부 스쿠버다이빙 여행 1일차 - 도착

세부 스쿠버다이빙 여행 2일차 - 오픈워터 수업 참관

세부 스쿠버다이빙 여행 3일차 - 오픈워터 수업 참관2

세부 스쿠버다이빙 여행 4일차 - 크리스마스 이브와 태풍

세부 스쿠버다이빙 여행 5일차 - 어드밴스 강의

세부 스쿠버다이빙 여행 6일차 - BBQ 그리고 마사지샵

세부 스쿠버다이빙 여행 7일차 - 힐루퉁안 펀다이빙, 나이트 다이빙 SP

세부 스쿠버다이빙 여행 8일차 - 날루수안 펀다이빙

세부 스쿠버다이빙 여행 9일차 - 귀국 및 후기

 

 

 

 

반응형
반응형

1. 롤 공격 애니메이션 속도 분석

2. 원하는 결과물

3. 스크립트 설명

 

 

 

 

1. 롤 공격 애니메이션 속도 분석

게임에서 공격 속도에 따라서 애니메이션을 어떻게 해야 할까?

일단 갓겜 롤을 기준으로 생각해보자.

 

먼저 공격 속도 변수에 대해서 생각해보자. 공격속도는 1회 공격하는 회수에 대한 값이다.

2.5 -> 초당 2.5회 공격

0.5 -> 초당 0.5회 공격

 

두 개의 영상을 준비했다. 크 친절함 보소

 

 

첫 번째 영상은 공격속도 0.2의 그레이브즈

 

두 번째 영상은 공격속도 4.5의 제이스

 

그레이브즈

그레이브즈의 경우 공격 속도가 0.2면 5초에 한 번 공격하는 꼴인데 정상 속도의 공격 애니메이션을 재생하고 약 3~4초간 기다리는 것을 볼 수 있다.

 

제이스

제이스의 경우 공격 속도가 4.5니까 1초에 대략 4대를 때리는데 어찌 보면 좀 어색할 정도로 망치를 엄청 빨리 휘두른다. 즉 애니메이션의 배속이 된 것을 알 수 있다.

 

우리가 구현해야 하는 공격 애니메이션 속도 방식은 다음과 같다.

 

공격 애니메이션을 기본적으로 재생했을 때 걸리는 시간을 1초라고 가정하자.

그렇다면 해당 캐릭터는 공격 속도가 1이면 애니메이션 속도를 변경하지 않고 계속해서 공격하면 문제없다.

만약에 버프나 통하여 공격 속도가 1보다 빨라지면 애니메이션의 재생속도도 빨라진만큼 배속을 해줘야하고 공격속도가 디버프를 통하여 1보다 느려지면 기본 속도로 재생을 시켜주고 남은 시간은 기다리도록 하면 된다.

 

여기서 프레임 개념이 필요하다.

 

이것은 유니티 캐릭터가 공격하는 애니메이션이다.

공격 애니메이션은 기본적으로 1초에 한번 재생되는 것을 기본으로 하였다.

그리고 프레임 재생 비율은 1초에 30 프레임이다.

 

공격 속도 개념과 같이 설명하자면...

공격속도 2 -> 1초에 두번 공격 -> 1초에 60 프레임재생 -> 60/30 비율로 재생 -> 두 배속

공격 속도 1 -> 1초에 한번 공격 -> 1초에 30 프레임재생 -> 30/30 비율로 재생 -> 정배 속

공격 속도 0.5 -> 2초에 한번 공격 -> 2초에 30 프레임재생 -> 30/60 비율로 재생? -> 정배 속으로 재생하고 대기

 

 

2. 원하는 결과물

설명이 좀 길었는데 최대한 친절하게 설명하기 위해서 노력했다.

내가 만들고 싶은 결과물은 다음과 같다.

 

롤과 똑같은 방식이다.

 

3. 유니티 프로젝트 설명

 

공격 애니메이션 에셋은 아래 무료 에셋을 사용했다.

https://assetstore.unity.com/packages/3d/animations/warrior-pack-bundle-1-free-36405

 

Warrior Pack Bundle 1 FREE - Asset Store

This is a sample package of the Warrior Pack Bundle 1 Note: This asset works in Unity 5. This asset contains 3 animations for each of the 4 warriors in the pack (12 animations total), so that you can test and evaluate if they will work for your project bef

assetstore.unity.com

 

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class AttackController : MonoBehaviour
{
    
    /// <summary>
    /// 캐릭터의 애니메이터
    /// </summary>
    [SerializeField] private Animator animator;

    /// <summary>
    /// UI - 공격속도 인풋박스
    /// </summary>
    [SerializeField] private InputField inputFieldAttackSpeed;
    
    /// <summary>
    /// UI - 공격 정보 표기
    /// </summary>
    [SerializeField] private Text textInfo;

    
    // Start is called before the first frame update
    void Start()
    {
        //최초 공격속도 설정
        SetAttackSpeed(attackSpeed);
    }

    /// <summary>
    /// UI로 공격 속도 변경시
    /// </summary>
    public void OnInputFieldChange(InputField inputField)
    {
        SetAttackSpeed(float.Parse(inputField.text));
    }

    /// <summary>
    /// 실제 공격속도 변경해주기
    /// </summary>
    private void SetAttackSpeed(float _attackSpeed)
    {
        attackSpeed = _attackSpeed;
        
        //공격 쿨타임 계산
        attackCoolTime = 1f / attackSpeed;
        
        //최초 공격 바로 시작하도록 설정
        currentAttackCoolTime = attackCoolTime;
        
        //공격속도가 1보다 빠르면 애니메이션 빠르게 재생하기 위해서 배속 설정, 아니면 기본속도 1로 재생
        if (attackSpeed > 1) animator.SetFloat("AttackSpeed", attackSpeed);
        else animator.SetFloat("AttackSpeed", 1);
        
        //UI 초기화
        inputFieldAttackSpeed.text = attackSpeed.ToString();
        textInfo.text = string.Format("공격 속도 : {0}\n" +
                                      "공격 애니메이션 재생하는데 걸리는 시간 : {1}\n" +
                                      "공격 쿨타임 {2}/{3}",attackSpeed,1f/attackSpeed, currentAttackCoolTime,attackCoolTime);
    }
    
    /// <summary>
    /// 공격 시작
    /// </summary>
    public void StartAttack()
    {
        StartCoroutine("EnumAttack");
    }

    /// <summary>
    /// 공격 종료
    /// </summary>
    public void EndAttack()
    {
        StopCoroutine("EnumAttack");
    }

    /// <summary>
    /// 공격속도
    /// </summary>
    private float attackSpeed;

    /// <summary>
    /// 1회 공격하는데 기다려야하는 시간 -> 공격속도 변경시 계산
    /// </summary>
    private float attackCoolTime;

    /// <summary>
    /// 공격하고나서 시간이 얼마나 경과했는지 카운트
    /// </summary>
    private float currentAttackCoolTime;
    
    /// <summary>
    /// 지속적으로 공격
    /// </summary>
    private IEnumerator EnumAttack()
    {
        while (true)
        {
            //만약 공격 쿨타임이 돌았으면
            if (currentAttackCoolTime >= attackCoolTime)
            {
                //쿨타임 초기화하고 공격을 개시한다.
                currentAttackCoolTime = 0;
                Attack();
            }

            textInfo.text = string.Format("공격 속도 : {0}\n" +
                                          "공격 애니메이션 재생하는데 걸리는 시간 : {1}\n" +
                                          "공격 쿨타임 {2}/{3}",attackSpeed,1f/attackSpeed, currentAttackCoolTime.ToString("F2"),attackCoolTime);
            currentAttackCoolTime += Time.deltaTime;       
            yield return null;
        }
    }

    /// <summary>
    /// 공격 트리거 발동
    /// </summary>
    private void Attack()
    {
        animator.SetTrigger("PunchTrigger");
    }
}

 

 

 

이 부분이 핵심이다. 공격 속도가 빠르면 애니메이션의 Speed Multipler 설정에 추가해둔 AttackSpeed라는 Parameter에 따라 빠르게 재생될 수 있도록 하면 된다.

 

해당 스크립트 파일과 전체 프로젝트는 파일로 공유하도록 하겠다.

 

 

프로젝트 전체 다운로드

 

AttackController.cs
0.00MB

 

반응형
반응형

1. 개요

2. ASLR : 메모리 주소는 항상 바뀐다

3. 게임 가디언 VS 유니티 앱

3-1. 메모리 주소 접근 unsafe 코드

4. 게임 가디언 VS 안티 치트 변수 암호화 기능

4-1. 안티 치트 obscured 변수 암호화 원리

5. 게임 가디언 VS 안티 치트 변수 암호화 기능 강화 버전

5-1. 개발 도중 이상한 점(슈뢰딩거의 변수)

6. 게임 가디언 VS 메모리 변조 디텍터

7. 결론

 

 

 

 

 

 

 

1. 개요

와 목차만 봐도 양이 굉장히 많다.

근데 실제로 회사에서 이것만 연구하느라 거의 2일 정도 시간을 소비했다.

회사에서 안티치트라는 무려 50$짜리 해킹 방지 에셋을 사용하는데 쓰는 것은 좋은데 어떤 원리로 작동하는지 그리고 실제로 해커 입장에서 테스트해보면서 해킹 방지가 되는지 누군가는 확인해보고 연구해볼 필요가 있다고 생각이 되어서 연구를 하게 되었다.

유니티 게임 개발자들도 이 글을 읽고 많은 도움이 되었으면 좋겠다.

재밌게 탐구하기도 했고 안티 치트를 뚫어서 메모리 변조를 해보고 싶다는 생각이 들었다. 언젠가 시간이 나보면 해볼 거다.

해킹 개깐지

 

계속해서 언급할 안티 치트 에셋(꼭 없어도 괜찮다. 어떤 식으로 암호화를 하는지 세세하게 보여줄 것이기 때문에 이해만 하면 되겠다.)

https://assetstore.unity.com/packages/tools/utilities/anti-cheat-toolkit-152334

 

Anti-Cheat Toolkit - Asset Store

🌎 demo ▶ videos 💬 forum 📄 API reference 💌 support 🕵 Anti-Cheat Toolkit (ACTk) 🕵 is here to add some extra pain to the guys who cheat / hack / crack something in your game. Includes various anti cheat tricks and techniques in one place, easy to use, with fu

assetstore.unity.com

 

2. ASLR : 메모리 주소는 항상 바뀐다

먼저 본격적으로 실험에 들어가기 전에 한 가지 알아둬야 하는 개념이 있다.

Address Space Layout Randomization

 

간단히 말하자면 앱이 실행될 때마다 메모리 주소가 랜덤 하게 배정되어서 내가 만든 게임에서 gold 변수가 가지는 메모리가 앱을 실행할 때마다 다른 메모리 주소를 갖게 되는 것이다.

이렇게 함으로써 앱의 보안을 강화시킬 수 있다고 한다.

그렇기 때문에 앞으로 있을 메모리 해킹에서 해킹할 변수는 동일하지만 메모리 주소는 계속해서 바뀐다는 것을 알아두도록 하자.

 

ASLR에 대한 자세한 내용은 아래 위키에 잘 나와있다.

https://en.wikipedia.org/wiki/Address_space_layout_randomization

 

Address space layout randomization - Wikipedia

Address space layout randomization (ASLR) is a computer security technique involved in preventing exploitation of memory corruption vulnerabilities. In order to prevent an attacker from reliably jumping to, for example, a particular exploited function in m

en.wikipedia.org

 

좀 특이한 점이라면 생각보다 고안되고 적용된 지 오래된 기술은 아니라는 점

안드로이드는 2015년도에 본격적으로 채택, MAC, 리눅스, 윈도우 전부 2000년대에 본격적으로 도입되었다.

 

 

3. 게임 가디언 VS 유니티 앱

자 그럼 이제 본격적으로 유니티 앱에서 게임 가디언을 통해 메모리 변조를 해볼 건데 간단하게 정말로 게임 가디언이 해킹하는 변수의 주소가 실제 변수의 주소가 맞는지 확인해볼 것이다.

 

해킹할 변수는 InGameGold 인게임 골드다.

코드를 보면 

inGameGold라는 private 변수의 메모리 주소를 받아와서 출력해준다.

이 주소를 유니티의 텍스트에다가 넣어줘서 핸드폰에서 확인이 가능하도록 하였다.

 

그리고 평범하게 게임 가디언으로 쉽게 뚫어서 변수의 주소를 찾았다.

 

게임의 한가운데에 보면 텍스트가 하나 있는데 인게임 골드 변수의 주소다. 둘이 일치하는 것을 확인할 수 있다.

 

그렇다면 궁금증은 풀렸다. 게임 가디언이 접근하는 변수의 주소와 실제 앱에서 할당받는 주소는 동일하구나!

 

3-1. 메모리 주소 접근 unsafe 코드

메모리 주소 접근하는 코드를 사용하기 위해서는 unsafe와 fixed 기능을 사용해야 한다.

 

아래 게시물을 참고하자

https://ajh322.tistory.com/223

 

유니티 오류 Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix this error.

유니티에서 메모리 주소에 접근하는 코드를 사용하면 unsafe 관련하여 아래 에러가 발생한다. Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix..

ajh322.tistory.com

 

4. 게임 가디언 VS 안티 치트 변수 암호화 기능

이제 본 게임 시작 안티 치트에서 제공하는 변수 암호화 기능을 사용하고 게임 가디언으로 뚫으려고 하면 어떻게 될지 확인해보자

 

먼저 변수 암호화 기능(obscured)에 대하여 알아보자

그냥 기존에 쓰던 데이터 타입에 Obscured를 붙여주면 된다. 그러면 알아서 암호화가 된다. 암시적 형 변환도 되기 때문에 불편함 없다.

그러면 코드가 위에처럼 int에서 ObscuredInt로 바뀐다.

그것뿐이다.

얼마나 간편한가!

 

그러면 이제 암호화를 했는데 게임 가디언으로 한번 메모리 변조를 시도해보겠다.

암호화를 하면 해커들이 못 찾을 거라고 하는데 과연...

 

오... 정말로 못 찾는다!

 

하지만 게임 가디언의 암호화된 값 검색을 하면 어떻게 될까?

 

 

검색 결과가 하나 나온다. 특이한 점은 80을 검색했는데 444,492라는 값을 찾아온다.

 

뚫린다... 조금 허무하네...

일단 그냥 검색이 막히기는 하지만 여전히 게임 가디언에 손쉽게 뚫린다.

 

여기서 안티 치트의 말도 한번 들어보자

대략 unknown value 검색에 의하여 암호화가 뚫릴 수 있다고 경고한다. 그렇기 때문에 암호화된 값을 바꿔줘야 한다는 말이다.

암호화 된 값을 바꾸는 기능은 Obscured 객체에 딸려있는 RandomizeCryptoKey 함수를 이용하면 된다.

 

4-1. 안티 치트 obscured 변수 암호화 원리

암호화 값을 바꿔주는 기능을 사용해보기 전에 obscured 변수 암호화에 대한 간단한 원리를 짚고 넘어가 보자

암호화란 평문을 특정 알고리즘에 의하여 암호화된 값으로 바꿔주는 것을 의미한다.

 

실제로 안티 치트에서 실 데이터에 대하여 암호화를 시키면 특정 알고리즘에 의하여 값이 바뀌고 메모리에는 암호화된 값이 저장된다. 그리고 필요할때만 복호화하여 원래 값으로 되돌려서 사용하고 다시 암호화 시켜서 암호화 된 값으로 저장해놓는 것이다.

 

 

444536이라는 암호화 된 값이 100이라는 실제 값을 가지고 있다.

그리고 해당 값을 가지고 있는 변수에는 암호화 된 값을 들고 있다.

 

게임 가디언에서는 아래와 같은 방법으로 암호화 된 값을 찾아낸다고 한다.

게임 가디언 개발자인데 호그와트에서 배운 마법으로 찾는다고 설명한다. 대단하다.

원리는 암호화가 보통 xor 연산으로 이루어지는데 그 방법을 뚫는 방법이 있다고 한다.

구글에 how game guardian detect encrypted value라고 검색하면 내용이 많이 나온다.

 

5. 게임 가디언 VS 안티 치트 변수 암호화 기능 강화 버전

그러면 단순 암호화로는 게임 가디언에게 쉽게 뚫린다는 것을 감안하여 암호화 값을 랜덤으로 바꿔주는 기능을 사용해보도록 한다.

이렇게 되면 1초마다 inGameGold의 암호화 값이 랜덤 하게 값을 가지게 된다.

즉 게임 가디언 입장에서 암호화 키가 되는 값이 확실하지는 않지만 특정 값이라고 가정하여 값을 찾다가 암호화 값이 완전히 바뀌어버리면 데이터를 놓치게 되는 것이다.

 

RandomizeKey를 사용할 때마다 실제로 암호화된 값이 계속해서 바뀐다.

 

그리고 게임 가디언에서 암호화 된 값 검색을 하여도 도중에 찾지 못한다고 나온다.

오... 안티 치트의 승리다.

 

하지만 메모리 주소에 대한 직접적인 변조는 막지 못한다.

아마 더 고도화된 메모리 변조 방지 기법은 직접 메모리 변조하는 것까지 막아야 한다고 생각한다.

 

5-1. 개발 도중 이상한 점(슈뢰딩거의 암호화)

상자 안에 1시간 뒤 50%의 확률로 죽을 수 있는 고양이가 있는데 고양이는 1시간 뒤 살았을까 죽었을까?

갑자기 뭔 개소리냐 싶은데 ㄹㅇ 슈뢰딩거 고양이 뺨치는 상황이 발생했다.

 

5번의 랜덤 암호화 기능을 구현하고 있는데 RandomizeKey 함수를 통하여 암호화 값을 랜덤 값으로 바꾸고 나서 암호화 값이 바뀌었는지 안 바뀌었는지 확인하기 위해 encrypt 값을 받아와서 라벨에 표출해주었다.

 

일단 먼저 GetEncrypted 함수를 통하여 hiddenValue(암호화 값) 값을 가져온다.

그러면 ApplyNewCrpytoKey 함수를 거치는데...

 

ApplyNewCryptoKey 함수의 내용은 위와 같다.

currentCryptoKey와 cryptoKey가 다르면 암호화 값을 cryptoKey로 암호화한 값을 넣어버리는 것이다.

currentCryptoKey는 randomizeKey를 하면 새로운 값으로 바뀌는데 cryptoKey는 바뀔 일이 절대 없다. 다시 말해서 if문은 항상 참이라는 것이다.

아마도 에셋 개발자가 암호화 값 확인을 할 때 헷갈리지 않도록 암호화 값을 받아오면 무조건 원래 암호화 키로 다시 암호화를 해주는 것 같다.

즉 암호화 값을 확인하고 싶어서 확인하는 순간 랜덤 암호키로 바꾼 암호화 값이 랜덤 하지 않은 단 하나의 암호키로 바꾼 암호화 값으로 초기화되는 것이다.

실제로 내가 테스트하면서 GetEncrypted를 계속해서 호출했는데 랜덤 암호화가 제대로 되지 않아서 랜덤 암호화 기능을 사용하였음에도 불구하고 게임 가디언에 뚫렸다.

관측하지 않은 상태에서는 암호화가 제대로 되고 있지만 관측하려는 순간 암호화가 풀려버리는 그런 것이다. 중요하지는 않지만 나중에 테스트한답시고 나처럼 허튼짓 하지 않기를 바란다.

 

6. 게임 가디언 VS 메모리 변조 디텍터

안티 치트에서 제공하는 기능 중에 메모리 변조를 시도를 탐지하는 기능이 있다고 한다.

 

원리는 암호화되지 않은 변수 값을 일부러 노출시키고 유저가 그 값을 바꾸면(해당 값을 바꿔도 실제 값은 바뀌지 않음) 메모리 변조를 시도했다고 판단하는 것이다.

가짜 덫을 만들어 놓는 것이다.

 

게임 오브젝트에 Obscured Cheating Detector를 만들어두고 Detection Event에 함수를 달아놓는다.

게임 매니저에 GotchaBitch 라는 함수를 달아놓았다.

 

이 함수를 발동시키면 텍스트를 GotchBitch!로 바꾸게 된다.

 

한번 이 기능을 넣어보고 게임 가디언으로 메모리 변조를 시도해보겠다.

 

암호화하지 않고 검색을 하면 가짜 값을 찾을 줄 알았는데 못 찾는다.

 

Randomize를 돌리지 않고 Obscured만 사용한 뒤, 암호화 검색을 하면 가짜 값이 나온다. 그래서 가운데 보면 텍스트가 바뀐 것을 알 수 있다. 근데 진짜 값도 탐지가 가능해서 해킹도 되고 해킹 감지도 된다. 좋지 않은 상황이다.

 

암호화된 상태에서 Randomize까지 작동시키면 아무것도 못 찾는다. 차라리 이게 나은 것 같다.

 

7. 결론

 

기본 Int

ObscuredInt

ObscuredInt + RandomizeKey

변조 가능

O

O

X

디텍터 반응

 

O

X

각 상황별로 게임 가디언으로 해킹을 시도했을 때 결과는 위와 같다.

 

 

메모리 변조와 관련된 게시물

게임 가디언 설치, 사용 방법

게임 가디언 사용 방법 - 실제 게임 해킹

유니티 메모리 변조 방지 - 안티 치트

반응형
반응형

유니티에서 메모리 주소에 접근하는 코드를 사용하면 unsafe 관련하여 아래 에러가 발생한다.

Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix this error.

 

메모리 주소 접근하는 코드를 사용하기 위해서는 unsafe와 fixed 기능을 사용해야 한다.

 

Build Settings > Other Settings > Allow 'unsafe Code'

 

체크를 해준다.

 

그러면 unsafe 함수 사용이 가능하다.

 

언세이프 신택스는 꼭 불안전한건 아니지만 CLR 단에서 에러가 없는지 검증 불가능한 영역이라서 조심히 사용해야하는 부분이라고 나와있다.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/index

 

Unsafe code and pointers - C# Programming Guide

Unsafe code and pointers (C# Programming Guide) In this article --> To maintain type safety and security, C# does not support pointer arithmetic, by default. However, by using the unsafe keyword, you can define an unsafe context in which pointers can be us

docs.microsoft.com

 

반응형
반응형

요놈의 인텔리제이 쓰다보면서 계속해서 꿀팁이 누적되는데 앞으로 생길때마다 계속해서 업데이트 하겠다.

 

1. 기본 지정 단축키

2. 필수로 지정해야하는 단축키

3. 자동완성(라이브 템플릿)

4. 권장설정

5. 기타

 

 

1. 기본 지정 단축키

윈도우, 맥 환경에서의 기본 단축키가 다르지만 대체로 일치한다.

아래 단축키는 윈도우 기준이다.

 

Ctrl + D : 라인 복사

Ctrl + Y : 줄 삭제 // Ctrl + Backspace

Ctrl + X : 잘라내기, 라인 삭제할때도 자주 쓴다.

Ctrl + Z : 되돌리기

Ctrl + Shift + Z : 되돌리기 취소

Ctrl + Alt + 위, 아래 : 현재 선택한 라인이동

Ctrl + Alt + T : 현재 선택된 코드를 특정 코드로 감싸줌(try, {} 이런 블록단위)

Alt + 위, 아래 : 블록 단위로 커서 이동

Ctrl + Home, End : 파일 가장 위, 아래로 이동

Ctrl + Shift + R, Ctrl + R : 모든 파일 내에서 바꿈, 현재 파일 내에서 바꿈

Ctrl + Shift + F : 파일내에서 검색

Ctrl + Shift + Backspace : 가장 최근에 수정한 부분 순차적으로 이동

Ctrl + B : 정의 이동

Alt + F7 : 사용된곳 검색

Ctrl + Shift + N : 파일 검색

Shift + F6 : 리네임, 메소드, 필드 선택한 상태에서 하면 참조하고 있는 곳에서까지 일괄적으로 이름을 바꿔줌

Alt + 1 : 탐색창 껏 다 키기

Ctrl + F11 : 북마크 이동하는 창 표시 // 맥 기준 Alt + F3

Ctrl + 1 : 북마크 지정한 곳으로 이동

Alt + 왼쪽, 오른쪽 : 파일 탭 이동

Ctrl + L : 라인 이동(많이 쓰지는 않는데 뭔가 쓰면 간지남)

Ctrl + Shift + / : 범위 주석

Ctrl + / : 라인 주석

/// : summary 생성

 

 

2. 필수로 지정해야하는 단축키

개인적으로 꼭 지정해야 하는 단축키를 소개한다.

ㄹㅇ 거의 내가 인텔리제이를 쓰는 이유라고 볼 수 있다.

 

Preferences 이동

 

Keymap에서 단축키를 지정할 수 있다.

 

 

현재 커서에서 선택한 부분을 확장하는 단축키인데 내가 제일 많이 쓰는 단축키다. 자주 쓸 수 있도록 간단한 단축키로 지정해놓자.

 

필수 지정 단축키 1. Extend Selection

나는 Ctrl + W로 해놓는다.

그 아래 Shirnk Selection은 Ctrl + Shift + W로 지정해놓았다.

 

필수 지정 단축키 2. Last, Next Edit Location

가장 최근에 수정한 곳으로 이동하는데 앞으로, 또는 뒤로(써보면 바로 이해된다.) 이동하는 단축키인데

Next Edit Location이 지정이 안되어 있다.

나는 Ctrl + Shift + \ 로 해놓았다.

 

3. 자동완성(라이브 템플릿)

각 언어별로 자동완성되는 신택스들이 있을텐데(유니티에서 update 자동완성하면 Update 함수가 자동으로 생성)

직접 등록이 가능하다.

개발도 중복해서 사용하는 코드가 있을텐데 등록해놓고 쓰도록 하자.

 

4. 권장설정

 

권장설정 1. 익스플로러에서 현재 사용중인 파일에 포커스 맞추기

파일이 많아서 복잡할때 이 설정을 해놓으면 현재 열려있는 파일에 맞춰서 익스플로러 포커싱이 바뀐다.

 

 

5. 기타

 

기타 1. TODO, BUG(FIXME)

//TODO

//BUG

라는 주석을 달게되면 하이라이트가 되고 나중에 TODO 탭에서 일괄적으로 관리가 가능하다.

 

TODO, BUG 같은 태그는 위의 설정에서 삽입 가능하다.

 

 

기타 2. 탭 화면분할

탭을 우클릭하면 메뉴중에 Split Vertically와 Split Horizontally가 있다.

 

해당 기능을 잘 사용하면 이런식으로 동시에 여러개의 탭 조회가 가능하다.

 

기타 3. 여러 라인 동시 컨트롤

마우스 휠을 누르고 드래그해서 커서를 여러개로 만든다.

이 상태에서 타이핑을 하면 해당 라인에서 전부 동시에 타이핑이 된다.

또한 명령어도 제각기 다 먹기 때문에 양식이 통일된 곳에서 변경이 필요하거나 할때 유용하다.

여러 라인 선택하고 컨트롤로 이동해서 일괄적으로 특정 부분만 바꿔준다던지 등... 활용하기 나름

반응형
반응형

1. 개요

2. 개발 환경 선택

3. 클라우드 서비스 접속 설정

4. API 설계 및 협업

5. DB 설치, 연결정보 확인, 연결 가이드

6. Git 형상유지

7. 로컬 환경과 실서버 환경 분리

8. Jmeter로 트래픽 테스트

9. 서버 터지는 경우 확인

10. Ngnix 서버 앞다 프록시

11. 로깅

 

 

 

1. 개요

요번에 간단하게 API 서버 개발할일이 있어서 정리해봤다.

대략 내가 개발할때 고려하는 최소한의 선?을 정리해놓았다.

(지적 환영, 피드백 환영)

 

2. 개발 환경 선택

개발 언어 선정

어떤 언어를 사용할지, 가급적이면 새로운 것을 해보려고 노력한다.

나중에 모르는 언어, 분야로 의뢰가 들어오면 손쉽게 하기 위해서 가급적이면 영역을 넓혀놓는 것이 좋은 것 같다.

물론 최소한 '이거 하나로는 무엇이든 구현 가능하다' 정도의 필살기 환경은 있어야한다고 생각한다.

요즘은 주변에서 파이썬 장고, 플라스크, 노드js, 스프링부트, 스프링을 많이 쓰는 것 같다.

나는 노드쓴다.

 

개발 서버 선정

나는 보통 개발단계에서는 AWS EC2 클라우드 프리티어 서버를 사용한다. 프리티어를 사용하면 무료지만 t2.micro의 사양을 가지게 되는데 네트워크가 조금 느리다... 실제 서비스를 하려면 반드시 스펙업을 해야한다.

 

추후 EC2 t2.micro 인스턴스 풀타임 가동시 가격

달에 10달러정도 한다. 나머지 돈은 트래픽 가격

 

근데 국내에서 잘 알려지지 않은 클라우드 서비스도 비슷한 가격으로 꽤나 괜찮은 품질의 서비스를 제공한다. 친구가 여기 쓴다는데 괜찮다고 한다. 관심있으면 확인해보자.

http://fun25.co.kr/

 

3. 클라우드 서비스 접속 설정

클라우드 서버 접속 프로그램 Xshell Xftp

클라우드 서비스 접속은 Xshell과 Xftp를 추천한다.

Xshell은 서버 shell 접속 프로그램이고 Xftp는 파일 전송을 위한 프로그램인데 둘이 쌍둥이처럼 자주 쓰인다.

putty도 좋긴한데 Xshell이랑 Xftp써보면 써보면 왜 좋은지 알 것이다.

https://www.netsarang.com/ko/

 

넷사랑컴퓨터 홈페이지

고성능 네트워크 연결 솔루션 다운로드 구매하기 모든 제품 윈도우에서 구현하는 X 자세히 보기 가장 강력한 SSH 클라이언트 자세히 보기

www.netsarang.com

 

접속사항 정리

서버 접속 가이드를 간단하게라도 정리해놓는다.

나는 프로젝트마다 요런식으로 DB 접속정보, 서버 접속정보, 로그 보는 방법을 정리해놓는다.

시간이 지나면 까먹기때문에 정리는 필수!

 

AWS IP 주소 고정

AWS를 사용한다면 IP를 고정시켜주는 탄력 IP 설정을 해야한다. 처음 들어본다면 아래글을 확인하자

 https://ajh322.tistory.com/67

 

아마존 ec2 필수 확인사항 고정IP 처리, 몽고db document IP 주소부분만 바꾸기

사건 발단은 이렇다. 여느때처럼 노드서버 업데이트를 하기위해서 xshell로 ec2를 접속하려는데 Connecting to ... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. 만뜨고 접속이 안되는..

ajh322.tistory.com

 

하위 권한 계정(non-root)으로 작업

가급적이면 하위 계정을 하나 만들어서 작업하도록 하자.

추후에 다른 사람에게 서버 접속 정보를 알려줄때 루트계정을 알려줘버리면 문제가 생길수 있으니 미리 하위 권한 계정으로 작업해놓는것도 좋다.

 

4. API 설계 및 협업

API 서버는 혼자만을 위한 작업이 아니라 다른 사람에게 필요한 요청을 제공해주는 작업이기 때문에 타인을 고려해서 작업을 해야한다.

작업한 API가 어떤 인풋과 어떤 결과값을 갖는지 설명이 필요하고 수시로 바뀌기 마련이다.

이런식으로 API 개발해서 같이 작업하는 사람에게 알려주곤 했는데 저게 너무 지저분하고 복잡했다.

 

포스트맨

이걸 서로 깔끔하게 전달하는 방법을 찾다가. postman이라는 프로그램으로 협업을 한다. 꽤나 괜찮다. 포스트맨이 어떤지는 아래 글을 통해 참고하자

https://ajh322.tistory.com/211

 

포스트맨 API 서버 개발

1. 개요 2. API 서버 개발 3. 포스트맨 API 추가 4. 포스트맨 환경변수로 손쉽게 서버 주소 바꾸기 5. 클라이언트 API 개발 코드 자동완성 6. 팀원 초대 및 협업 기능 1. 개요 API 서버를 개발하는데 원래 POSTMAN..

ajh322.tistory.com

 

 

5. DB 설치, 연결정보 확인, 연결 가이드

DB도 다른 개발자가 접근이 필요할 수 있으니 접속방법을 미리 정리해놓고 필요하다고 하면 정리한 문서만 던져주면 서로 편하다.

마찬가지로 루트 계정이 아닌 하위 DB 계정을 생성해놓고 작업하는 것이 좋다.

 

6. Git 형상유지

로컬에서 작업하고 문제 없으면 git에 올리고 서버에서 pull 하는 방식으로 작업하면 편하다.

처음에는 이게 불편하겠지만 적응되면 편하다.

로컬에서 작업하고 실서버에 덮어씌우고 이렇게 하는 방법도 있지만 실수로 소스가 날아가버리는 문제가 생길수도 있고 여러모로 위험하다.

 

 

7. 로컬 환경과 실서버 환경 분리

로컬환경과 실서버 환경을 분리해야한다.

로컬환경은 내 PC에서 로컬호스트로 API 서버를 구동하기 위한 실서버와 똑같은 구조의 DB와 API 서버를 말한다.

즉 실서버 DB, 로컬 DB와 실서버 서버, 로컬 서버 두 세트가 필요하다.

로컬에서 작업하고 문제가 없으면 실서버에도 똑같이 반영하는 방식으로 작업을 하는 것이다.

개발 초기에는 실서버에서 작업하고 실서버에 반영해도 상관없지만 좋지 않은 습관이다. 나중에 서비스를 런칭하면 그렇게 작업할 수 없기 때문에 미리 로컬에서 작업해놓는 습관과 방법을 알아두도록 하자

 

8. Jmeter로 트래픽 테스트

API 서버 개발이 끝나면 트래픽 테스트로 어느정도 부하를 견딜 수 있는지 확인해보자.

Jmeter라는 프로그램으로 트래픽 부하 테스트가 가능하다. -> 이거 하려면 결국 로컬환경 구축이 되어있어야 한다.

 

9. 서버 터지는 경우 확인

서버가 터지는 경우가 분명 있을 것이다. API 서버 내부적 결함이던지 네트워크 결함이던지 심지어 AWS에서 실수를 할 수도 있다. 100%란 없기 때문에 서버가 터지는 경우를 만들어서 확인해보고 예외처리를 해놓도록 하자.

본인은 PM2라는 npm을 사용해서 서버가 내려가도 알아서 올라가도록 해놓았다.

 

10. Ngnix 프록시

Ngnix와 같은 프록시 서버가 별도로 필요한 이유는 아래 잘 나와있다.

https://interconnection.tistory.com/27

 

nginx를 이용한 Reverse Proxy 서버 구축.

안녕하세요. 서버 개발자 JAKE AN입니다. Proxy Server란 무엇인가에 대해서 설명하고 나서 실제 서버에 간단하게 적용하는 코드를 설명하겠습니다. 1. Proxy 서버를 사용하는 이유? Proxy는 Proxy 서버를 통해서..

interconnection.tistory.com

 

프록시 서버가 필요한 이유가 잘 나와있기 때문에 확인해보고 수용하도록 하자

 

11. 로깅

로그는 정말 필요한 정보만 간결하게 찍도록 하자.

너무 욕심부려서 모든 데이터를 다 찍으면 로그 파일만 하루에 막 1기가 쌓이고 이러면 분석할때 힘들어진다.

필요하지 않다면 간결하게 저장하도록 하자.

근데 꼭 간결하게 저장하면 디테일이 부족해서 문제가 발생하고 너무 다찍으려고 하면 파일이 너무 커져서 문제다.

또한 로그 데이터를 날마다 나눠서 분기하도록 하자.

본인은 node의 윈스턴이라는 로그 npm을 사용한다.

https://www.npmjs.com/package/winston

 

winston

A logger for just about everything.

www.npmjs.com

 

반응형
반응형

1. 개요

2. 기본 검색

3. 퍼지 검색

4. 암호화 검색

5. 스피드 핵, 시간 건너뛰기

 

 

 

1. 개요

게임 가디언을 설치하였다면 이제 앱에서 메모리 변조를 어떻게 하는지 알아볼 차례다.

내가 만든 게임 Card Wizard 라는 게임을 희생양 삼아서 메모리 변조를 하는 방법을 보여주도록 하겠다.

깨알 게임 홍보

https://play.google.com/store/apps/details?id=com.percent.carddungeon

 

카드 위자드(Card Wizard) - Google Play 앱

제한된 턴 안에 보스를 처치하세요. 대마법사가 되어 악의 군단을 처치하세요. 간단한 조작! 재미있는 플레이! 멋진 마법! 최고의 마법사로 키우세요! 멋진 것들 * 다양한 패턴의 보스를 처치하세요! * 새로운 마법을 모으세요! * 최고의 지팡이로 업그레이드 하세요! * 던전에서 더욱 더 강해지세요! ---- 개발자 연락처 : Yeoksam-ro 25-gil, Gangnam-gu, Seoul, Republic of Korea help@111percent.ne

play.google.com

 

 

 

오늘의 준비물 요렇게 Parallel Space에 게임 가디언과 Card Wizard가 설치되어 있으면 된다.

 

오늘 배워볼 내용은 기본 검색, 퍼지 검색, 암호화 검색, 스피드 핵 이렇게 4가지다.

솔직히 기본 검색만 사용할줄알아도 어지간한 데이터 조작이 가능하다.

 

2. 기본 검색

나는 플레이어의 체력을 9999로 한번 바꿔보려고 한다.

그러기 위해서는 체력의 값을 나타내는 메모리의 주소를 알아내야 한다.

알아내는 방법은 게임 가디언에 현재 체력인 데이터를 전부 다 뒤지라고 명령하면 무수히 많은 용의자들이 나온다. 그러면 체력 값에 변동을 줘서 용의자를 계속해서 추려나간다. 그러다 보면 소수의 주소 값만 남게 되는데 그 주소 값의 데이터를 변조해주면 된다.

 

먼저 아래 사진처럼 플레이어의 체력을 7로 만들어놓은 상태다.

 

 

좌측 상단 게임 가디언 아이콘 클릭

 

 

 

카드 위자드 게임 선택

 

 

 

값 검색 버튼 클릭

 

 

 

내 체력은 7이니까 7을 검색해야 한다. 7 쓰고 새로운 검색 클릭

 

새로운 검색, 수정하기 차이

 

 

참고로 검색할 때 새로운 검색과 수정하기 버튼이 나오는데 수정하기는 이전에 검색한 데이터들 중에서 추가적으로 검색을 한다. 즉 데이터를 잘못 찾았다거나 처음부터 다시 검색을 하려면 새로운 검색을 하면 된다.

 

 

 

새로운 검색하기를 누르면 데이터 종류에 대해서 물어보는데 잘 모르겠으면 Auto를 하고 정수형이라면 Dword 실수형이면 Float이나 Dobule을 하면 되는데 그냥 소수점이 들어간 데이터면 Auto 하고 소수점이 안 들어가는 정수형 데이터면 Dword하자 나는 체력 값은 정수형이니까 Dword를 했다. 보통 재화나 체력은 정수형일 것이다.

 

 

 

21,385개의 용의자를 찾았다고 한다. 수많은 데이터중에 현재 7의 값을 가지고 있는 데이터가 21,385개인 것이다.

 

 

 

포션을 먹거나 공격을 받아서 7이 아닌 다른 체력의 숫자를 갖도록 하자 지금 나는 포션을 먹어서 11이 되었으니 11로 검색을 다시 한다.

 

 

 

벌써 3개밖에 안 남았다. 좌측 초록색이 데이터의 주소, 파란색이 데이터 값이다. 11 값을 가진 주소가 두 개나 있다. 데이터를 마구잡이로 변경하면 앱이 튕길 수도 있으니 나는 한번 더 정제하도록 하겠다.

 

 

 

그래도 두 개가 남는다. 아마 유저의 체력에 대한 데이터중에 화면에 표출되지 않는 데이터가 하나 더 있다고 생각할 수 있는 부분이다. 그러면 그냥 저 데이터 둘 다 바꿔버리겠다. 위의 빨간 버튼을 누르면 일괄 수정을 할 수 있다.

 

 

 

체력을 9999로 하고 값 고정을 하였다. 값 고정은 해당 주소가 계속해서 9999의 값을 가지도록 하는 것이다. 왜 하냐면 9999로 바꿔도 다시 데이터가 돌아가는 경우가 있기 때문에 고정을 해버리면 보통 만사 해결된다.

 

 

 

데이터가 바로 바뀌지는 않는다. 그 이유를 간단히 말하자면 내가 게임에서 현재 체력 텍스트는 턴이 지나거나 공격이나 회복을 통하여 체력 값이 변동되면 현재 체력 값으로 업데이트되도록 해놓았다. 그런데 나는 방금 회복이나 공격 판정이 아닌 체력 값을 직접적으로 바꿔줬기 때문에 체력 값이 바뀌었다고 인식을 못하는 것이다.

한턴을 넘기면 체력 값이 업데이트될 것이다.

 

 

 

됐다 내 체력은 9999다. 그리고 값 고정을 했기 때문에 계속해서 9999로 남아있게 된다.

 

 

3. 퍼지 검색

 

 

퍼지 검색은 위의 말처럼 애매한 검색을 위한 것이다.

만약 체력을 수정하고 싶은데 체력 숫자를 모르는 철권 같은 게임이라고 생각해보자.

그러면 값이 변동되는 것은 확인이 가능하지만 정확히 어떤 값인지는 모른다.

이런 상황에서도 값이 커지거나 작아지는 것을 이용하여 검색이 가능하다.

마치 업다운 게임처럼 검색하는 것이다.

다만 엄청 귀찮다.

간다 조금 내용이 길다.

 

 

 

이번에도 체력을 바꿀 건데 퍼지 검색을 통해서 바꿀 것이다.

 

 

 

위의 저 물음표 검색 버튼이 퍼지 검색 버튼이다.

 

 

 

퍼지 검색은 기본적으로 검색량이 엄청 많기 때문에(의심 가는 데이터가 엄청 많다.) 가급적이면 Auto를 사용하지 않는 것이 좋겠다. 정말 모르겠으면 Auto를 써야 하지만 정수형일 것이라고 짐작이 되기 때문에 Dword를 선택했다.

검색하기를 누른다.

 

 

 

억 단위의 데이터 개수... 이 앱 같은 경우는 정말 작은 앱인데 하스스톤같이 큰 앱은 말도 안 되게 많을 것이다.

 

 

 

검색이 끝나면 데이터 변동을 주고 다시 검색하자.

 

 

 

공격받아서 체력을 감소시켰다.

 

 

 

게임 가디언으로 돌아가면 값이 어떻게 바뀌었는지 물어본다. 체력 값이 내려갔으니 '값이 작아진' 을 선택한다.

 

 

 

검색을 다시 하면 4억대의 데이터에서 3억대로 줄어들었다.

 

이렇게 업다운을 계속 반복한다.

 

.

.

.

 

 

 

반복하다 보니 74개로 줄었다. 여태까지는 게임 가디언 들어가면 알아서 값이 어떻게 바뀌었는지 물어보는 창이 떴는데 이제 안 뜬다. 그러면 직접 퍼지 검색 버튼을 다시 눌러서 퍼지 검색을 계속한다.

 

 

 

6개까지 줄어들었다.

 

 

 

내 체력과 값이 같은 데이터를 찾았다.

 

 

 

값을 9999로 바꿔보았다. 확인해보자

 

 

 

오키 잘 찾았다.

 

퍼지 검색 끝.

 

4. 암호화 검색

 

 

기본적으로는 2번의 기본 검색과 동일하다. 다만 데이터가 암호화되어있어서 위의 체크박스 '값이 암호화되어 있습니다.' 를 체크하고 검색하는 것 그 외에 다른 것은 없다.

만약에 2번의 기본 검색 방법을 따라서 검색해봤는데 값을 찾을 수 없다면 암호화를 체크하고 똑같은 방법으로 검색해보도록 하자.

데이터가 암호화 되어있어서 그런 것인데 더 많은 수의 데이터를 조사하지만 값을 찾아내는 경우가 있다.

암호화 검색에 대해서는 다음에 포스팅할 유니티 메모리 변조 방지 Anti Cheat에 대하여 쓰면서 더욱 자세하게 얘기를 하도록 하겠다.

일단은 검색했는데 값 못 찾으면 암호화 검색까지 해보도록 한다. 정도로 알아두자

 

5. 스피드 핵, 시간 건너뛰기

앱의 속도를 빠르게 하는 것이다.

나 같은 빨리충에게는 정말 좋은 기능이다. 게임에서 애니메이션 재생이 너무 느려서 답답할 때 배속을 해버리면 된다.

PC에서도 치트 엔진이라는 프로그램을 사용하면 사용 가능하다.

다키스트 던전, 슬레이 더 스파이어 2배속 3배속으로 플레이 가능하다.(사운드는 원래 배속으로 재생됨 개꿀)

 

 

 

우측 상단의 햄버거 메뉴 버튼을 클릭한다.

 

 

 

제일 아래 게임 속도를 해킹하기 선택

 

 

 

좌측 상단에 아이콘이 뜨는데 화살표로 배속을 조절해주면 된다.

 

6. 팁

 

 

화면에서 알아두면 편한 버튼들에 대한 설명을 하겠다.

1. 되돌리기

 

 

원래 7이었던 데이터를 9999로 수정하면 지금 이미지처럼 9999(7)로 바뀐다.

이것이 의미하는 것은 '원래 7인데 지금 9999로 님이 바꾼거임' 이다.

그리고 되돌리기를 하게 된다면 다시 이전 데이터로 되돌아가게 된다.

 

2. 리셋, 단체 되돌리기

 

 

휴지통 버튼을 누르면 모두 제거, 되돌리기 및 제거 버튼이 나온다.

모두 제거하면 검색 데이터를 전부 다 날린다.

되돌리 및 제거는 데이터를 원래 데이터로 돌려놓고 검색창에서 없애는 것이다.

풀다는 뭔지 모르겠네 ;; ㅈㅅ ㅎㅎ

 

 

3. 일괄 수정

일괄 수정 버튼을 누르면 데이터 변경하는 창이 똑같이 뜨는데 현재 선택된 데이터를 한 번에 수정 가능하다.

 

 

4. 새로고침

데이터가 실시간으로 바뀌는데 확인하고 싶다면 새로고침 버튼을 누르면 바뀐 데이터 확인이 가능하다.

 

5. 잠깐 게임 가디언 화면 끄기

누르고 있는 동안 게임 가디언 화면이 꺼진다.

 

6. 게임 가디언 설명서

 

 

이 텍스트가 엄청 많은 설명서를 한번 읽어봤는데 꽤나 알차다.

내가 말한 내용들도 여기 많이 속해있고 한번 읽어볼 만하다.

 

이것으로 실제로 앱을 해킹해보는 글을 마치도록 하겠다.

숙제로 한번 카드 위자드 게임의 인게임 골드를 해킹해보라!

 

 

 

다음은 유니티에서 어떻게 메모리 변조를 막는지 그리고 암호화 검색을 하면 실제로 어떻게 되는지에 대하여 분석한 글을 올리겠다.

 

메모리 변조와 관련된 게시물

게임 가디언 설치, 사용 방법

게임 가디언 사용 방법 - 실제 게임 해킹

유니티 메모리 변조 방지 - 안티 치트

반응형

'IT' 카테고리의 다른 글

인텔리제이 꿀팁 모음  (0) 2019.12.14
API 서버 개발 사항 정리  (0) 2019.12.12
게임 가디언 설치, 사용 방법  (30) 2019.12.11
포스트맨 API 서버 개발  (0) 2019.10.23
게임 출시 - 카드 위자드  (0) 2019.08.27