린엔진 튜토리얼 - IL2CPP 분석

홈 > 안드로이드 > 안드로이드 > 강좌
안드로이드

린엔진 튜토리얼 - IL2CPP 분석

M LIN 155 21419 16


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 파일을 열어 핵심 함수들을 찾아봅시다.
저는 sublime text 3을 사용하여 파일을 열었습니다.

찾다보니 수상한 클래스가 보입니다. 캐릭터의 능력치를 담당하는 클래스로 보이니 수정해봐야겠죠?

린엔진으로 Characteristics 클래스의 메소드들을 변조를 해봅시다. 


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(오프셋값)을 자동으로 찾을 수 있습니다. 

( p(주소)로 포인터 값을 가져올수도 있습니다. )


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 라는 값을 확인할 수 있습니다.

이 값을 복사합니다.

( 주소 : http://armconverter.com/ )



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

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

이론적인 설명은 제외하고, 바로 린엔진을 사용할 수 있도록 작성하였습니다.
직접 다운로드 받아서 분석해보기를 추천드립니다.

155 Comments
2 하롱쥐 2019.10.14 23:52  
정성에 찬사를 보냅니다
30 vk2v 2019.10.15 00:08  
감사합니다~
2 charlie 2019.10.15 00:17  
감사합니다~! ^^
S 코드몽키 2019.10.15 05:45  
엄청난 정성글! 감사합니다

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

13 백형이 2019.10.15 09:17  
공식 메뉴얼 1탄이 되겠네요 ㅎ
S 붉은상어 2019.10.15 09:43  
좋은 정보 감사합니다.
3 아토 2019.10.15 11:35  
초보자들에게 큰 도움이 될거에요 ㅎ
6 하늘사자 2019.10.15 11:37  
좋은 정보 감사합니다.
3 라피스넷 2019.10.15 15:44  
보기 쉽게 설명해주셔서 내용이 잘 전달되네요
감사합니다
5 김치가조아 2019.10.15 16:24  
와우.. 감사해요. 근대 다운로드 권한이 없으니;;;
8 아수라발발이 2019.10.15 20:07  
드디어 공부할때가 왔군요 ㅠㅠ
26 세월강태공 2019.10.15 20:53  
와우~~멋져요~~
3 마비 2019.10.16 05:40  
내용을 쉽게 풀어 설명해주셔서 감사합니다.
2 주묵 2019.10.16 12:07  
감샇바니다
3 배트보노 2019.10.16 18:27  
대단하십니다
1 야마간다 2019.10.16 20:04  
쉬워보이지만 어렵네요 초보한테는 ㅠㅠ
5 파파엄마 2019.10.16 20:42  
우와 아주 좋아요 ㅋㅋㅋ 이런 실전 듀토리얼이 좋쵸
1 김장운 2019.10.17 17:00  
좋은 설명 감사합니다

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

2 Poie 2019.10.18 02:43  
설명 감사합니다
7 쿠리얀 2019.10.18 17:43  
잘보고갑니다 감사합니다~

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

1 국damk 2019.10.19 00:26  
쉬운 설명 감사합니다~!
1 검을현바람풍 2019.10.19 00:31  
덤퍼가 작동하지 않네요. 이제 다음 공정을 공부할 차례입니다. 차근차근 한걸음씩 배워가겠습니다. 좋은 정보 감사합니다^^
1 풋꼬추 2019.10.21 10:26  
감사합니다
1 rok795 2019.10.21 12:07  
좋은 정보 감사합니다.
1 drockefeler007 2019.10.22 22:08  
공식 메뉴얼 1탄이 되겠네요 ㅎ
3 최삽질 2019.10.29 15:21  
엄청나네요 린님!
5 다뚫어 2019.10.29 16:18  
좋은정보감사합니다
2 지나가는공돌이 2019.11.04 14:10  
한번 사용해봐야되네요 감사합니다~~~!
1 2022 2019.11.08 04:13  
좋은 정보 감사합니다
1 정배다 2019.11.09 03:11  
도움이 많이 됐습니다.
2 홈런볼 2019.11.11 10:50  
대박이네요..헐 찬사보내드립니다
아직 초보라서 많이 공부햐야 하는데 린엔진
너무 강력하네요
2 벌레 2019.11.18 17:58  
좋은설명감사합니다!
1 고수님들감사용 2019.11.20 02:21  
강력한 툴인데 아직 제가 많이 부족한것같아요 ! 많이 배우고 있습니당.
1 연화언니 2019.11.20 17:18  
글만 보면 엄청 간단하네요!
5 wjddn 2019.11.25 22:16  
Listen 누르고 프로세스가 안잡혀요
어떻게 하나요
1 많아아 2019.11.25 22:20  
근데 어렵네용..
8 디컴 2019.12.04 22:56  
dump cs를 어떤 프로그램으로 열면 될까요? 아이다?
2 nicker 2019.12.05 03:36  
notepad++
3 가람 2019.12.08 02:28  
와 IL2CPP 모딩방법 잘 배우고갑니다!
1 dkssud12 2019.12.08 20:22  
신기하네요 잘 보고 갑니다

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

1 zmfhsh 2019.12.10 17:30  
오호...자료 좋네요.
7 Kizae 2019.12.10 21:45  
오 좋은 정보네여
3 dlsrks12 2019.12.11 22:02  
잘 보고 갑니다
2 빙굴 2019.12.12 08:20  
감사합니다 공부하는데 많은 도움이될것같아요

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

2 이영욱 2019.12.15 12:31  
감사합니다아
1 치트로린 2019.12.16 23:31  
오,,,,, 도움 많이 되었습니다
4 김흑화 2019.12.19 14:17  
엄청어렵네요..
3 초코몽 2019.12.24 04:09  
덤핑에서 막히네요...ㅎㅎ
2 코몽님추종자 2019.12.25 20:37  
와와..ㄷㄷㄷ
2 05630563k 2019.12.27 03:37  
린 엔진으로 게임 실행중 직접 수정하는건가요?
2 해키 2019.12.27 21:44  
후욱 후욱 조아
1 rafael 2019.12.28 12:43  
감사합니다
1 rafael 2019.12.28 12:44  
감사합니다
2 데스깃 2019.12.29 05:26  
감사합니다.
2 데스깃 2019.12.29 05:30  
libil2cpp.so를 열어보았는데 Serialize가 되어있다고 하네요. 이럴 경우 어디서부터 거슬러 올라가야할지 막막합니다.
2 어이가차 2020.01.02 00:08  
꼭 LD플레이로 해야되나요?
2 qmdtls 2020.01.05 23:48  
dump.cs는 어떻게 열어볼수 있나요?
1 ab1313 2020.01.06 09:49  
감사합니다
28 사딸라 2020.01.07 08:19  
좋은자료 감사합니다
1 update365 2020.01.09 21:42  
공식 메뉴얼 1탄이 되겠네요 ㅎ
3 OwNeD 2020.01.09 22:21  
와 제가 처음에 부딪혔던 내용들도 다 포함되어있군요 ㄷㄷ.. 작성된 글을 다 읽어봐야겠습니다!
1 셀레모스 2020.01.09 22:43  
좋은 글 감사합니다
1 토요일 2020.01.14 14:00  
그렇군요 감사합니다
2 Data85 2020.01.14 14:26  
오...감사합니다! 시도해봐야겠네요!
5 Bugday 2020.02.03 11:52  
좋은 자료 감사합니다!
1 족발당수 2020.02.05 12:09  
감사합니다
3 청륜 2020.02.21 21:28  
오.. 감사합니다!
4 포포 2020.02.25 11:35  
감사합니다 오늘 시도해봐야겠군요 ㅎㅎ
7 치도리 2020.02.27 04:12  
배워갑니다 ㅎㅎ
1 djc24 2020.03.06 16:03  
도움 많이 되네요
1 코코볼 2020.03.19 00:49  
배워갑니다 !
2 링딩돔 2020.04.02 16:43  
어렵네요 ㅠㅠㅠㅠㅠ
7 래바리 2020.04.03 18:41  
감사합니다.
2 작녹 2020.04.11 00:28  
LD플레이어 필수인가요?
10 총각미남 2020.04.15 19:50  
덤프하고나서  dump.cs 파일을 여는데 저런 메소드같은 화면은 어떻게 보나요 dnspy로 열어도 저렇게는 안보이는데
2 유키 2020.05.27 14:07  
메모장 ㄱㄱ
2 rjsejrrjsejr 2020.04.16 05:27  
배워갑니다~
1 볶자 2020.04.28 00:36  
감사합니다 !
3 zzs412412 2020.05.08 20:45  
배워갑니다
8 성실한시민 2020.05.17 00:15  
정독한번싹 했네요 감사합니다!
1 stuw 2020.05.19 17:16  
감사합니다!!
1 Haul 2020.05.23 15:08  
설명 되게 알기쉽네요 감사합니다!
2 공부짱짱 2020.05.23 21:55  
볼때 마다 신기합니다!!
1 핵리니 2020.05.27 12:14  
엄청나네요 ㅠㅠ
1 TwinTora 2020.05.29 13:41  
오 감사합니다ㅎㅎㅎ
1 133144255 2020.05.30 16:04  
감사합니다. 고생하셨습니다.
1 moomoo 2020.06.09 10:56  
알려주셔서 감사합니다. 잘 배우고 갑니다.

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

2 킹엔진 2020.06.10 20:16  
꼭 LD로만 해야하나요? 녹스는 안되는지요?ㅠㅠ

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

12 모야모야 2020.06.11 09:46  
넵 녹스 안됩니다!
2 pwnable 2020.06.11 15:55  
신기합니다.
1 수바아악 2020.07.06 13:56  
ARM64 에도 똑같이 적용되는 건가요? 잘 배우고 감니다
2 간식마렵다 2020.07.18 12:46  
감사합니다
2 너랑안놀아 2020.07.19 15:58  
설명 정말 이해하기쉽게 잘해놨네요 도움 감사합니다
4 아방이 2020.07.22 07:28  
실습 꼭 한번 해봐야겠어요! 잘배우고가요
1 아리송당 2020.07.30 09:45  
감사합니다.
1 IGRUS 2020.08.01 13:20  
감사합니다~
1 누로도로 2020.08.06 08:32  
ㅎㅎ 함 해보겠습니다 감사해영
1 권도 2020.08.07 14:31  
따라하기도 쉽지않네요 ㅠㅠ
4 쿨록 2020.08.07 18:53  
정독합니다
3 oculus 2020.08.12 15:49  
정말 필요한 내용만 잘 정리해주셨네요. 막연하게 느껴졌는데 한번 따라하고 나니 자신감이 생겼습니다! 감사합니다  ^^
1 린보간 2020.09.03 16:31  
감사합니다! 따라해보니 잘됩니다
1 적토마 2020.09.03 16:52  
잘 배우고 갑니다.
1 조온리 2020.09.09 20:58  
감사합니다
2 로봇입니다 2020.09.10 19:42  
감사합니다.
2 붉은앙마 2020.09.13 07:34  
알기쉬운 설명 감사합니다.
2 호랑이쿨광 2020.09.28 01:05  
잘 배우고 갑니다~~
2 jeniffer 2020.10.15 17:39  
잘 설명해주셔서 따라하기 쉬워요. 감사합니다.

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

1 차르 2020.11.02 11:20  
잘배우고 갑니다. 정말 감사합니다.
1 ChicChoc 2020.11.13 18:04  
감사합니다
2 해커꿈나무 2020.11.13 22:57  
자세한 설명 감사합니다
1 뉴비늦깍기 2020.11.17 17:53  
오오오 친절하시네용  가이드가 따로없네여
예전 프리썹 엔진쓰던기억이 새록새록납니다 ㅎㅎ
1 tjdrud1131 2020.11.24 00:26  
잘 알고 갑니다 감사합니다
1 NatBad 2020.12.28 15:17  
정성에 너무 감사합니다 ㅎㅎ
1 덕진동고라니 2021.01.07 17:49  
감사합니다
3 luke 2021.01.09 20:33  
감사합니다

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

1 drei6 2021.02.09 05:30  
감사합니다
1 shikite 2021.02.12 12:07  
thanks you so much, this is help me
1 후후훔 2021.03.01 16:04  
설명 고맙습니다
1 응애 2021.03.05 15:25  
고맙습니다
1 둥딩 2021.03.06 20:29  
와 설명 감사합니다. 어려워 보이네영 ㄷㄷ
1 새우까앙 2021.04.01 02:06  
감사합니다
1 유리바다 2021.04.01 02:32  
감사합니다.
1 Kimless 2021.04.10 22:26  
감사합니다
1 동창회 2021.05.01 21:22  
감사합니다
1 Ri2orjd8 2021.05.13 18:42  
정말 감사합니다
4 뭐가맞을까 2021.06.04 02:47  
레전드입니다 정말 감사합니다 시작은 미미하지만 끝은 창대하리라
3 항해 2021.06.07 14:57  
따라하는거도 버겁군요 뭐가 뭔지...
1 dowhatuwannado 2021.06.14 06:51  
감사합니다
1 꼬꼬돌이 2021.07.07 16:13  
설명 감사합니다!
1 cokass 2021.07.23 12:52  
감사합니다
1 피곤한운명 2021.08.10 23:13  
잘보고갑니다
1 돌돌이 2021.08.13 02:52  
초보한테 보기 딱 좋네여 감사합니다
2 1088 2021.08.17 10:25  
감사합니다
2 공적1 2021.09.06 03:04  
감사합니다~
4 캐쳡 2021.09.14 14:15  
쉽게 설명해주셔서 감사합니다~
1 Aria 2021.10.02 15:37  
잘 사용하겠습니다
1 ehlek 2021.10.02 22:21  
감사합니다
1 원신이 2021.11.14 16:43  
감사합니다 ^^
1 dkdk23 2021.12.12 17:41  
감사합니다
1 초핵임 2021.12.16 11:45  
감사합니다! 유익한 정보네요

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

1 킹현진 2021.12.21 23:57  
유익한 정보 감사합니다
1 피곤에찌든고양이 2022.03.16 15:44  
감사합니다
1 chraks 2022.03.28 02:22  
너무 어렵네요
1 0xdc00 2022.04.04 22:11  
감사합니다
1 꾸꾸까까 2022.05.08 18:20  
감사합니다
1 dfsdfsdf 2022.05.20 02:21  
와 필요한 정보였는데 감사합니다
1 fls195 2022.08.03 11:13  
어태치과정중 어플실행 단계에서 어플이 종료된다고 뜨는데 어떻게 해결하나요
1 과자 2022.10.13 18:01  
감사합니다
1 아가토 2022.12.05 00:19  
간단하면서도, 때론 어렵게 느껴지네요
8 Dean 2023.02.02 17:24  
감사합니다.
1 01234 2023.02.18 03:03  
감사합니다
1 01234 2023.02.18 03:03  
감사합니다

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

1 Goodri 2023.02.24 08:54  
좋은 정보 감사합니다.
1 아니도시 2023.03.22 15:20  
Hxd로 수정을 굳이 안 해도 되겠네요 감사합니다
1 불량벌레 2023.08.17 17:08  
정보 감사합니다.