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

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

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

M LIN 89 19451 5

유니티로 제작된 안드로이드 게임은 원하는 컴파일 방식(Mono, IL2CPP)을 선택하여 빌드를 할 수 있습니다.

가장 많이 사용하는 Mono의 경우 JIT 컴파일을 사용하여 IL(중간언어)로 작성된 dll 파일을 읽어들여 런타임으로 코드실행을 하게됩니다. 자바의 JVM과 유사하다고 보시면 됩니다.

또한 빠른 빌드속도와 닷넷 프레임워크를 기반하여 여러 플랫폼(리눅스, 윈도우, 맥 등)에서 구동이 가능하다는 점등의 여러 큰 장점들이 있지만, 가장 큰 단점은 보안에 매우 취약하다는 점입니다.

img.png

코드 난독화 및 보호솔루션이 없는 일반 mono기반의 게임의 경우 마치 오픈된 소스코드처럼, 게임 내 모든 스크립트를 담고 있는 DLL 파일을 통해 아주 쉽게 디컴파일이 가능합니다. 분석하기에 앞서 가장 많이 사용하는 툴은 다음과 같습니다.

 

https://github.com/icsharpcode/ILSpy
- https://github.com/0xd4d/dnSpy

 

필자는 코드 삽입 및 디버깅등의 여러가지 장점이 있는 dnSpy를 자주 사용하기에 해당 툴을 사용하는 방법을 간단히 알려드리려고 합니다.

유니티 게임을 변조하기에 앞서 테스트용 게임앱(apk)에서 "assets\bin\Data\Managed\Assembly-CSharp.dll" 파일을 우선 추출합니다.


img.png

dnspy


 dnSpy를 실행하고 추출한Assembly-CSharp.dll을 드래그하여 오픈하면 다음 그림과 같이 실제 게임내에서 사용하는 스크립트의 디컴파일된 모습을 볼 수 있습니다.

보시다시피 원본 소스코드와 거의 유사한 게임 내 스크립트를 얻을 수 있습니다.

 

img.png 

