린엔진 튜토리얼 - 유니티 IL2CPP 분석

홈 > 린엔진 > 린엔진 게시판
린엔진 게시판

린엔진 관련 게시판입니다.

린엔진 튜토리얼 - 유니티 IL2CPP 분석

M LIN 58 5553 3


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571061501_4229.PNG
 

어떤 앱으로 튜토리얼로 진행 할까 고민하다.. 

apk4all.com 모드앱 사이트에 올라와있는 Roguelike RPG Offline 게임으로 선정하였습니다.

최신 버전의 순정 앱은 아래 링크에서 다운로드 받을 수 있습니다.

https://apkpure.com/roguelike-rpg-offline-order-of-fate/tech.studio3.bestcave


저는 0.0.77 버전으로 분석을 진행하였습니다. 



e13a22df2bef5d9eb7fe9c98a17dc3fd_1571061800_4435.png
 

1. 우선 APK 파일을 압축파일로 열어 il2cpp dumper에 사용될 파일들을 꺼냅니다.

libil2cpp.so 와 global-metadata.dat 를 추출하면 됩니다.

( 참고 : http://linforum.kr/bbs/board.php?bo_table=android&wr_id=4&page=3 ) 

 

e13a22df2bef5d9eb7fe9c98a17dc3fd_1571062113_5808.png
 

2. 추출했다면 최신 버전의 il2cpp dumper 툴을 사용하여 메타데이터 정보등을 추출합니다.

il2cpp.so와 메타데이터 파일을 선택하고 나면 "Input Unity version:" 를 입력하라고 나옵니다.

이때 level0 파일을 열어보면 아래 하단과 같이 버전 정보가 나오게 됩니다.

"2019.1.7" 을 입력 -> 2번(2.Auto) 입력하면 덤프를 하게 됩니다.


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571062316_9722.png
 

3. 덤프에 성공했다면 dump.cs 파일을 열어 핵심 함수들을 찾아봅시다.


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571061564_3791.PNG


4. LD플레이어에 apk를 끌어다가 설치를 하고, 린엔진을 실행시킵니다.

린엔진에서는 패키지명을 tech.studio3.bestcave 로 지정합니다.  

전부 입력하지 않아도 되며, 위와 같이 bestcave 로 지정하여 문자열에 포함만 시키면 됩니다. 


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571062536_558.png 


5. dump.cs에서 봤던 get_Health값의 오프셋값을 복사하고 위와 같이 어드레스 테이블을 등록합니다.

public int get_Health(); // RVA: 0xD3AFE8 Offset: 0xD3AFE8 

"il2cpp+0xD3AFE8" 으로 어드레스에 입력하게 되면, 

il2cpp.so의 Base Address + 0xD3AFE8(오프셋값)을 자동으로 찾을 수 있습니다. 


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571062856_8749.PNG
 

6. 어드레스 테이블을 등록했다면 위 사진 처럼 Address가 실제 주소를 가리키지 않습니다.

Maps List에 넘어가서 Get Maps List를 눌러줍시다.

다시 Memory Scan 탭으로 이동하면 주소가 자동으로 변경되어 실제 주소를 가리키는것을 확인할 수 있습니다.


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571063066_3487.png
 

7. type을 눌러 hex값을 체크해줍시다.


e13a22df2bef5d9eb7fe9c98a17dc3fd_1571063150_875.PNG
 

8. 메모리 뷰어로 열어보면 맨 위에 해당 주소의 opcode를 확인할 수 있습니다.

단순히 r0 에 *(r0 + 0x2c) 값을 할당한 뒤 리턴 해주는것을 확인할 수 있는데요.



e13a22df2bef5d9eb7fe9c98a17dc3fd_1571063251_4942.PNG
 

9. 위와 같이 ARM to Hex Converter를 사용하여 r0에 1234가 담기도록 수정을 해봅시다.

ARM GDB/LLDB에 보면 0xE30004D2 라는 값을 확인할 수 있습니다.

이 값을 복사합시다.



e13a22df2bef5d9eb7fe9c98a17dc3fd_1571063413_0089.PNG
 
10. 다시 치트 테이블로 돌아와서 벨류를 두번 클릭하여 0xE30004D2 으로 변경을 해줍시다.
벨류값을 입력한 뒤 OK를 누르시면 됩니다. 

e13a22df2bef5d9eb7fe9c98a17dc3fd_1571063528_4026.PNG
 
11. 메모리 뷰어로 다시 해당 주소의 opcode를 확인해봅시다. 
r0값에 0x4D2(1234)가 담기는걸 확인할 수 있죠?
실제 게임상에서도 체력이 깍이지 않는것을 확인할 수 있습니다.

이론적인 설명은 제외하고, 바로 린엔진을 사용할 수 있도록 작성하였습니다.

58 Comments
3 뾰족 2019.10.16 16:27  
제가 만든 앱도 테스트 해봐야겠네요. ^^
1 풋꼬추 2019.10.21 13:33  
mov r0 , #1234의 의미가  arm코드 r0 을  #1234로 바꿔줘 라는 뜻인가요?
M LIN 2019.10.21 16:38  
넵 "ARM r0 레지스터에 1234 값을 넣어라"로 보시면 됩니다.
1 풋꼬추 2019.10.21 18:16  
답변 감사드립니다. 그러면 게임에서 체력이 1234로 고정되는건가요?
M LIN 2019.10.21 18:34  
넵 맞습니다ㅎ
1 고룡이 2019.10.24 14:04  
아주 잘활용하고있습니다. ^^
8 아수라발발이 2019.10.27 21:55  
그냥 진행하니깐 린엔진 꺼지는군요 프리다가 필요한 시점이네요 ㅠㅠ
2 제비올 2019.10.27 23:27  
린님 혹시 덤프cs 뭘로 열어보시나요? 저게 dnspy인가요?
3 최삽질 2019.10.29 15:45  
감사합니다~

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

8 아수라발발이 2019.11.03 00:48  
유니티 버전확이중에 level0 이파일이 존재하지않는다면 다른방법으로 유니티버전확인할수있는방법은 없나요?
1 이유 2019.11.17 21:30  
해당 폴더의 아무 파일이나 메모장으로 열어보시면 됩니다
1 뽐뿌 2019.11.18 21:08  
이건 복잡하네여 ㄷㄷ
2 테오시스 2019.11.19 16:45  
천천히 따라해봐야겠네요
4 wjddn 2019.11.25 18:21  
유니티 버전을 입력하니
Warning: Auto mode can't work in versions above 2019
이라는 메시지가 뜨고
auto누르니까 에러 뜨면 서 안되는데 해결방법 있나요?
3 가람 2019.12.12 03:50  
만약 원래 코드가 str r1,[r0, #0x20] 일때
[r0, #0x20]에 원하는 숫자를 저장하라고 하고싶으면 어떻게 해야될까요??
2 이영욱 2019.12.15 12:36  
으아 어렵다 ㅠㅠ
2 우아앙아 2020.01.05 23:00  
공부해야할게 늘었네요 ㅠㅠ
15 사딸라 2020.01.07 09:44  
감사합니다
2 rune 2020.02.15 21:59  
감사합니다
1 Jaedy 2020.02.28 15:36  
어렵습니다 ㅠㅠ
2 린린코린 2020.03.02 14:53  
와 디컴파일 장난아니군요
3 VanDussen 2020.03.04 21:14  
[FieldOffset(Offset = "0x0")] << 이건 어떻게 봐야할까요?
2 개미개미 2020.03.07 01:10  
LD3 버전 말고 최신버전은 안되는건가요?

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

9 지니니 2020.03.13 19:44  
생짜 초보인데 고수가 되고싶네요

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

S Dhhd 2020.03.13 21:20  
공부하세요 그러면 고수입니다
저도한때초보였고
모두가 초보였습니다
1 orrra 2020.03.17 21:07  
감사합니다
2 루미에르 2020.03.20 11:28  
2번과 3번의 차이는 뭘까요?
감사합니다 :)
1 llLin 2020.03.27 20:59  
오우... 역시 쉽지 않네요
1 카지노 2020.04.07 00:56  
감사합니다~
9 총각미남 2020.04.11 19:43  
위에 메소드 보여지는 검은 화면은 즉, cs 파일은 무엇으로 열어서 보는건가요
3 92bulldozer 2020.04.12 16:39  
비주얼스튜디오로 여시면 됩니다 dump.cs 파일은 il2cppdumper 폴더 안에 있습니다.
1 한글 2020.04.25 13:48  
수십차례반복해서 봐야 이해가 되겠군요 정보 감사합니다.
1 derelikt 2020.04.29 20:59  
감사합니다. 데이터베이스가 보호된 경우에는 덤퍼가 에러가 나네요 공부 더해야겠어요
1 오늘도도젼 2020.06.05 10:13  
점점 어려워진다.

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

1 조타 2020.07.16 16:36  
아직 엔진을 다운받지 못해 눈으로만 공부합니다...ㅎㅎ 빨리 해보고 싶네요~
3 marksee 2020.07.21 11:28  
좋은글 감사합니다
1 hyuns 2020.08.11 21:57  
와 엄청나게 간단하게 만들어버린 툴이군요..
1 kain 2020.08.12 19:27  
좋은 글 감사합니다!
1 업복이 2020.08.14 23:01  
정말 대단합니다 ㅎㄷㄷ
1 hmmm 2020.08.24 22:34  
어렵네요..
1 이시작 2020.08.29 23:48  
감사합니다
1 미니 2020.09.01 23:00  
좋은글 감사합니다~
1 tlqktlqk 2020.09.06 18:39  
li2CppDumper 덤프할때 유니티 버전 입력 안해도 혼자 알하서 덤프하는데 잘못된건가요?
1 조온리 2020.09.10 14:09  
공부중.. 감사합니다
3 paxmax2020 2020.09.28 16:00  
강좌 잘봤습니다 덤프하는 과정에서 유니티 버전을 안묻고 그냥 넘어가는 경우도 있는데 상관없나요?
1 애교만땅 2020.10.17 14:07  
다운받아서 실행해보고싶어지네요
2 부들이 2020.10.19 03:29  
엄청 어렵네요 처음이라 ㅠㅠ
1 herial 2020.10.24 17:46  
처음이지만 따라서 도전해봐야겠습니다

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

1 킁컹이 2020.10.25 17:19  
와 대단합니다.. 맨땅에 헤딩으로 시작 해보겠습니다
2 린개굴 2020.11.08 21:53  
감사합니다~
2 매코미 2020.11.16 02:02  
감사합니다
1 Zzhhhgfs 2020.12.26 14:42  
초보지만 열심히 해볼게요
1 콜로서스 2020.12.28 02:59  
천천히 따라해봐야겠네요
1 RAIDME 01.30 13:52  
감사합니다
1 justhave 02.18 22:27  
감사합니다
1 구르미 03.07 21:32  
감사합니다
2 낙화유수 04.06 22:49  
감사합니다 ^^
1 Aabbcc 04.07 23:49  
좋은 정보 고맙습니다