게임보안솔루션 무력화 했었던 경험과 신기했던 점
옛날에 보안솔루션이 적용되어 있던 어떤 유니티 게임을 분석했던 내용들인데
강좌라 하기엔 너무 부실하고 방향성도 모호해서 그냥 저의 의식의 흐름대로 적을게요
모 애플리케이션의 메인액티비티의 onCreate 함수입니다
onCreate가 뭐지? 하시는 분들은 구글에 Android life cycle 이라고 검색해보세요!
딱봐도 간단해 보이는 내용이죠? 보안솔루션의 인스턴스를 얻어온 뒤에 initialize 함수를 호출하는거에요
파고들다 보면 결국 네이티브 라이브러리 호출을 하는 것을 알 수있는데요
저의 허접한 분석 결과 initialize라는 함수가 상당히 많은 역할을 하고 이 함수만 무력화 시키면 보안 솔루션을 호구로 만들 수 있다고 생각했어요
하지만, 그렇게 무력화를 한 후에 게임을 실행해보니 어딘가 무결성 검사를 하는 부분이 있다는 것을 알아냈고
놀랍게도 그게 게임엔진 스크립트 부분인 Assembly-CSharp.dll 에 있다는것을 알고 깜짝 놀랐어요
그 당시에는 무력화에만 집중하느라 별 생각 없이 지나쳤던 부분인데 과연 어떻게 한 것일까요?
요 그림은 무결성 검사를 하는 부분의 일부를 가져온 것이에요
보시면 패킷 송수신을 통해서 무결성에 관한 정보를 확인하는 거라는걸 간단히 짐작할수있죠
근데 여기서 AndroidManager.XXXXXX() 보이시나요?
네이티브 함수들에 대해서 제대로 안보여드려서 그렇지만..분명 네이티브 함수에 분명 비슷한 이름들이 있었어요
그것을 보고 혹시 유니티에서도 직접 네이티브 함수를 호출할수 있나 싶었죠
그래서 AndroidManager 클래스에 대해서 한번더 파고 들어봤어요
쿠키값을 받아오는 함수에요 activity라는 멤버 에서 Call이라는 메서드를 통해서 함수를 호출하는것을 알 수있었어요
activity의 할당은 언제 되는건지 한번 더 알아보았어요
이 그림에서 46번째 줄 보이시나요?
AndroidJavaClass 의 생성자로 애플리케이션의 메인액티비티를 파라미터로 넘겨주고
GetStatic이라는 메서드를 통해서 싱글턴 인스턴스를 activity에 할당해주는것이라고.. 추측해볼수 있었어요
구글에 검색을 해봤어요
https://docs.unity3d.com/kr/530/ScriptReference/AndroidJavaClass.html
설명을 읽어보시면 알겠지만 네이티브로 호출하는것은 아니지만, 유니티에서도 AndroidJavaClass 를 이용하면 java 코드를 호출할 수 있다는것을 알 수 있었어요
네이티브 함수를 직접 부른다는 제 추측은 틀렸지만, 어쨌든 MainActivity에서 전혀 호출해주는 녀석들이 없는데도 왜 있지 하는 녀석들이 왜있는지를 알게 되었어요
몇년전에 리버싱 배울 때 정공학을 잘해야 역공학도 잘한다는 말을 들은 적이 있어요
정공학을 못한다고 생각하고 있었지만 이번에 간단한 삽질을 통해서 그걸 또 한번 깨닫게 되네요 ㅎㅎ;;
이것저것 말하다가 요점을 잃어버린것 같네요 ㅋㅋ
3줄 요약 해드릴게요
1.게임 보안 솔루션 메서드의 호출을 dex 파일 말고도 Assembly-CSharp.dll 에서 하는것이 신기했음
2.유니티에서 AndroidJavaClass 객체를 생성함으로써 Java 함수의 호출이 가능하다
3.정공학을 열심히 하자