<보안 study>/리버싱

[Unity] global-metadata.dat 추출

gosoeungduk 2023. 10. 2. 02:52
반응형

대 Unity 요금 징수의 시대가 밝았습니다 *_* (요금제 완화되긴함)

https://www.gameple.co.kr/news/articleView.html?idxno=207223 

 

유니티 신규 요금제 '완화' 발표... 여론 여전히 뿔난 이유는 - 게임플

[게임플] 업체들의 반발에 휘말린 유니티가 신규 요금 정책을 완화했다. 하지만 논란의 핵심인 \'기업용 라이선스 런타임 요금제\'는 그대로 추가되어 반발이 이어질 전망이다.유니티 마크 휘튼

www.gameple.co.kr

그럼에도 최근 게임들 까지는 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

 

반응형