서론

기존 IL2Cpp로 빌드하지 않는 Unity Engine에서는 Assembly-CSharp.dll을 리버싱 하므로써 손쉽게 변조가 가능했다.

심지어 코드를 재빌드 가능 했기에 고급언어 수준에서의 해킹이 가능했다. 이후, Unity Engine에서 IL2Cpp 빌드 기능을 추가하면서 기존과는 다르게 직접적으로 dll이 노출되는게 아닌 libil2cpp.so 파일에 숨겨지게 되면서 리버싱이 좀 더 어려워 지게 되었다.

하지만, 아예 불가능 한것이 아니므로 해킹을 좀 더 어렵게 만들기 위해 그 방법에 대해서알아보자.

IL2Cpp란?

유니티 측에서는 C#으로 작성된 게임들의 보안성과 IOS 64bit 지원을 위해서 IL2Cpp로 빌드할것을 권장하는데, 기본적인 컴파일 프로세스는 아래와 같다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f24f0776-3b5f-4341-bc36-1bc735217fc0/Untitled.png

기존 mono 빌드의 경우 C# 코드를 msc.exe를 이용해서 IL코드로 변환하고 이 IL코드를 mono가상 머신이 읽게 되는 방식이다. 이경우 dll이 노출되기 때문에 해킹이 매우 손쉬워 진다는 문제점을 가지고 있다.

IL2CPP의 경우 위에서 나온 IL코드를 il2cpp.exe를 이용해서 C++ 소스코드로 변환하고 C++ 컴파일러를 이용해 네이티브 라이브러리(.so)파일로 만드는 방법으로 AOT(ahead-of-time) , 즉 정적 컴파일 방식을 사용합니다.

결국, 기존 IL 중간언어로 컴파일 한것에 한번더 C++로 컴파일 하도록 추가했다고 볼 수 있다.

JIT방식이 아니기 때문에 속도가 향상되었다.

APK 추출

apk파일을 구하는 다양한 방법이 있는데, 편하게 구글마켓 주소를 바탕으로 추출해 주는 사이트도 있다. (https://apps.evozi.com/apk-downloader/)

apk파일을 구했다면 압축을 해제해 주면 된다.

(apk 는 단순 Zip압축 파일에서 확장자만 바꿨다고 보면 된다)

libil2cpp.so 파일 리버싱

압축을 해제한 apk 폴더를 뒤져 보면, 아래와 같은 파일들이 있는게 보일것이다 (lib폴더)