티스토리 뷰
사건의 발단
1. 게임 평론을 알아보면서 예전에 즐겨 했던 게임들 리스트업
2. 민지 포닝 "12월 한달 동안 어떤 프로젝트 진행해보는거 어때요??"
3. 동아리 후배 1 "방학 되면 사설 서버 만들어볼 거다"
4. 동아리 후배 2 "자기가 사설 서버 만들어봤다"
전개
1. 구글 검색으로 APK 파일 다운로드
2. 실행해보니 추가 데이터 다운로드 화면에서 멈춤
3. 추가 데이터 구하려고 예전 스마트폰을 찾아봤으나, 없음
4. 네이버 카페에서 데이터를 구하려고 찾아봤으나, 없음
5. DB 서버와 파일 서버는 일단 나중에 생각하고 네트워크 패킷 분석 시작
6. 스마트폰에 와이어샤크 비슷한 거 설치, 패킷 확인
7. 서버가 아직도 어느 정도 살아있어서 깜짝 놀람, 우회 방법 모색
- TCP 프록시 이용하기
- 사설 DNS 서버 구축하기
- 애플리케이션 수정하기
8. go로 TCP 프록시 서버 작성했으나, 이 프록시 서버를 별도의 네트워크 단말로 분리해야 한다고 판단해 폐기
- 게임에서 여러 서버를 사용하고 있는데, 이들이 사용하는 포트가 여러 개임
- 포트포워딩해서 할 수도 있겠지만, 이미 지금 네트워크 환경에서 여러 포트를 포워딩하고 있음
9. 사설 DNS 서버 구축하기로 결정
10. 윈도우에서 bind9 설치했으나, VS redistribution 버전이 너무 높다고(...) 설치 실패
11. 안 쓰고 있던 옛날 컴퓨터 한 대를 포맷하고 우분투 서버 올리기로 결정
12. UEFI용으로 굽고 설치 진행했으나, 옛날 컴퓨터라(DDR3 RAM 사용) UEFI가 안 돼서 실패
13. 다시 굽고 설치 진행했으나, 마지막 단계에서 크래시 발생
14. 처음에는 기존에 설치했던 FreeBSD 파일시스템과 충돌하나 생각
- 기도하면서 3트
15. 아몰랑하고 컴퓨터 램테스트 돌리고 누움
16. '생각해보니까 DDR3 RAM을 쓰는 컴퓨터면 CPU가 32비트 아닌가?'
17. ISO 파일 확인해보니 최신 stable 버전은 64비트용 밖에 없음, 32비트용 우분투 서버 이미지 또 한참 찾음
18. 설치 성공! (1일차 종료)
19. Bind9 설정하고 DNS 서버 시작
20. 분명 못 찾으면 8.8.8.8로 포워딩하게 했는데 아예 응답을 안 함
21. 문법 테스트 명령어가 있어서 확인해보니 세미콜론 빼먹음(...) 그래도 바로 찾아서 좋았음
22. 수정하고 테스트 다 통과한 거 보고 외부 컴퓨터에서 다시 테스트, 똑같음 (컴퓨터 바꿀 때마다 USB 바꿔끼느라 힘들어 죽는줄... 머리가 나쁘면 몸이 고생한다. 지금 생각해보니까 그냥 SSH로 접속할걸 하...)
23. 다시 들어가서 서비스 보니까 죽어 있음 (문법 틀렸다고 이미 차갑게 식은 상태였음)
24. 서비스 재부팅 후 DNS 작동 확인
25. 안드로이드에서 비공개 DNS 설정으로 192.168.x.x 어? 확인버튼 활성화가 꺼짐
26. 확인해보니 도메인 이름으로 입력해야됨(아니 DNS 서버 설정하는데 DNS 서버 도메인 이름을 입력해야 된다니)
27. 또 찾아보니 와이파이 설정에서 고정 IP로 하면 DNS 설정 변경 가능, 안드로이드에서 DNS 변경 완료
28. 패킷 캡쳐한 거 기반으로 go HTTP mock 서버 개발, 서비스 후 게임에서 사설 IP로 우회되는 것 확인
29. 바이너리 분석 시작, apk 파일 언패킹
30. 까보니까 유니티로 만들었는데, 옛날 게임이지만 어느 정도 암호화되어 있길래 스킵
31. dex 파일 jar로 변환, java class 파일 분석
32. 게임 앱에서 마지막에 띄우는 에러 메시지 가지고 constant 검색, 종료되는 지점 확인
33. 소스 코드 수정하기 시작하면 힘드니까 최대한 수정 안 하려고 우회 로직 있는지 확인
34. 네트워크 응답 코드로 제어 가능한 것 확인, mock 서버에서 응답코드 수정하니 예상과 다른 에러 메시지가 나옴
35. context, activity, 파라미터 이름이 paramString 등등 한계를 느끼고 로그 분석하기로 변경
36. logcat 비슷한 거 설치, 태그로 필터링했으나 로그가 안 찍힘
37. 확인해보니 루팅 안 했으면 adb(android debug bridge) 설치해서 명령어 쳐야된다고 함
38. adb 설치하러 가니까 안드로이드 스튜디오 묶음으로 팔길래 컷하고 밑에서 설치 툴 묶음만 다운로드
39. 설치 툴 실행하니까 Java 버전이 낮다고 올려오라함
40. Java도 어제 깔았는데 여기서 또 올릴 수 없다, 또 찾아보니까 adb만 따로 설치 가능하길래 설치
41. adb 설치하고 스마트폰 USB 연결하니 인식을 못함
42. 개발자 모드 들어가서 USB 연결 설정 해 줘야 된다고 해서 다 해줌
43. adb로 명령어 실행 완료
44. 근데 로그가 안 뜸, 소스 코드 다시 보니까 boolean 변수로 로깅할지 말지 제어하고 있었음
45. 디버그용 애플리케이션 만들기로 결정, class 파일 상수값 수정해서 jar로 압축
46. dex로 변환하려니까 파일이 깨졌다고 안 됨, 보니까 jar로 압축한 게 아니라 zip으로 압축하고 확장자만 변경했음
47. 다시 jar로 압축 후 dex 변환해서 apk로 패키징
48. 폰에 설치하려니까 인증이 안 됐다고 설치가 안 됨
49. 인증서 셀프사인드로 해서 apk 인증해주고 폰에 넣고 설치
50. 실행하니까 타겟 안드로이드 버전이 낮다고 실행이 안 됨. (아니 왜 같은 APK에서 class 상수값만 바꿨는데 하나는 잘 돌아가고 내가 만든 건 안드로이드 버전 운운하는거? 하)
51. 자고 일어나니 머리가 맑아지고 시야가 넓어짐, 하니 바이진스 보다가 하니한테 감동의 포닝 메시지 보내기
- Sarah Kang 노래는 Fall for You와 Summer Is for Falling in Love, 그리고 몇몇 피쳐링들만 알았는데 다 들어봐야겠음
52. apk 파일에서 dex 추출해서 class 파일 수정하지 말고 smali 파일 수정하도록 변경
- class 수정할 때 문제 생겨서 apk 파일 깨진 것 나중에 확인
- 어짜피 Java도 잘 몰라서 거기서 거기, 크래시 우려도 없으니 오히려 좋아
53. 직접 키 만드는 대신 d2j-apk-sign 이용해서 재서명
54. 그래도 로그 안 떠서 소스 코드 재확인, 초기 구동 시 Initialize 과정에서 주는 json 데이터 바탕으로 로깅할지 결정하는 static 변수 수정하는 부분이 있었음 (당연히 상수인 줄 알았는데 아니었던 거임...)
55. mock server에서 던지는 json 내용 수정해서 로깅 되는 것 확인! (2일차 종료)
56. 게임에서 사용하는 모든 서버 확인해서 DNS에서 우회
57. 앱 실행 시 업데이트 확인하는 부분에서 튕겼는데, 이를 우회, 회원가입 및 로그인 화면까지 전시 확인
58. 확인되지 않은 네트워크 HTTPS 통신 확인 & 외부 로그인 API 우회 시도 (3일차 종료)
- reverse nslookup 실패, 소스 코드 내에서 HTTPS 통신 확인중
- 외부 로그인 서버 두기 vs dummy 인증 토큰 만들기 중 후자 시도 중
59. 카카오 로그인 우회 시도, 소스 코드 살펴 봐도 무조건 바이너리 고쳐야되는 걸 확인 (4일차 종료)
60. Android Studio 설치해서 새 프로젝트 생성, 기본 소스 코드 분석
61. 앱 내에서 ACTION_SEND 작동 구현
62. 게임 바이너리 수정해서 해당 앱으로 로그인 우회 시도, 실패
- 개발한 앱이 action을 받지 못함
63. 카카오톡 도메인 우회하여 네트워크 패킷 캡쳐 성공
64. 카카오톡 apk 다운로드 후 언패킹, AndroidManifest.xml 파일 확인해서 스키마 및 호스트 확인
65. ACTION_VIEW도 사용하길래 추가, 혹시 몰라서 Activity 실행될 때 화면 추가
66. 화면 변경 확인, ACTION_SEND가 아니라 ACTION_VIEW로 요청 들어오는 것 확인\
- 지금 보니까 내가 ACTION_VIEW로 바꿔놨었네...
67. 로그인 우회 성공, 제대로된 로그인 응답 포맷 확인 중 (5일차 종료)
68. 도저히 모르겠어서 카카오 로그도 뜯어보기로 결정, 바이너리 뜯어서 로그 레벨 Verbose로 변경
69. JSON 파싱할 때 오류나는 것 확인, json prettier 돌려보다가 콤마 하나 빼먹은거 발견, 수정
70. json 파일 매번 수정할 때마다 go 소스코드 빌드하고 서빙하기 귀찮아서 겸사겸사 파일 서빙 방식으로 변경
71. json 응답 안에 status를 0으로 줘야지 정상 응답 처리하는 부분 발견, json 파일 다시 수정
72. 로그인 되는 거 확인...했는데 갑자기 네트워크 불안정하다고 하고 이후부터 로그인이 안 됨
73. 카카오 로그 보니까 TLS handshake 오류 뜸, 패킷 보니까 NO DATA 뜸, 서버에서도 통신 로그가 안 찍힘
74. wireshark로 보면 handshake 오류 이유도 확인 가능한 거 같아서 wireshark 실행
75. 실행하니까 에러 뜨면서 안 되고 버전 업데이트 하라고 하길래 업데이트
76. 업데이트하는 데 npcap 설치가 안 됨 (0x8007007e 오류, 찾아보니까 윈도우 관련인 듯)
77. 설치 시도 3번해보고 개빡쳐서 포기, self-signed 인증서를 안 쓰면 되는 거 아닌가? 돈 얼마나 드는지 찾아봄
78. 검색하니까 무료 인증서 발급해주는 let's encrypt 발견
- 옛날에 이거 썼던 기억이 새록새록..
- 근데 이거 썼을 때 문제가 없었던가? 군대 가기 전이라 기억이 나지 않음...
79. 옛날에 어떻게 했는지 친구한테 물어봄 > 둘 다 까먹음
- 방법을 적어둔 건 없고, crontab 이용해서 재발급 자동화해야된다고만 적어놨음
80. 여행 계획 짜야돼서 시간 상 내일 알아보는 걸로 (6일차 종료)
결말
81. 여행은 잘 갔다 왔음 (유럽 처음 간 것치곤 많이 배웠다)
82. 저 이후로 추가적인 작업은 없었음
83. apk에 기본적인 카드 데이터가 있을지도 모른다고 생각했는데 그걸 못 찾았기 때문에 인증서 문제를 해결하더라도 그 이상 진행이 불가능하다고 판단했음
84. 사실 예전 스마트폰에 데이터가 남아 있을 거라고 생각했는데 스마트폰 자체가 없었다는 사실
85. 그리고 apk를 변조했기 때문에 배포하는 것도 슬슬 곤란했음
86. 인게임 첫 화면, 가능하다면 튜토리얼 정도까지만이라도 건드려보고 싶었지만 이 정도 선에서 마무리하는 걸로
'프로그래밍' 카테고리의 다른 글
[게임 개발] Abyss Together 릴리즈 (0) | 2025.02.07 |
---|---|
[게임 개발] Art Auction 릴리즈 (0) | 2023.05.24 |