린엔진 튜토리얼 - 유니티 IL2CPP 분석
어떤 앱으로 튜토리얼로 진행 할까 고민하다..
apk4all.com 모드앱 사이트에 올라와있는 Roguelike RPG Offline 게임으로 선정하였습니다.
최신 버전의 순정 앱은 아래 링크에서 다운로드 받을 수 있습니다.
- https://apkpure.com/roguelike-rpg-offline-order-of-fate/tech.studio3.bestcave
저는 0.0.77 버전으로 분석을 진행하였습니다.
1. 우선 APK 파일을 압축파일로 열어 il2cpp dumper에 사용될 파일들을 꺼냅니다.
libil2cpp.so 와 global-metadata.dat 를 추출하면 됩니다.
( 참고 : http://linforum.kr/bbs/board.php?bo_table=android&wr_id=4&page=3 )
2. 추출했다면 최신 버전의 il2cpp dumper 툴을 사용하여 메타데이터 정보등을 추출합니다.
il2cpp.so와 메타데이터 파일을 선택하고 나면 "Input Unity version:" 를 입력하라고 나옵니다.
이때 level0 파일을 열어보면 아래 하단과 같이 버전 정보가 나오게 됩니다.
"2019.1.7" 을 입력 -> 2번(2.Auto) 입력하면 덤프를 하게 됩니다.
3. 덤프에 성공했다면 dump.cs 파일을 열어 핵심 함수들을 찾아봅시다.
4. LD플레이어에 apk를 끌어다가 설치를 하고, 린엔진을 실행시킵니다.
린엔진에서는 패키지명을 tech.studio3.bestcave 로 지정합니다.
전부 입력하지 않아도 되며, 위와 같이 bestcave 로 지정하여 문자열에 포함만 시키면 됩니다.
5. dump.cs에서 봤던 get_Health값의 오프셋값을 복사하고 위와 같이 어드레스 테이블을 등록합니다.
public int get_Health(); // RVA: 0xD3AFE8 Offset: 0xD3AFE8
"il2cpp+0xD3AFE8" 으로 어드레스에 입력하게 되면,
il2cpp.so의 Base Address + 0xD3AFE8(오프셋값)을 자동으로 찾을 수 있습니다.
6. 어드레스 테이블을 등록했다면 위 사진 처럼 Address가 실제 주소를 가리키지 않습니다.
Maps List에 넘어가서 Get Maps List를 눌러줍시다.
다시 Memory Scan 탭으로 이동하면 주소가 자동으로 변경되어 실제 주소를 가리키는것을 확인할 수 있습니다.
7. type을 눌러 hex값을 체크해줍시다.
8. 메모리 뷰어로 열어보면 맨 위에 해당 주소의 opcode를 확인할 수 있습니다.
단순히 r0 에 *(r0 + 0x2c) 값을 할당한 뒤 리턴 해주는것을 확인할 수 있는데요.
9. 위와 같이 ARM to Hex Converter를 사용하여 r0에 1234가 담기도록 수정을 해봅시다.
ARM GDB/LLDB에 보면 0xE30004D2 라는 값을 확인할 수 있습니다.
이 값을 복사합시다.