보안 솔루션이 적용된 게임은
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
덤프뜨고 나온 메서드중에 문자열 이상하게 돼있는건 문자열 암호화인건가요?
문자열 암호화는 어떻게 복원는지 아시나요?