프로그래밍/game hacking

블랙서바이벌 : 영원회귀 보안 취약점 (NLog Mono Injection)

Cheese Allergy Hamster 2020. 12. 7. 21:51
필자가 제작해본 블랙서바이벌 핵.. 플레이어 위치, 동물위치, 지뢰위치 등을 찾을 수 있고 오토카이팅 기능등을 제공한다.

 

최근에 블랙 서바이벌 : 영원회귀 라는 게임의 해킹을 시도해봤습니다. il2cpp 빌드가 안된 게임이라 쉽게 Assembly.dll 변조로 해킹하면 됐지만, 사실 저는 그게 너무 불편했습니다.

 

 일단, 유니티엔진으로 만들어진 게임 특성상 해킹 하는게 크게 어렵지는 않았습니다. 유니티 엔진내의 일반적인 게임 로직은 잘 파악하고 있는터라, 사실 함수를 짬뽕해서 핵을 만들면 되지만 매번 Assembly.dll을 변조하는게 불편하기도 하고, 이 방식은 언젠간 막힐게 분명하니까요. (파일 해시검사 등으로 충분히 막을 수 있음)

 

 게임에 보안처리된 부분은 없었기에 Assembly.dll을 사용하면 됐지만, 저는 다른 방법으로 하려고 생각하고 있었습니다. 최대한 C#만으로 해킹을 하고 싶었기에 메모리를 읽고 쓰는게 답일까 =_=; 하고 고민했지만 게임 내부에 이미 잘 짜여진 함수들을 원형 그대로 써서 만들고 싶은 강렬한 바램이.. 

 

 그러다 결국 방법을 찾았습니다. Dotpeek 과 DnSpy 를 이용하여 게임의 내부를 분석하기 시작하다가, 처음에는 비즈니스 로직만을 봤는데 갑자기 문득 혹시 App Domain에 외부 어셈블리를 붙이는 함수를 호출하는곳이 있을까..? (Assembly.Load함수) 가 문득 떠올라서 해당 함수 호출을 검색하다보니, NLog라는 라이브러리쪽에서 호출을 하고 있더군요.

 

 일단 이 일련의 과정을 설명드리자면, 아래 사진과 같이 dotpeek 같은 프로그램을 이용하면 AssemblyChsarp.dll을 불러오면 쉽게 열어 컴파일된 소스코드를 확인할 수 있습니다. 변조도 할 수 있고요.

블랙서바이벌의 소스코드를 볼 수 있게 해주는 dotPeek 프로그램

 

 NLog 라이브러리에서 Assembly.Load 함수를 호출하는 부분을 찾았고, 그 함수는 아래에 있습니다. 소스코드 전체적으로 보면 결국 같은 폴더 내에 Nlog. 로 시작하는 dll 파일을 AssemblyLoad하는 함수가 있었습니다.

 

 

NLog로 시작하는 모든 dll파일을 불러오는걸 확인할 수 있습니다. 이 원리대로라면 블랙서바이벌 프로젝트를 참조해서 빌드한 dll파일의 이름을 NLogGameHacking.dll 파일로 바꾼 후 같은 경로에 두는 것 만으로 나의 커스텀 dll을 불러오는데에는 성공합니다.

 

 그럼 MonoBehaviour를 상속받은 오브젝트에 내 dll의 컴퍼넌트를 붙이는 방법은 어떻게 해야할까? 하고 고민했습니다. .ctor(생성자)을 호출하지 못하면 사실상 코드가 앱 도메인에 올라가도 더미코드가 될뿐 아무런 의미가 없기때문에 이도 찾아보니까, 이건 NLog의 config파일을 수정하면 되는것이었습니다.(NLog 가이드 참조)

 

  NLog의 소스코드를 들춰보니 NLog.config에서 설정을 하고 특정 class에 Attribute와 NLog관련 클래스를 상속시켜주면 해당 클래스의 생성자를 NLog가 initialize 되는 시점에 호출할 수 있었습니다.

 config을 이렇게 수정하면 config 파일에서 NLogTarget 클래스를 가져와 생성자를 호출하는데 이때 생성자에 내가 원하는 코드를 집어넣기만 하면 됩니다.

 

 

 만약 게임사가 il2cpp 빌드를 하지 않고 모노에 안티치트나 다른 보안처리만 덧댄 방법을 사용한다면 이 방법은 안티치트나 기타 해킹 방지 코드에 의해 감지되지 않을것이라 생각합니다.  C#코드가 무방비하게 노출되어있으면 너무나도 나같은 툴키디도 이렇게 쉽게 해킹할 수 있기 때문에 il2cpp가 가능하다면 il2cpp 빌드로 전환해서 Assembly.dll의 변조를 방지하는게 좋아보입니다.

1 2 3