본문 바로가기
Unity

Unity Obfuscator #2

by wlgpdnjs 2019. 6. 7.

IL2CPP란?

 

유니티에서 빌드세팅을 할 때 보면  Assembly-CSharp.dll 파일에 코드가 저장된다. 이 파일은 디컴파일러로 열었을 때 쉽게 코드가 보이는데 이때 코드를 IL 코드라고 한다.

이를 방지하기 위해서 빌드세팅에서 IL2CPP로 설정하면 so파일 형태로 코드가 저장되는데 이름 그대로 IL코드를 CPP형태로 변환하는 건데 분석하기가 매우 어렵다.

 

빌드세팅부분

 

유니티에서 작업을 할 때 작성한 C# 코드는 msc.exe라는 프로그램이 IL 코드로 변환하고 IL 코드를 실행하기 위해서 libmono.so가 IL코드를 읽어들여 실행 환경에 해당하는 Assembly어로 변환하여 게임이 실행된다.

IL2CPP 도 msc.exe를 이용해 IL 코드를 생성하긴 하지만 il2cpp.exe를 이용해 IL을 C++ 형태로 변환한다.

C++로 변환되어 네이티브 어셈블리로 실행되기 때문에 IL 코드에 비해 속도가 향상된다고 한다. iOS 64bit 버전에서는 mono 대신 IL2CPP를 쓴다고 한다.

 

IL2CPP 빌드 과정

IL2CPP 빌드를 해보려 했는데 안드로이드로 빌드하려니까 ndk가 필요하다해서 추가 설치 후 빌드해봤다.

게임 속도는 향상되는지 몰라도 빌드 속도는 느려지는 것 같다.

 

변환된 코드들은 libil2cpp.so에 존재한다.

IDA를 이용하여 so 파일을 열어봤을 때 C# 코드랑 나란히 놓고 봤을 때 완전 같은 코드라는걸 알아볼 수 없을정도다.

IL2CPP 코드
C# 코드

함수 이름, 변수 이름, 사용한 문자열도 찾을 수 없다. C# 코드는 함수, 변수 이름들이 그대로 보였기 때문에 코드를 바꾸고 싶은 부분을 바꾸기 쉬웠지만 IL2CPP는 원하는 함수 부분이 어딘지 알 수 없다. 

이를 il2cppDumper나 il2CppInspector라는 툴을 이용해 메소드 주소, 이름, 필드 등을 가져올 수 있다고 해서 사용해 보기로 했다.

il2cppdumper

libil2cpp.so 파일과 global-metadata.dat 파일을 이용해 정보를 가져온다.

'Unity' 카테고리의 다른 글

Unity Obfuscator #5  (0) 2019.07.04
Unity Obfuscator #4  (0) 2019.06.27
Unity 특수 폴더들  (0) 2019.06.27
Unity Obfuscator #3  (0) 2019.06.14
Unity Obfuscator #1  (3) 2019.05.31