[Unity][AOS] How to Dump Encrypted global-metadata.dat (1/2)

koo00·2022년 7월 13일
0

보안 솔루션이 적용된 게임은 IL2CPPDumper 를 통해 IL2CPP 덤프가 불가능하다.
암호화 또는 난독화된 global-metadata.dat 파일 때문인데, 이번 포스팅에서 간단하게 추출하는 방법에 대해 소개한다.


먼저 일반적인 global-metadata.dat 파일의 처음 4 바이트를 확인해보면 AF 1B B1 FA 인 것을 확인할 수 있는데,
이 4 바이트는 global-metadata.dat 파일의 매직 넘버라고 볼 수 있다.

다음으로 암호화된 global-metadata.dat 파일의 경우 해당 매직 넘버가 보이지 않는다.

이러한 상태에서 IL2CPPDumper 를 사용하면 메타데이터 파일이 유효하지 않다는 에러와 함께 IL2CPP 덤프에 실패한다.

게임이 정상적으로 작동하려면 암호화된 global-metadata.dat 파일을 복호화하는 과정을 거친다.

복호화 과정은 libil2cpp.so 에서 찾을 수 있는데 (자세한 내용은 포스팅 맨 아래의 레퍼런스 참고) 어차피 게임이 켜진 시점에서 메모리에는 정상적인 global-metadata.dat 파일이 로드되어 있을 것이다.

따라서 나는 fridump 를 활용해서 간단하게 추출하려고 한다.


먼저 fridump 를 사용할 수 없는 환경이라면 메모리 덤프 탐지 및 차단 우회를 통해 fridump 를 사용할 수 있어야 한다.

fridump 를 사용할 수 있다고 가정하고, 메모리 덤프를 뜬다.

다음 암호화된 global-metadata.dat 파일과 크기가 가장 비슷한 파일을 확인한다.

그 중 0x7c4404f000_dump.data 파일을 HxD 로 열어보면 64 바이트 뒤에 global-metadata.dat 파일의 매직 넘버를 확인할 수 있다.

해당 파일의 처음 64 바이트를 삭제하고 이름을 global-metadata.dat 로 변경해주면 끝이다.

추출한 메타데이터로 IL2CPPDumper 를 실행시키면 IL2CPP 덤프가 가능하다.


이대로 포스팅을 끝내면 좀 그러니까.. 아주 간단하게 원리만 정리하고 끝내겠다.

il2cppdumper 사이트에서 메타데이터 로드 과정을 보여주고 있다. (자세한 내용은 포스팅 맨 아래의 레퍼런스 참고)

사실 아까 덤프를 통해 추출한 0x7c4404f000_dump.data 파일은 LoadMetadataFile 함수의 Return Value - 0x40 이다.
실제로 LoadMetadataFile 함수의 리턴 값을 찍어보면 0x7c4404f040 이라는 것을 알 수 있다.

원래는 libil2cpp.so 파일의 il2cpp_init 함수를 호출하는 부분을 libunity.so 파일에서 찾아서 어떤 형태로 로드하고 있는지 파악하고 원본 파일의 주소 값을 찾는 게 맞지만 나는 대충 꼼수로 찾아내서 분석 시간(?)을 단축했다고 볼 수 있다.

암튼 진짜 끝.


Reference

https://katyscode.wordpress.com/2021/02/23/il2cpp-finding-obfuscated-global-metadata/
https://il2cppdumper.com/reverse/metadata-loader-code-path
http://linforum.kr/bbs/board.php?bo_table=android&wr_id=1434

profile
JFDI !

4개의 댓글

comment-user-thumbnail
2022년 8월 12일

덤프뜨고 나온 메서드중에 문자열 이상하게 돼있는건 문자열 암호화인건가요?
문자열 암호화는 어떻게 복원는지 아시나요?

1개의 답글
comment-user-thumbnail
2024년 4월 10일

PC로 빌드된 게임은 안되나요?

1개의 답글