유니티 게임 코드 찾기

홈 > IOS > IOS
IOS

유니티 게임 코드 찾기

S 붉은상어 22 13243 2

3번 강좌에서 VPN 일반 앱을 복호화하여 코드를 찾는 것을 확인하였습니다.

그렇다면 게임코드는 어떻게 찾아야 될까요?

코코스나 언리얼의 경우 히든 함수가 아닐 경우 심볼이 그대로 보입니다.

하지만 iOS 유니티의 경우 il2cpp로 빌드하므로 심볼 정보를 메타데이터에 저장을 하며 

안드로이드에 린님이 il2cpp dumper를 소개시켜주셨을 겁니다.


이제부터 iOS에서 유니티 게임 코드를 찾는 방법을 알려드리겠습니다.

사전에 아래 3개의 파일이 필요합니다.


1. il2cppdumer

https://github.com/Perfare/Il2CppDumper/releases << 여기에서 다운로드 받으시면 됩니다.


2. 복호화된 게임 앱 파일

3번 강좌에서 처럼 게임 앱을 복호화를 합니다.

c26fdc683180bf4153bdb63bdefcc685_1570698807_1236.PNG
 


3. 유니티 메타데이터를 가져옵니다.

메타데이터(global-metadata.dat)는 /var/containers/Bundle/Application/(bundle id)/(app name)/Data/Managed/Metadata 경로에 있습니다.

 c26fdc683180bf4153bdb63bdefcc685_1570698795_5557.PNG 


복호화된 앱과 메타데이터가 확보되면 il2cppdumper를 사용합니다.

c26fdc683180bf4153bdb63bdefcc685_1570693428_3579.PNG
첫번째는 복호화된 파일 선택합니다.

두번째는 메타데이터(global-metadata.dat) 파일을 선택합니다.

그리고 유니티 버전을 지정을 합니다.

c26fdc683180bf4153bdb63bdefcc685_1570693498_6907.PNG
 

여기서 유니티 버전을 모르실 수 있습니다.

메타데이터를 hex 에디터로 열어보면 0x4에 메타데이터 버전이 나와있습니다.

해당 값으로 유니티 버전이 확인 가능합니다.

c26fdc683180bf4153bdb63bdefcc685_1570693658_0196.PNG
 

그런데 .. 여기서 ... 저 0x18 값으로 유니티 버전을 확인하기 어렵습니다.

그럴경우  /var/containers/Bundle/Application/(bundle id)/(app name)/Data 경로에 level0 파일을 hex 에디터로 보면 유니티 버전이 나와있습니다.

c26fdc683180bf4153bdb63bdefcc685_1570693803_7313.PNG
 

일단 iOS에서는 il2cppdmper 사용시 2.Auto 모드를 사용합니다.

Dumping 작업이 완료되면 il2cppdumper 경로에 dump.cs 파일이 생성됩니다.

dump.cs 파일을 열어보면 아래와 같이 게임 코드를 확인할 수 있습니다.

c26fdc683180bf4153bdb63bdefcc685_1570694022_3548.PNG
 

예시로 CheckSignatrue 함수를 보겠습니다.

CheckSignature 함수의 위치는 0x1024B1F7C 입니다.

복호화된 앱을 IDA로 열고 0x1024B1F7C로 jump해보면 CheckSignatrue 코드를 확인할 수 있습니다.

c26fdc683180bf4153bdb63bdefcc685_1570694547_2244.PNG
게임 코드를 찾는것은 이게 끝입니다.

22 Comments
6 지존 2019.10.10 17:49  
Il2cpp방식의 바이너리를 처음 분석해보는 사람들한테 유익한 자료겠네요
추천박고 갑니다!
M LIN 2019.10.10 17:55  
좋은 글 감사합니다. (__)
S 코드몽키 2019.10.10 18:51  
문제는 저 마지막 스샷을 헥스레이를 봐도 이해가 ; 저걸 이해할수있는 자료는 어디서 찾아야할지.. 저는 그냥 ARM 코드를 보고 수정하라면 어찌어찌 하겠는데 저걸보면 머릿속이 카오스가 되더라구요
S 붉은상어 2019.10.10 19:01  
그래서 대부분의 해커들도 아마 저렇게 긴 코드를 수정하지는 않을거에요 ㅋ
8 리피트싯 2019.10.11 14:17  
v =펑션안에서 사용되는 인자
a= 외부 인자에서 가져온 포인터 또는 값 (오브젝트의 경우 인자값이 자동으로 하나더추가됨)
v뒤의 주석 = 펑션또는 클래스 내부에서사용되는 오프셋
_  이동되는 고정펑션 오프셋 또는 고정 인자값 (주로 static singleton)
2 레토스 2019.10.10 19:59  
좋은 글 감사합니다 ㅎㅎ
5 파파엄마 2019.10.13 08:34  
좋은 글입니다~ iOS 유니티 관련 글은 국내에선 찾기 힘든데, 쵝옵니다!
7 쿠리얀 2019.10.19 06:26  
유니티 버젼을 알아보려고 하는데 메타데이터를 hex로 바꿀때 뭘써야될까요?
S 붉은상어 2019.10.22 08:02  
https://mh-nexus.de/en/hxd/
대부분이 hxd를 사용합니다.
5 김치가조아 2019.10.22 12:33  
예시로 CheckSignatrue 함수를 보겠습니다.
CheckSignature 함수의 위치는 0x1024B1F7C 입니다.
복호화된 앱을 IDA로 열고 0x1024B1F7C로 jump해보면 CheckSignatrue 코드를 확인할 수 있습니다.
----------------------------------------------------------------
초보인대 안드로이드에서 그대로 했더니 ida에서 주소가 없다고 나오네요. ida에서 설정을 해줘야 하나요?
아니면 ios와 안드로이드가 달라서 안되는 것인가요?
S 붉은상어 2019.10.23 12:09  
혹시 어떠한 앱으로 하셨나요?
다른 앱에는 CheckSignature 함수가 없을 수 있습니다.
일단 지금 김치님이 분석하시는 앱에서  il2cppdumper를 이용해서 dump.cs 파일 내부에 어떠한 함수가 있는지 확인을 하셨나요?
S 코드몽키 2019.12.10 18:04  
단순히 그 게임이 어떤 버전의 유니티로 빌드되었는지 알아보고자 하신다면 해당 APK 의

\assets\bin\Data\  경로에 globalgamemanagers.assets 이라는 파일이 있을겁니다 그 파일을 메모장으로 열어 확인해보시면 최상단에 유니티 버전이 몇으로 빌드되어있는지 스트링으로 노출되어있습니다
1 혼또니 2019.12.25 14:38  
와~ 감사합니다!
28 사딸라 2020.01.08 23:48  
와우 감사합니다
3 eiruty 2020.01.17 14:23  
감사합니다
9 탱바 2020.03.12 22:07  
잘 봤습니다 유익하네요 ㅎㅎ
2 빵야빵야 2020.03.30 23:20  
일단 좌표를 남기겠습니다.
7 임중호 2020.05.24 00:43  
감사합니데이
4 쿨록 2020.08.09 17:11  
와드박고 다시 볼게요!
1 goodBeer 2020.09.23 17:35  
감사합니다 ㅋㅋ
1 kimmalguk 2021.01.15 15:09  
감사합니다 잘봤습니당
1 ooooo 2021.06.26 15:34  
감사합니다