난독화된 global-metadata.dat 관련하여 질문이 있습니다.

홈 > 커뮤니티 > 질문 게시판
질문 게시판

난독화된 global-metadata.dat 관련하여 질문이 있습니다.

2 뽀글머리 5 4894
Unity와 IL2CPP로 빌드된 안드로이드 게임을 분석하기 위해 libil2cpp.so와 global-metadata.dat을 apk로부터 가져왔으나,
il2cppdumper 사용 시 올바르지 않은 metadata라는 오류가 발생하여 확인해보니 global-metadata의 헤더가 정상적인 파일과 다른것으로 보아 난독화된 상태로 유추됩니다.

따라서 난독화되지 않은 global-metadata.dat을 얻기 위해 게임가디언을 통해 메모리를 덤프한 후 맵 텍스트에서 검색을 시도했는데, libil2cpp.so는 확인이 가능했으나 global-metadata.dat은 존재하지 않았습니다.

관련 자료를 검색을 해본 결과 il2cpp::vm::MetadataLoader::LoadMetadataFile() 함수를 변경함으로써 난독화된 global-metadata.dat 파일을 읽어들일 수 있도록 하거나 아예 libil2cpp.so 자체에 내장시키는 방법도 있다는 것 같습니다.
초보이기에 자세한 방식은 모르겠지만, 아마 이러한 변경 과정을 통해 난독화된 global-metadata.dat을 불러들인 다음 필요한 작업이 수행된 다음에는 메모리상에서 언로드시키거나 모습(이름)을 바꿔서 숨겨놓는 게 아닐까 생각하고 있습니다.


그러므로 이제 libil2cpp.so의 vm::MetadataLoader::LoadMetadataFile() 함수를 분석을 해야만 난독화 방식이나 메모리상에서 숨기는 방법을 알 수 있을 것이라고 생각합니다만, 이 단계에서 감이 잡히지 않아 고전중입니다.

현재 Ghidra를 사용중이지만, 이러한 바이너리 분석에 대해서 잘 알지는 못하는 편입니다. 경험이라고는 과거 다른 게임들의 바이너리 내 문자열 덤프같은 간단한 작업이나 다른 분들께서 작성해놓은 스크립트를 사용해보았을 뿐입니다.

무턱대고 Ghidra에서 libil2cpp.so를 불러들이고 ARM64 v8a로 analyzing까지 시작은 했는데, 여기서 어떻게 해당 함수를 찾아야할지 잘 모르겠습니다. Analyzing이 끝나지 않은 탓인지, 아니면 심볼 등 정보가 없어서인지 모든 함수들이 FUN_메모리주소 이런식으로만 나타나고 있어 찾지 못하고 있습니다.

여기서 더 나아가려면 어떤 것을 알아야하고 어떻게 찾아야할지 고수님들의 도움을 받아볼 수 있을까 궁금하여 가입하고 글 짤막하게 남겨봅니다.

감사합니다.
5 Comments
M LIN 2020.06.30 14:48  
gdb or ida로 LoadMetadataFile 해당 함수를 찾아서 브레이크 포인트를 걸고 동적 분석으로 따라가 보셔요
2 뽀글머리 2020.06.30 16:04  
안녕하세요, 이런 좋은 커뮤니티가 있는지 오늘에서야 알았습니다. 운영에 대한 감사의 말씀 먼저 드립니다.

취미로 공부하는 단계인지라 IDA Pro를 구매하기는 아직 이른 것 같고, GDB를 사용하기 위한 리눅스 환경에는 익숙하지 않아 Windows 환경에서 Ghidra를 이용해 공부를 진행중입니다.
Ghidra로 libil2cpp.so를 불러온 후 'Auto Analyze' 기능을 사용해보았으나 Symbol Tree 내의 모든 함수가 'FUN_주소' 혹은 이와 유사한 형태로 표시되고 있어 어느 것이 LoadMetadataFile 함수인지 확인할 수 없고, 제대로 진행되고 있는 것인지조차 확신하지 못하겠습니다.

궁금한 점이, 해당 함수들의 심벌은 global-metadata에 포함되지 않고 so 바이너리 내에 포함되어 있는 것인가요?
il2cppdumper를 사용하는 이유가 global-metadata로부터 함수들의 심벌 등 정보를 얻어내고 소스코드로 디컴파일하기 위한 것으로 알고있었는데, 이러한 과정이 없어도 해당 함수들은 함수 명이 그대로 나오는건가요?

초보라서 질문이 다소 횡설수설한 점 사과드립니다
2 뽀글머리 2020.06.30 18:01  
안돌아가는 머리로 조금 더 맨땅 파보았는데, 현재와 같이 심벌이 없는 상태에서 해당 함수를 찾는 것이 핵심인지 싶은데, 맞는가요?

아쉽게도 메이저한 게임은 아니여서 분석 자료는 전무하지만... 다른 Unity 게임들의 경우 참조해보면서 열심히 해보겠습니다
M LIN 2020.06.30 20:07  
아이다는 인터넷에서 쉽게 구하실 수 있습니다.
심볼은 사라져 있는 상태가 정상이며 살아남아 있는 심볼을 따라가는식으로 찾으셔야 합니다. 또한 소스 코드와 비교하시면서 유추해보는 방법으로 해당 함수를 찾으실 수 있습니다.
당연히 global-metadata 파일이 있어야 로드가 가능합니다.
유니티를 직접 설치 후 테스트앱으로 빌드하신다음 직접 분석해보시고 다음 스텝 밟는게 좋을 것 같네요.
2 뽀글머리 2020.06.30 20:37  
안그래도 소스코드를 보면서 대조해보고 있었는데, 이게 맞는 방법인가보군요!
콜스택을 정리해둔 글이 있어 보니 libunity.so에서 libil2cpp.so의 il2cpp_init 함수를 거쳐 여러 함수를 타고 최종적으로 LoadMetadataFile을 호출하는 것으로 확인되어서 IL2CPPOutputProject의 코드와 Ghidra에서 Decompile된 코드를 대조해보는 중이었습니다.

디컴파일된 결과물을 보니 실제 소스코드하고 모양이 유사하고, 넘어가는 패러미터의 수나 형태로 코드의 어떤 부분인지 유추도 가능해서 LoadMetadataFile 함수를 찾는건 어렵지 않을 것 같습니다.

이제 문제는 LoadMetadataFile를 분석해서 해독 기법을 찾아내는것이니, 열심히 또 땅 파봐야겠습니다. 말씀해주신 내용대로 테스트 앱 빌드해서 Ghidra로 불러오고 대조해보며 차이점 찾아보는 것도 좋은 방법일 것 같군요. 감사합니다!