대 Unity 요금 징수의 시대가 밝았습니다 *_* (요금제 완화되긴함)
https://www.gameple.co.kr/news/articleView.html?idxno=207223
그럼에도 최근 게임들 까지는 unity 엔진 기반이 많은 것 같아서, 어떻게 운용되고 있는지 가볍게 분석해보았다.
그 과정에서 global-metadata 파일을 사용하려 하였는데, 아무래도 구 unity 게임들과는 다르게 암호화가 걸려있어서 원본을 추출할 필요가 있었다.
그래서 메타데이터가 평문으로 메모리에 로드되는 시점에 덤프를 확보하는 방법을 간략히 정리해본다.
게임 바이너리의 심볼을 담고있는 global-metadata.dat 은 보통 게임이 설치된 디렉토리에 평문으로 존재하고, 이를 이용해서 심볼을 복구하는 방법이 일반적이다.
그리고 AF 1B B1 FA 로 시작하는 시그니처가 평문의 global-metadata.dat 파일임을 증명해준다.
최근 분석해본 게임의 해당 파일은 시그니처가 아래처럼 존재하였고, 암호화 된 것으로 추정해볼 수 있다.
그러나 결국, 게임의 핵심 내용이 포함된 il2cpp 는 global-metadata.dat 을 활용해서 게임을 실행할 수 밖에 없고, 이 과정에서 해당 암호화를 해제하고 평문의 global-metadata.dat 파일을 메모리에 올릴 것이 분명하기에 그 점을 노리면 암호화라는 벽도 파훼가능하다.
# il2cpp 실행의 흐름
il2cpp 는 보통 아래와 같은 il2cpp_init 함수를 시작으로 게임실행 준비를 시작한다.
il2cpp_init
-> il2cpp::vm::Runtime::Init
-> il2cpp::vm::MetadataCache::Initialize
-> il2cpp::vm::MetadataLoader::LoadMetadataFile
그리고 메타데이터를 로드하기 까지 위와 같은 함수 흐름을 이어나간다.
다만, il2cpp_init 을 제외한 나머지 함수들은 심볼이 없기 때문에 적절한 근거와 함께 찾아나가야한다.
보통은 global-metadata.dat 이라는 파일명이 단서가 되어 크로스 레퍼런스로 LoadMetadataFile 을 추적할 수 있다. 그 결과가 아래이며, sub_372BB8 이 LoadMetadataFile 함수가 되는 것이다.
그러나, https://il2cppdumper.com/reverse/no-global-metadata-dat-file 에서와 같이 LoadMetadataFile 에 파일명을 동적으로 받아오는 경우도 있고, 파일명이 온전히 global-metadata.dat 이 아닌 경우도 있어서 맹신해선 안된다. (이런 경우는 순차적으로 코드 내려가면서 봐야할 듯?)
아무튼 LoadMetadataFile 이 끝나고 리턴 되는 값은 메모리에 온전히 로드된 global-metadata.dat 의 메모리 주소이다.
그러면, 해당 함수가 끝나는 시점에 리턴 되는 포인터만 갖고와서 덤프 뜨면 된다.
아래는 실제 디버깅 걸고, 추적해본 모습이다.
ARM64 환경이라서 상위 주소에 PAC 바이트가 있으나, 별로 중요치는 않고 잘 따라가면 바로 평문의 global-metadata.dat 시그니처가 보인다.
사실 덤프 뜨는 과정이 주요한 내용이긴한데, 해당 메모리를 추적하기 위해 디버깅 탐지 우회하는 과정이 생각보다 장애물이 되어서 오래걸렸다... 덕분에 상용 모바일 안티치트의 존재도 확인하고 좋은 경험이었던 것 같다. (한국산 모바일 안티치트라니)
# 출처
(1) https://il2cppdumper.com/reverse/metadata-loader-code-path
(2) https://www.bilibili.com/read/cv25143217/
(3) https://cloud.tencent.com/developer/article/2216959
'<보안 study> > 리버싱' 카테고리의 다른 글
Android Mod Development #2 : JAVA Heap self editing (0) | 2024.04.08 |
---|---|
Android Mod Development #1 : Mod-Overlay Inject (2) | 2024.04.08 |
Galaxy S20(SM-G981N) 루팅 (5) | 2023.09.02 |
[UE4] FNamePool 위치 식별 (3) | 2023.05.23 |
MFC 프레임워크 기반 앱 시작지점 (0) | 2023.01.06 |