본문 바로가기
Android

안드로이드 Unity Engine 분석 [il2cpp]

by Ate1es 2022. 3. 23.

1. Unity 로 만들어진 앱의 빌드 과정

 

일단 Unity 로 만들어진 게임 소스코드들은 Mono 또는 il2cpp 로 빌드를 할 수 있다. 하지만 Mono 로 빌드된 앱들이  쉽게 디컴파일 되어 게임 소스코드가 그대로 노출되어 코드 삽입이나 변조에 굉장히 취약하다는 이슈가 있다.

 

그래서 해킹 과정이 좀 더 복잡한 il2cpp 를 사용해 빌드를 많이하는데 이번에 il2cpp를 사용해 빌드한 앱을 분석할 기회가 생겨서 알게된 지식들을 정리해놓으려 한다.

 

우선 아래 과정이 Unity 앱이 빌드되는 과정이며, il2cpp 는 Mono와 다르게 AOT 컴파일 방식을 사용한다. 실행도중 IL코드를 읽고 기계어를 수행하는 방식이 아니라 미리 기계어를 만들어놓고 수행하는 방식이다.

 

 

2. 앱 디컴파일 및 중요 파일

앱을 디컴파일해 파일을 살펴보면, 

lib -> libil2cpp.so 파일이 존재한다. --> 해당 파일은 게임 소스코드 기계어를 담고 있다.(★★★★)

여기서 우린 슈퍼괴물도구 ilbil2cpp dumper 라는 툴을 써보자. 

 

해당 툴은 il2cpp로 빌드된 바이너리 파일을 분석해, 메소드의 정보와 RVA 값까지 추출해주는 툴이다.

https://github.com/Perfare/Il2CppDumper

 

GitHub - Perfare/Il2CppDumper: Unity il2cpp reverse engineer

Unity il2cpp reverse engineer. Contribute to Perfare/Il2CppDumper development by creating an account on GitHub.

github.com

 

해당 툴에 위의 libil2cpp.so 파일과 아래 경로의 global-metadata.dat 파일을 던져주면

 

 아래와 같이 DummyDlldump.cs 파일을 뱉어낸다. 

 DummyDll 폴더에는 앱에서 사용되는 Dll 파일들이 있고, dump.cs 파일엔 그 메소드들의 선언과 RVA가 정리되어있다.

DummyDll 폴더속에 많은 dll 파일들을 볼 수 있는데, 이중에 우리가 주목해야할 파일은 Assembly-CSharp.dll 파일이다.

 

해당 파일에 게임에 쓰이는 클래스, 메소드들이 들어있다.

3. 주요 파일 분석 

이제 Assembly-CSharp.dll 파일을 분석하기 위해, 또다른 유용한 툴을 써보자. 바로 Dnspy 라는 툴이다.

https://github.com/dnSpy/dnSpy

 

GitHub - dnSpy/dnSpy: .NET debugger and assembly editor

.NET debugger and assembly editor. Contribute to dnSpy/dnSpy development by creating an account on GitHub.

github.com

이 툴은 dll 파일을 열어서 코드로 변환해주며, 해당 코드를 수정까지 할 수 있게 해주는 툴이다.

해당 툴에 Assembly-CSharp.dll 파일을 던져주자.

 

그럼 엄청나게 많은 클래스와 메소드가 나올 것이다. 검색 기능을 이용해 GetGold 라는 메소드를 찾았다.

해당 메소드의 RVA 값은 0x82CA40 이며, 아마 게임에서의 재화를 다루는 메소드 같아보인다.

 

여기서 치트의 길은 두가지로 갈리는데, 해당 소스코드를 직접 수정해 고정값을 넣어 확인해보거나 RVA 값을 알았으니 Frida로 후킹해서 인자값을 조작하는 이 두가지의 방법이다.

 

4. Frida 코드

후자의 방법으로 후킹 코드를 짜보면 다음과 같다.

해당 코드는 libil2cpp.so 라이브러리를 캐치하여, Base Address 를 구하고 아까 구했던 메소드의 RVA 값을 더해서 해당 함수에 접근하는 코드이다.(소스코드는 다른 메소드 RVA값이 적혀있음)

 

5. 문제 발생

해당 함수까지 접근은 가능하지만 인자값 변조가 되지않았다. 왜그럴까하고 다시 저 메소드를 유심히 보는데, 자료형이 살짝 이상하다.

 

ObscuredDouble ? Double 이면 Double인데 저건 무엇이던가. 구글링을 들어가보자 답이 바로 나왔다.

https://assetstore.unity.com/packages/tools/utilities/anti-cheat-toolkit-v2-152334?aid=1101l7zGS&utm_campaign=unity_affiliate&utm_medium=affiliate&utm_source=partnerize-linkmaker 

 

Anti-Cheat Toolkit v2 | 유틸리티 도구 | Unity Asset Store

Use the Anti-Cheat Toolkit v2 from Code Stage on your next project. Find this utility tool & more on the Unity Asset Store.

assetstore.unity.com

 

해당 자료형은 안티 치트 툴킷에서 쓰는 자료형이며 메모리에 올릴 때 값을 암호화해서 올린다고 한다. (메모리 후킹 방지용)

 

때문에 해당 메소드를 메모리에서 후킹해 변조를 하는 것은 불가능 할 것 같다.

하지만 Dnspy를 통해 소스코드 자체를 변조하는 것은 막을 수 없는 솔루션 같아보인다.

 

PS. 모바일 꿀잼이다

 

 

참고사이트

http://linforum.kr/bbs/board.php?bo_table=android&wr_id=4 

https://docs.unity3d.com/kr/2018.4/Manual/IL2CPP.html

https://appguard.toast.com/blog/5

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=linears_&logNo=221393855353