안드로이드 유니티 게임 엔진 IL2CPP 해킹

홈 > 안드로이드 > 안드로이드
안드로이드

안드로이드 유니티 게임 엔진 IL2CPP 해킹

M LIN 110 39918 8

 이전 글에서는 mono로 빌드된 유니티 게임 변조방법에 대해서 살펴보았습니다. mono로 빌드된 게임의 경우 쉽게 디컴파일되어 게임코드를 볼 수 있을 뿐만 아니라 아주 간단하게 코드 삽입 및 변조가 가능하여 보안에 매우 취약하다는 점입니다. 당장 구글에 모드앱과 관련된 단어를 통해 검색만 하더라도 악성 광고 삽입과 동시에 여러 핵들이 포함되어 있는 변조앱들을 손 쉽게 발견할 수 있습니다. 물론 해킹 이슈를 방어하기 위해 코드난독화 또는 보안솔루션 도입과 같은 방법이 있긴하나, 이것 또한 비용에 따른 문제등으로 손쉽게 해킹을 차단하기가 만만치 않습니다. 그래서 이번편에서는 해킹 이슈가 조금이라도 덜한 il2cpp로 빌드된 유니티 게임에 대해서 설명하고자 합니다.  왜 해킹 이슈를 줄일 수 있는가에 대해서 차근차근 설명드리도록 하겠습니다. 

img.pngil2cpp AOT 컴파일
 

 우선 mono빌드와 달리 il2cpp 빌드는 mono 가상머신이 IL코드를 읽는 방식이 아닙니다. mono는 빌드를 수행할 때 C# 코드를 msc.exe가 IL코드로 변환하고, 이 IL코드를 mono가상 머신이 읽게되는 방식입니다.  IL2CPP의 경우 만들어진 IL코드를 il2cpp.exe 에 의해 C++ 소스코드로 변환하게 되고 c++ 컴파일러에 전달되어 네이티브 라이브러리(.so)파일이 생성되는 구조로 AOT컴파일 방식을 사용합니다. 그렇기때문에 실행도중 IL코드를 읽고 실제 기계어를 수행하는 JIT 컴파일 방식이 아니라 미리 기계어를 만들어놓고 바로 수행하는 방식이기 때문에 속도 또한 향상이 되었다고 합니다. 또한 이전에 발생하던 잦은 크래쉬 현상도 많이 해결되어 최근에 출시되는 유니티 게임들이 해당 방식을 많이 사용하고 있다고 합니다. 

img.pngAPK 내부 네이티브 라이브러리
 

 그렇다면 il2cpp로 빌드된 게임앱을 어떻게 변조하는지에 대한 방법을 살펴보겠습니다. apk 파일을 열어보면 lib폴더내에 여러 아키텍처에 맞는 폴더가 존재하며 여러 폴더에는 위 그림과 같이 아키텍처에 맞는 세개의 네이티브 라이브러리 파일이 포함되어 있습니다. libunity.so는 초기에 먼저 로드되어 il2cpp 실행에 대한 여러 초기설정을 한 뒤 libil2cpp.so를 로드하여 작동하게 됩니다. 실제 기계어로 변환된 실제 게임코드들은 libil2cpp.so 파일에 존재하며, 해당 파일을 변조하여 게임코드들을 수정할 수 있게됩니다.  

img.pnglibil2cpp.so
 

이때 게임코드들은 아키텍처에 맞는 기계어로 되어있기 때문에 mono와 달리 어셈블리어를 모르면 수정을 할 수 없습니다. 어셈블리어를 안다는 기준하에 간단한 리턴값 수정이나 nop 패치등 간단한 변조들은 간단하게 할 수 있습니다. 다만, mono처럼 악성광고를 삽입, 특정 함수 호출코드들을 삽입등의 까다로운 방법들은 쉽게 패치가 불가능할 것입니다. 이러한 이유로 해킹에 대한 이슈를 조금이라도 줄일 수 있다고 하지만 역시나 간단한 변조는 막을 수 없을것입니다ㅠ. 
 다음으로 실제 해킹에 사용되는 툴과 사용법에 대해서 알아보겠습니다.

il2cpp 로 만들어진 바이너리에 대한 필드, 메소드등의 정보와 실제 위치를 알려주는 "il2cppDumper" 라는 툴입니다. 깃허브 내 사용법처럼 apk 파일내에 "assets\bin\Data\Managed\Metadata\global-metadata.dat" 를 추출하고 "libil2cpp.so" 파일을 통해 출력파일을 생성할 수 있습니다. 여기서 "DummyDll" 폴더에는 "Assembly-CSharp.dll" 파일이 생성되는데 이 파일을 DnSpy를 통해 확인할 수 있습니다. 단, 게임내 코드를 확인할 수 있는게 아니라 특정 메소드의 위치만 확인할 수 있습니다. 즉, 위치만 확인하되 코드 패치 또는 후킹을 이용하여 변조를 하게되는것이지요. 