Edit IL Code


 코드를 변조하는 방법은 해당 메소드를 오른쪽 마우스로 클릭하고 EditMethod(C#))기능을 통해 아주 쉽게 코드변조가 가능합니다.

그림과 같이 로그 출력 코드를 삽입하거나 특정 코드내 인자값 조작이 가능합니다. 간혹 컴파일에 실패하는 경우가 있는데 이때에는 Edit IL Instructions 기능을 통해서도 코드 변조가 가능하기 때문에 IL 인스트럭션을 변조해주는 방법을 사용하기도 합니다.
코드를 모두 수정하였다면 File -> Save Module을 클릭하여 저장하고, 수정된Assembly-CSharp.dll 원본 APK 파일 내 dll 파일과 교체한 뒤 리패키징 작업을 하면 코드가 변조된 APK를 얻을 수 있습니다.

간단하고 쉽게 리패키징하는 방법은 apktool 툴을 사용하거나, apk파일을 직접 열어 dll 교체 후 서명만 다시 해주면 됩니다.

 

만약, Assembly-CSharp.dll을 열었을때 DnSpy가 인식을 못할경우 PE구조 또는 CLR 메타데이터 헤더를 깨놨거나 파일 암호화가 되있을 확률이 큽니다.

파일을 헥스에디터로 열었을때 기존 PE구조와 비슷하다면 정상적인 dll파일과 비교하여 헤더를 복구하거나 PE구조 분석, 메타데이터 헤더 분석하여 복구하는 방법이 있습니다.

파일암호화의 경우 게임이 정상실행된다음 메모리 덤프를 통해 실제 사용되는 원본 dll 파일을 얻는 방법이 있으며, libmono.so 파일 내 mono_image_open_from_data_with_name심볼을 찾아가면 실제 원본 코드와 달리 복호화하는 코드가 포함된 변조된 함수일 수도 있기때문에 직접 libmono.so를 분석해보는것도 하나의 방법입니다.

실제로 blackmod 사이트에서 배포되는 모드앱을 분석해보면 복호화 코드가 포함된 변조 libmono.so로 교체하여 배포하는것을 확인할 수 있습니다.
이외에도 GOT Overwrite, 인라인후킹등의 방법을 사용하여 mono의 가상머신을 조작하는 경우도 존재하며,
덤프 및 원본 Assembly-CSharp.dll 얻었는데도 불구하고 특정 코드부분이 비어있거나 깨져있는 경우에는 가상화 코드 또는 메소드 교체등의 방법을 사용하고 있는 경우일 확률이 크며, 직접 동적분석을 통해 libmono.so 동작로직을 따라가 보는것을 추천합니다.

89 Comments
S 코드몽키 2019.10.03 14:48  
오늘도 린님의 지식에 무릎을 탁 치고갑니다

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

5 파파엄마 2019.10.03 15:06  
너무 좋은 내용입니다 !!
4 엘라로즈 2019.10.03 15:48  
so 파일은 ida로 분석하는거죠?
26 기억 2019.10.03 16:50  
대단하십니다. 최고십니다!
2 qwer1234 2019.10.03 20:43  
잘보고 갑니다
2 마루야 2019.10.03 22:14  
좋은내용 감사합니다!
4 sodamari 2019.10.04 06:36  
진짜 좋은거 보여주시네요ㅎ
2 폭스 2019.10.04 10:07  
감사합니다!!
1 dl1233 2019.10.04 10:41  
감사합니다 ㅎㅎ
3 배움 2019.10.04 14:48  
이런걸 무료로 가르침 받을 수 있다니..
1 어흥어흥 2019.10.04 18:03  
감동이네요. 열심히 배우고 가겠습니다!
26 세월강태공 2019.10.04 18:46  
감사합니다~~
2 linforum2018 2019.10.04 19:22  
잘 봤습니다 엄청나네요
8 아수라발발이 2019.10.04 20:35  
봐도 모르겠습니다 사실 ㅠㅠ
1 핸강 2019.10.05 21:10  
dnSPy 가 여러모로 좋은 프로그램이긴합니다..
10 항상웃는삐에로 2019.10.05 21:32  
좋은걸 배우고 갑니다.
1 hyc0301 2019.10.07 13:32  
잘 배우고 갑니다.
1 dorsia 2019.10.09 17:59  
so파일은 어떻게 열어야될까요?
3 하이큐 2019.10.09 18:11  
IDA 설치
1 dorsia 2019.10.09 18:40  
감사합니다
3 뾰족 2019.10.16 18:25  
듬성 듬성 알고 있던 것들이 잘 정리가 되네요 ㅎ
1 야마간다 2019.10.16 20:06  
쉬워보이지만 어렵네요 초보한테는 ㅠㅠ
1 풋꼬추 2019.10.21 10:40  
어렵지만 지린다.
2 에스트 2019.11.04 12:37  
ㄹㅇ 다보이네 극혐
2 djucd 2019.11.06 17:12  
로그도 띄울수 있군요
8 아수라발발이 2019.11.08 18:42  
이제야 이글이 이해가 되고있습니다 휴우
어렵고도 어렵지만 더 열심히 해바야겠습니다.
1 수호 2019.11.09 03:52  
감사합니다.
2 CodeMon 2019.11.13 17:28  
천천히 따라해봐야겠네요 ㅎㅎ
7 황조 2019.11.25 11:44  
당장 쓰고싶은 기술인데 배우기는 힘들고
9 단향 2019.11.25 20:38  
오옹.. 재밌게 잘 읽었습니다.
1 많아아 2019.11.25 22:18  
감사합니다.
2 masu 2019.12.03 16:58  
감사합니다.
2 95grit 2019.12.06 23:48  
감사합니다
2 기탄 2019.12.08 00:02  
감사합니다
2 ZEROS 2019.12.10 10:22  
아하~... 감사합니다.
2 빙굴 2019.12.12 07:47  
CSharp.dll 파일이 없는경우는 어떻게하죠?
12 모야모야 2019.12.12 13:01  
와 신세계네요...이렇게 코드를 볼수있다니..
2 songod 2019.12.19 17:09  
감사합니다.
1 rafael 2019.12.28 12:34  
감사합니다

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

2 양갱 2020.01.04 09:41  
좋은 정보 감사합니다!!
S Dhhd 2020.01.04 12:50  
잘봤습니다
28 사딸라 2020.01.07 08:13  
감사합니다.
1 케록 2020.01.08 16:35  
감사합니다!!
13 Rohas 2020.01.09 16:12  
감사합니다!
4 알려주세요오 2020.01.13 05:47  
2cppdumper에서 이 dll 파일로 만들어내려면 컴파일을 어떻게 해야하나요

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

2 맨손81 2020.01.16 15:18  
잘봤습니다
2 낙화유수 2020.02.05 19:38  
우와...진짜 신세계인듯 합니다.
2 samanko 2020.02.16 20:24  
감사합니다
2 Blueblood 2020.02.18 20:34  
와우 이런건 어떻게 공부하신건지 놀랍네요..
3 ch4njun 2020.02.20 16:05  
감사합니다!
2 호랑이쿨광 2020.03.09 06:02  
좋은정보 감사합니다~!

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

7 래바리 2020.04.03 18:51  
감사합니다.
10 총각미남 2020.04.05 19:13  
봐도 모르겠다는 댓글이 공감갔는데 그 밑에 이제야 이해가된다는 댓글보고 희망 가지고 계속 읽어보겠습니다
1 보쿠노나마에와 2020.04.06 02:01  
감사합니다

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

2 skazh 2020.04.12 01:43  
좋은정보 감사합니다.
3 92bulldozer 2020.04.12 14:35  
잘 읽었습니다 감사합니다
1 바람과같이 2020.04.13 00:28  
감사합니다

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

2 rjsejrrjsejr 2020.04.16 05:23  
잘 읽었습니다
1 h2ro 2020.05.16 19:03  
감사합니다 ㅎ
7 임중호 2020.05.24 01:27  
실패했습니다....
1 주황버섯 2020.06.29 11:30  
감사합니다
1 피통왕구키 2020.07.19 00:04  
감사합니다.
4 아방이 2020.07.22 03:54  
ilspy와 dnspy는 취향껏 골라 사용해도 괜찮은건가요?
1 아리송당 2020.07.30 09:43  
감사합니다.
4 쿨록 2020.08.07 18:50  
감사합니다
9 koooo 2020.08.19 16:18  
감사합니다 개념 정리에 많은 도움이 되었습니다~
1 녹아요 2020.09.07 16:23  
이해하는데 얼마나 걸릴지 모르겠지만 열심히 처음부터~
1 유미린 2020.09.18 14:47  
감사합니다~~
2 호랑이쿨광 2020.09.28 01:04  
자료 감사합니다~~
1 crackers2934 2020.10.18 23:04  
열심히 모노게임 분해해보고 있어용~
1 킁컹이 2020.10.26 16:34  
감사합니다 잘볼게요
1 공굴리는공돌이 2020.10.27 16:09  
분해해보고있는데 dnSpy에서 컴파일이 잘 안되네요
1 차르 2020.11.02 11:18  
제가 찾고싶던 자료들이네요. 감사합니다.
2 매코미 2020.11.15 00:18  
감사합니다
1 ekgod 2021.01.13 11:29  
감사합니다~
1 곤뇽 2021.03.07 23:17  
감사합니닫
1 위대한 2021.03.21 13:19  
좋은 정보 감사 드립니다
1 hash 2021.05.09 23:31  
좋은 정보 감사합니다
2 준섭이당 2021.07.05 01:16  
감사합니다
2 트가팔 2021.07.26 03:23  
여기동와드
2 공적1 2021.09.06 03:03  
감사합니다~
1 둘기랑 2021.09.13 21:16  
좋은 정보 감사합니다
2 호랑이쿨광 2022.02.08 22:15  
잘 읽었습니다 감사합니다
1 megadeth 2022.02.10 17:43  
thanks!
1 dnsy01 2022.07.12 23:02  
말이 어렵네요.. 공부좀 더 하고 ..ㅠㅠ
1 빈이 2022.09.24 08:36  
하나씩 잘 배우겠습니다
1 마수수수 2022.12.05 20:11  
감사합니다~
8 Dean 2023.02.07 17:20  
감사합니다
1 마이키 2023.04.12 14:45  
감사합니다 ㅎㅎ