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 빌드를 해보려 했는데 안드로이드로 빌드하려니까 ndk가 필요하다해서 추가 설치 후 빌드해봤다.
게임 속도는 향상되는지 몰라도 빌드 속도는 느려지는 것 같다.
변환된 코드들은 libil2cpp.so에 존재한다.
IDA를 이용하여 so 파일을 열어봤을 때 C# 코드랑 나란히 놓고 봤을 때 완전 같은 코드라는걸 알아볼 수 없을정도다.
함수 이름, 변수 이름, 사용한 문자열도 찾을 수 없다. C# 코드는 함수, 변수 이름들이 그대로 보였기 때문에 코드를 바꾸고 싶은 부분을 바꾸기 쉬웠지만 IL2CPP는 원하는 함수 부분이 어딘지 알 수 없다.
이를 il2cppDumper나 il2CppInspector라는 툴을 이용해 메소드 주소, 이름, 필드 등을 가져올 수 있다고 해서 사용해 보기로 했다.
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 |