kgc2014 line rangers/stage크래시 및 어뷰징 대응
TRANSCRIPT
LINE Rangers/Stage크래시 및 어뷰징 대응
LINE+ 게임개발 2실
남세운/문영민
뭔 게임이야?
• 릴리즈 : 2014.02.28
• 타워 디펜스
• 귀여운 라인 케릭터 총 출동
• 한국어, 일본어, 태국어, 중국어(번체), 영어
• Cocos2d-x 2.1.4
– http://cocos2d-x.org
스크린샷
다운로드
라인 할로윈 코스프레 : 일본
왕철이형 방문기념
어뷰징?
• 남용, 오용, 학대 등을 뜻하는 단어인 abuse에서 파생된 단어로 주로 온라인 게임에서 버그, 핵 등의 불법 프로그램, 타인 계정 도용, 다중 계정 접속 등을 통해 부당한 이득을 챙기를 행위를 뜻한다(엔하위키)
• DOS 게임 시절– 남은생명력 9999
• 모바일 시대
1단계 –메모리 조작
• 단순하지만 가성비 좋은 어뷰징– 화면의숫자
– 추측
– 노가다
• 메모리 수정/복사
1단계 –메모리 조작
• 좋은 예
1단계 –메모리 조작
• 화면에 노출되는 숫자, 예측 가능한 숫자 제거
• UI와 로직의 분리
• 숫자 암호화– 모바일성능고려
• 클라이언트 로직을 신뢰하지 말자
• 서버 검증 절차 추가
2단계 –시간 조작
• 일명 스피드핵
• 타겟 : 예측된 시간동안 행동이 이루어 지는 로직
• 결과 : 적군이 타워를 지나치더라
• Ex) 일반적인 dt = 0.03s
스피드핵 dt = 10s(배율로 조정 가능)
2단계 –시간 조작
• 클라이언트 시간은 쉽게 조작 가능하다
• Dt를 기반으로 하는 경우 경계값을 꼭 정의하자
• 가능하면 서버 처리
3단계 –디컴파일
• IF
• 항상 true 를 리턴하게 한 후 앱을 리패키징하면 끝
• JAVA, C++ 소스코드 보안
if ( checkValue ) {
//checkValue 가 true 일때만실행되야하는상황}
3단계 –디컴파일
• 라이브러리 변조
3단계 –디컴파일
3단계 –디컴파일
• 뭐…뭐라는 거야..나도 모르겠다…
• 전문가를 찾아라
• So 파일을 앱 로딩시에 검증한다– 설치된경로의 so파일체크
• So 파일 심볼 제거
• 난독화
3단계 –디컴파일
• Android.mk 디버그 심볼 제거 옵션 추가
• Main.cpp의 모든 JNI 함수에 JNIEXPORT, JNICALL 추가
• NDK_ROOT/platforms/android-x/arch-arm/usr/include/jni.h
LOCAL_CFLAGS += -fvisibility=hidden
JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_n
ativeInit(JNIEnv* env, jobject thiz, jint w, jint h) {
//code
}
#define JNIEXPORT _attribute_ ((visibility ("default")))
3단계 –디컴파일
3단계 –디컴파일
4단계 –버전 우회
• 이것 저것 열심히 수정해 놨더니 똭!!
• So파일을 변조된 파일로 교체
• 앱 버전 정보 변조
1.0.4 에서 xml버전 정보만 교체해서 패키징
-> 1.0.6 으로 인식
-> 어뷰징 우회
4단계 –버전 우회
• 버전 정보를 소스코드에 내장하도록 함
• So파일 검증 절차 추가
5단계 –버그 버그 버그..
• 우리의 QA는 완벽 하지만, 완벽하지 않다
• 외부 이벤트에 의한 일시 정지 + 터치 취소 이벤트
6단계 –다시 처음부터
• 무한 반복
• 이쯤 되면 고민을 할 시기– 어뷰징방지를위해얼마나리소스를투입할것인가?
추가 고려 사항
• 믿을게 없구나…
– 아이폰 –탈옥우회앱
– 안드로이드 –루팅우회앱
– 라인전용우회앱
• 커뮤니티 사이트 동향 파악 – 대만, 태국
• 재화는 모두 서버 처리
• 보안 모듈 사용– 사내보안모듈
– 안드로이드네이티브 : ProGuard 적용검토
• D2 오픈세미나 : LINE Rangers 게임 클라이언트/서버 아키텍쳐– http://www.slideshare.net/deview/4d2-line-rangers
ETC
라인 스테이지란?
“Tab & Flick Rhythm game with LINE Characters”
크래시의 영향
서비스출시
앱이죽고/멈춤
사용자감소/리뷰별점테러
???
크래시 대응
수집 분석 처리
• nCrazer - 로그 수집 및 분석 시스템을 이용한 수집– IOS : plCrashReporter
• https://www.plcrashreporter.org/
– Android : google-breakpad
• https://code.google.com/p/google-breakpad/
– nCrazer 강연자료 : http://deview.kr/2014/session?seq=8
크래시 수집
Xcode>Organizer를 이용한 분석
크래시 분석 (IOS)
Symbolicatecrash 명령어를 이용한 분석
크래시 분석 (IOS)
• 환경 변수 설정– export DEVELOPER_DIR="/Applications/XCode.app/Contents/Deve
loper”
• 명령어 alias
– alias symbolicatecrash='/Applications/Xcode.app/Contents/Develope
r/Platforms/iPhoneOS.platform/Developer/Library/PrivateFramework
s/DTDeviceKitBase.framework/Versions/A/Resources
/symbolicatecrash -v'
• 분석– symbolicatecrash myapp.crash myapp.app.dSYM
크래시 분석 (IOS)
크래시 분석 (IOS)
• Google-breakpad란?
NDK 크래시 분석(Android)
• 선행작업– 리눅스머신설치
• Symbolic 파일생성시 Linux Dependent한함수사용.
– Google breakpad 설치
• svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-
breakpad-read-only
• checkout 받은디렉토리이동
• ./configure --host=arm-linux-androideabi --disable-processor --disable-
tools
• make -j4
NDK 크래시 분석(Android)
• SO(Shared Object) 파일 구하기– ndk build시프로젝트내에디버그정보를가지고있는 SO 파일이존재.
– 크래시가발생한빌드의 SO 버전이어야함.
• Symbolic 파일 생성– Breakpad 설치가완료되면, usr/local/dump_syms 명령어가생성됨.
– dump_syms myapp.so > myapp.so.sym
NDK 크래시 분석(Android)
NDK 크래시 분석(Android)
• 심볼 파일
• Symbolic 디렉토리 생성– mkdir myapp.so
• 디렉토리명과 so 파일명이같아야함.
– head –n1 myapp.so.sym
• MODULE Linux arm CC2AD9BC08138FB1E8E6284959817A560 myap
p.so
– mkdir CC2AD9BC08138FB1E8E6284959817A560
• Symbolic 파일 복사– cp myapp.so.sym ./myapp.so/CC2AD9BC08138FB1E8E628495981
7A560
NDK 크래시 분석(Android)
• StackWalk
NDK 크래시 분석(Android)
Extract Data Stream from minidump
Enumerating Threads
Walking a Thread stack
Produce result
• 분석– /usr/local/minidump_stackwalk myapp.dmp
NDK 크래시 분석(Android)
크래시 대응 결과