본문 바로가기

카테고리 없음

Il2cpp metadata 분석방지에 대하여 [ 분석 ]

이번에 어떤 유니티게임(il2cpp)을 분석하려다가, 신박한 분석방지가 걸려있는거같아 분석도 해볼겸 글을 작성합니다.



메타데이터가 괴상하게 나눠져있는 모습이에요
linengine을 활용하여 maps를 봐도 메모리엔 metadata에 관한 내용이 보이지 않더라고요?

그래서 우선 메타데이터가 로드되는 il2cpp_init 함수를 뒤져봤어요.


MetadataCache::Init함수가 호출되고 0이 아닌값을 리턴했을때
DEFAULT TYPES를 받아오는것같아요

제 추측에 의하면, Initialize가 실패하고 0을 리턴했다면, 앱이 실행조차 되지 않는거같아요

그래서 Initialize 함수를 분석해봤어요.

Initialize 함수의 일부분이에요 sub_3AE21C의 리턴값을 받아오는것에 실패했다면 0을 리턴해주는거같아요
sub_3AE21C로 계속 들어가봤어요

벌써 수상한 키워드가 보이기 시작하네요. sub_3ADFFC를 v0에 담고 v0을 리턴하고있으니,
sub_3ADFFC를 분석하면 되겠죠?

으악 대충 떨어진 파일들을 하나로 합쳐주고 암호화등 해제해주는 모습같은데
분석하긴 싫으니 Frida로 리턴값을 확인해볼게요

1,534,066,688! 게임가디언으로 해당 주소값으로 이동해보면?

0xAF 0x1B 0xB1 0xFA가 보이네요! 찾아보니까 이런걸 헤드 시그니처라고 하는듯해요

메타데이터를 Memory에 로드해주는 함수가 맞는거같네요!!

이 함수가 메타데이터를 로드한다는 사실은 거의 확정된것같으니,
이제 메모리덤프를 위해 사이즈를 구해주면 되겠네요!

v16 = (char*)malloc(v2)

이부분이 좀 수상한데.. malloc 함수를 이용해서 v2만큼의 메모리를 할당해주는 모습이에요

여기서 v2가 뭔지 더 분석해본 결과, 사이즈를 도출해낼 수 있었고, 실제로 해당 내용들로 메모리덤프를 해보니 정상적인 메타데이터가 추출되었어요

이런건 처음이라 좀 헤맸는데 다행히 잘 끝났네요