린엔진으로 global-meatadata.dat 복구하는법
IL2CPP로 빌드된 유니티 게임을 분석할 때는 보통 IL2CPPDUMPER를 이용해서 심볼을 복구한 후에 분석을 진행합니다.
IL2CPPDUMPER는 libil2cpp.so와 global-metadata.dat를 입력으로 받아서 심볼 정보를 복구해주는 툴입니다.
근데 요즘 global-metadata.dat에 몇가지 조치를 취해서 il2cppdumper에서 읽을 수 없도록 만드는 경우가 있습니다.
이런 경우에는 게임이 실행되고 global-metadata.dat를 메모리에 로드할 때 파일을 원상태로 복구하고 로드하게 됩니다.
그래서 게임이 정상적으로 실행된 상태인 경우에는 메모리에 조치가 취해지기 전의 "유효한" global-metadata.dat가 존재하게 됩니다.
따라서 메모리의 해당 부분을 덤프하여 이러한 조치를 우회할 수 있습니다.
먼저 IL2CPP로 빌드된 궁수의 전설이라는 게임을 린엔진을 통해 Attach한 상태입니다.
여기서 Get Maps List를 누르면,
해당 프로세스의 메모리 Map이 출력됩니다.
이 상태에서 ctrl + F를 통해 string 검색을 할 수 있습니다.
여기서 global-metadata.dat를 검색해줍니다.
이는 global-meatadata.dat를 로드할 때 이름을 그대로 사용하기 때문에 가능한 건데, 이름을 지우거나 다른 string으로 바꾸는 경우는 아직까지 본 적이 없습니다.
이렇게 global-metadata.dat의 주소가 나오게 됩니다.
0x9a9ec000 - 0x9b400000에 로드되어 있는 것을 확인할 수 있습니다.
이제 Get Maps List옆에 있는 Memory Dump버튼을 통해 메모리의 해당부분을 덤프할 수 있는데,
시작주소와 크기가 필요합니다.
시작주소는 보시다시피 0x9a9ec000이고 크기는
0xa14000 = 10567680 입니다.
시작 주소를 입력하고,
완료되면, 린엔진 폴더의 dumpDir이라는 폴더안에
이렇게 파일이 생성된 걸 볼 수 있습니다.
해당 파일을 헥스 에디터로 열어봤을 때,
이렇게 맨 앞부분 4바이트가 AF 1B B1 FA이면 정상적인 global-metadata.dat가 복구된 것입니다.
정말 많은 분들이 이부분에 대해서 질문해주셔서 일단 린엔진으로 복구하는 법을 알려드렸고,
해당 기능의 자동화 툴도 조만간 만들어서 올리겠습니당.