img.pngdump.cs
 

또한 "DummyDll" 폴더만 생성되는것이 아니라 dump.cs를 통해서도 쉽게 확인할 수 있습니다. 위 그림과 같이 클래스와 메소드 이름의 주소를 확인할 수 있습니다.
 il2cppDumper라는 툴이 동작을 하지 않는다면 메타데이터 파일, 네이티브 라이브러리가 암호화 되어 있을 확률이 큽니다. 이 경우 mono와 마찬가지로 덤프를 이용하여 복호화된 파일을 쉽게 얻을 수 있으며, il2cpp가 동작하는 내부 코드들은 공개되어 있기때문에 유니티 내부 특정 함수들을 후킹하여 게임에 대한 정보들을 Dumper 툴을 사용하지 않고도 쉽게 얻어올 수 있습니다. 단, 후킹 기술을 사용할 수 있으며 아키텍처에 맞는 어셈블리어 작성 및 분석 능력도 요구되겠죠? 
다음편에서는 메모리 덤프 방법에 대해서 다뤄보겠습니다.


110 Comments
S 코드몽키 2019.10.03 14:45  
외국에서 만든 il2cppdumper는 정말 괴물입니다+_+ 클래스 메소드 메모리주소까지 한방에 줄세우는 기능이라니..

Congratulation! You win the 16 축하드립니다! 당첨되셨어요~!

2 icebone 2019.10.07 11:54  
최고의 도구죠 ㅋㅋㅋ
3 라피스넷 2019.10.03 15:48  
IDA를 통해 해당 메소드의 기계어를 분석하는 방식이 궁금하네요
M LIN 2019.10.03 15:51  
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.architecture.reference/index.html
정독하면 도움이 많이 되더라구요ㅋㅋ

Congratulation! You win the 18 축하드립니다! 당첨되셨어요~!

3 라피스넷 2019.10.04 16:07  
개인적으로 답변 달아주셔서 정말 감사드립니다
정독해보겠습니다
4 알려주세요오 2020.01.12 12:47  
어익후 라피스님이 여기계시네.. 애초에 저 툴 중국에서 만든거아닌가요
어셈에서 메소드 클래스, 네이티브까지 주석으로 주소처리까지..;;;
2 마루야 2019.10.03 22:16  
와 이정도 까지 이해하려면 얼마나 파고들어야 할까요 ㅜ
2 폭스 2019.10.04 10:11  
항상 핵스나 디엔스파이 열어서 숫자랑 영어 많이 보이면 화장실가고 싶은 증상이 생기네요ㄷㄷ
1 dl1233 2019.10.04 10:42  
많이 어렵네요.. 비전공인 사람은 할수있는건지..ㅎㅎ
15 g00dluck 2019.10.04 11:00  
libil2cpp.so파일을 IDA에 로드후
il2cppdumper를 통해 추출된 script.py를 IDA file -> script file 하여 차이점을 비교해보세요 ^^
IDA로 분석시 유용합니다
3 쥬스 2019.11.05 21:47  
아 사랑합니다.
3 가람 2019.12.14 00:26  
감사합니다!
3 배움 2019.10.04 14:51  
덤퍼로 열리지 않는게 암호화 되어 있어서 그랬던 거군요
3 뾰족 2019.10.16 16:44  
그럼 보안은 어떻게 해야할 까요? 그런 힌트도 있으면 좋을 거 같네요. 코드 난독화 정도로 될런지...
M LIN 2019.10.16 17:03  
안녕하세요.
현실적으로 앱보호솔루션을 적용하는 방법밖에는 없습니다...
따로 쪽지주시면 괜찮은 제품들 알려드리겠습니다.
3 최삽질 2019.10.29 16:03  
린님의 C# 어플리케이션에 VMProtect 쓰는것에 대한 고견이 궁금하네요
M LIN 2019.10.29 16:09  
최신 VMProtect(3.4)는 닷넷 ILcode 가상화를 지원해줍니다.
특별한 이슈가 없다면 사용을 권장드립니다.
1 야마간다 2019.10.16 20:07  
쉬워보이지만 어렵네요 초보한테는 ㅠㅠ
2 하롱쥐 2019.10.20 02:19  
일단.. lib 파일이 안보이는 경우는 ... ㅠㅠ
3 nqminhquan 2019.10.21 16:00  
split apk don't have lib foder, u need to dowload lib from apkcombo
S 붉은상어 2019.10.29 18:26  
라이브러리 안쓰는 게임이면 가능.. 근데 그런 게임이 거의 없다는...
2 에스트 2019.11.04 12:39  
이게 훨 좋네요
2 djucd 2019.11.06 17:16  
좋은 강좌 감사합니다
1 수호 2019.11.09 03:53  
감사합니다.
2 CodeMon 2019.11.13 17:29  
감사합니다 !
4 jmj877 2019.12.05 18:06  
Il2CppDumper로 libl2cpp.so파일이 추출되지 않는 경우에는
난독화로 인해 추출되지 않는걸까요?

