린엔진 튜토리얼 - 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 파일을 열어 핵심 함수들을 찾아봅시다.
저는 sublime text 3을 사용하여 파일을 열었습니다.
찾다보니 수상한 클래스가 보입니다. 캐릭터의 능력치를 담당하는 클래스로 보이니 수정해봐야겠죠?
린엔진으로 Characteristics 클래스의 메소드들을 변조를 해봅시다.
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(오프셋값)을 자동으로 찾을 수 있습니다.
( p(주소)로 포인터 값을 가져올수도 있습니다. )
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 라는 값을 확인할 수 있습니다.
이 값을 복사합니다.
( 주소 : http://armconverter.com/ )