처음부터 차근차근 배워보려 하는데 쉽지 않네요...
정말 십여년전 C언어만 배웠던 저에게 아직은 쉽지 않나봐요
2 95grit 2019.12.06 23:49  
감사합니다
2 빙굴 2019.12.12 07:48  
MONO인지 li2cp인지 구별하는법이 있을까요?
3 oculus 2020.08.13 04:18  
apk파일을 열어보면 mono의경우 Assembly-CSharp.dll에 바로 접근 할 수 있습니다
12 모야모야 2019.12.13 14:04  
가야할길이 엄청 머네요....여기 계신분들은 정말 대단하시고 존경스럽습니당...
2 songod 2019.12.19 17:09  
감사합니다.
12 모야모야 2019.12.23 17:04  
il2cpp dumper 툴이라는게 어떤건가용? 구글링했는데 다운받을수있는건 잘안보여서...
15 g00dluck 2019.12.23 18:20  
본문에도 있지만 요기 링크에서 받으시면되요
https://github.com/Perfare/Il2CppDumper

직접 컴파일 해보거나 releases 탭에서 다운받아서 사용하면되요
2 Hoya 2019.12.24 15:57  
il2cppdumper로 dump.cs 파일을 추출하는데는 성공하였습니다. 그런데 제가 코드를 읽을줄 몰라서 맨땅에 헤딩하듯이 지레짐작으로 코드수정 간단히 하였는데, 저장하고나서 다시 so파일로 재컴파일하려면 어떻게 해야하나요??
구글링해봐도 답이 없어서 질문드립니다..
M LIN 2019.12.24 16:02  
http://linforum.kr/bbs/board.php?bo_table=android&wr_id=469
린엔진으로 수정하시면 됩니다.
2 Hoya 2019.12.24 18:21  
하나 궁금한것이 있습니다. 튜토리얼을 보면 싱글게임의 체력이나 마나같은 메모리를 수정하여서 수치가 고정되거나 하는 툴 같은데요
제가 해보고 싶은것은 기존에 있는 재화(현금으로 결제해서 충전하는 보석같은)를 아이템을 사면 줄어드는데 플러스가 되게 하고싶은데 이런것도 가능할까요??
2 해키 2019.12.27 21:49  
assets\bin\Data\Managed\ 이 경로가 없습니다..
1 rafael 2019.12.28 12:30  
감사합니다
S Dhhd 2020.01.04 12:50  
잘봤습니다
1 ab1313 2020.01.06 10:04  
감사합니다
28 사딸라 2020.01.07 08:13  
감사합니다.

Congratulation! You win the 20 축하드립니다! 당첨되셨어요~!

1 케록 2020.01.08 16:36  
아 아직은 어렵네요...ㅎ
13 Rohas 2020.01.09 16:12  
감사합니다
13 Rohas 2020.01.09 16:13  
감사합니다!
2 맨손81 2020.01.16 15:19  
어렵네요 ㅠㅠ
1 lin26 2020.01.26 15:03  
다시 보고 또 봐도 아직은 어려운 부분이 많네요. 천천히 배워가야겠습니다.
5 Bugday 2020.01.31 06:25  
좋은 정보 감사합니다!
3 ch4njun 2020.02.20 16:06  
아직 어렵네요 ㅠㅠ
2 개미개미 2020.03.07 01:03  
이걸 보고 빌드 하려면 얼마나 걸릴지.. 노력이 필요하네요
2 호랑이쿨광 2020.03.09 06:02  
좋은정보 감사합니다~!
2 레드 2020.03.14 16:20  
감사합니다.
2 빵야빵야 2020.03.30 22:50  
천천히 공부중입니다 ㅠ 어렵네요
7 래바리 2020.04.03 18:51  
감사합니다.
2 작녹 2020.04.11 00:28  
게임을 실행하면서 so파일이 변경될 가능성이 있나요? frida 덤프 결과와 dumper 덤프 결과가 다르네요.
1 바람과같이 2020.04.13 00:28  
감사합니다
2 rjsejrrjsejr 2020.04.16 05:24  
공부중인데 재밌네요 ㅋㅋ
2 린엔진촙촙 2020.04.20 15:00  
어렵네여...ㅠㅠ
1 dlrldnr 2020.04.28 06:06  
와우대단합니다
7 임중호 2020.05.24 01:27  
실패했습니다....
1 Haul 2020.05.24 18:37  
게임내 코드를 볼 수 있으면 정말 재밌을 것 같은데 쉽지 않네요ㅜ 강의 감사합니다
1 주황버섯 2020.06.29 11:31  
감사합니다
9 동나무 2020.07.17 23:16  
코드 보다보면 눈이 아파...ㅠ
2 간식마렵다 2020.07.18 12:44  
감사합니다
1 피통왕구키 2020.07.19 00:04  
감사합니다.
1 우린 2020.07.24 02:36  
감사합니다~~ 참고해보겠습니다.
1 아리송당 2020.07.30 09:43  
감사합니다.
1 amarosa 2020.07.30 16:29  
감사합니다
1 안우영 2020.08.01 19:36  
감사합니다
2 tlfgjadyd 2020.08.04 14:57  
개념 정리 감사합니다!
4 쿨록 2020.08.07 18:51  
이 글도 정독할게요~
2 킹덤bk 2020.08.16 15:17  
감사합니다!!
9 koooo 2020.08.19 16:18  
감사합니다 개념 정리에 많은 도움이 되었습니다~
1 린보간 2020.09.03 16:31  
감사합니다!
1 훔바 2020.09.04 01:40  
감사합니다 ~
1 녹아요 2020.09.07 16:25  
좋은 정보 감사드립니다.
1 유미린 2020.09.18 14:47  
감사합니다~~
1 univ17 2020.09.22 20:01  
강의 감사합니다 제가 해보려고 하는건 프로텍트가 걸려있어서 아쉽네요
2 호랑이쿨광 2020.09.28 01:04  
자료 감사합니다~~
2 rune 2020.10.12 00:01  
자료 감사합니다
1 킁컹이 2020.10.25 17:37  
글 하나하나 볼때마다 어렵네요 ㅠ 감사합니다
1 뼈뿌이없다 2020.10.31 15:53  
시간날때마다 공부하겠습니다.... 수능시험보다 더 열심히 하는듯
2 키랏 2020.11.10 15:20  
감사합니다 ㅎㅎ
2 매코미 2020.11.15 00:27  
감사합니다~~~~
1 klhj 2020.12.03 23:32  
감사합니다

Congratulation! You win the 18 축하드립니다! 당첨되셨어요~!

2 Protainless 2021.01.10 23:33  
좋은 글 감사합니다. 또 한번 복습했어요
1 곤뇽 2021.03.07 23:29  
정독중입니닫 감사합니다

Congratulation! You win the 6 축하드립니다! 당첨되셨어요~!

1 hash 2021.05.09 23:33  
감사합니당
2 준섭이당 2021.07.05 01:16  
ㄱㅅㅎㄴㄷ
2 트가팔 2021.07.26 03:23  
와드박겠습니다
2 린풔 2021.07.28 01:31  
감사합니다!!
2 공적1 2021.09.06 03:03  
감사합니다~
3 초보해커 2021.09.08 08:22  
감사합니다
1 둘기랑 2021.09.13 21:16  
감사합니다~
1 ehlek 2021.10.02 22:20  
감사합니다
2 부자습관 2021.10.05 23:04  
찾던건데 감사합니다
3 Shdlem 2021.10.14 11:13  
감사합니다
1 초핵임 2021.12.15 19:04  
감사합니다 잘 보고있습니다.
1 토템 2022.01.01 02:12  
감사합니다
1 dfsdfsdf 2022.05.20 02:21  
찾고 있던 정보였는데 감사합니다
1 과자 2022.10.13 18:02  
감사합니다
1 아가토 2022.12.05 00:17  
이제 처음 접하고있는데 하루하루 배우는 기분이 남다르네요
1 까미 2022.12.05 04:14  
같이 정보를 얻어보아요
8 Dean 2023.02.02 14:45  
감사합니다
1 계란후라이 2023.02.14 13:33  
잘 정리되었네요. 감사합니다
1 Goodri 2023.02.24 08:41  
잘보고갑니다.
1 holiam 2023.03.30 12:35  
감사합니다. 모바일 접근하기 힘들었는데 많이 배우고 갑니다.
1 마이키 2023.04.12 14:45  
감사합니다 ㅎㅎ
1 ruin1105 2023.04.30 22:17  
모바일에 벽이 허물어지는것같네요!
1 richardson 2023.05.24 00:48  
tranks
1 GR3K 2023.05.24 00:56  
thanks