티스토리 뷰
#1 Unity 난독화
프로그램을 개발하고 배포하는 과정에서 항상 고민하게 되는 것이 난독화이다.
Unity로 개발된 프로그램은 Assembly_csharp.dll 파일로 ILspy, dnspy, dotpeek같은 .Net decompiler를 통해
쉽게 리버싱이 가능하다. 물론 코드 암호화를 하는 방법도 있지만 C# 구현도 어렵고 복잡하다.
이번에 Unity 난독화 에셋을 분석할 기회가 생겼고 Unity를 많이 접하지 않았지만 다시 돌아보는(?) 마음으로
프로젝트를 진행하려 한다.
#2 BEEBYTE's Obfuscator
해당 난독화 asset의 경우 옵션을 지정하여 class, methods, parameters, fields, properties, events를 선택적으로 난독화가 가능하다.
마침 반값 세일하는 기간에 구매하여 다행이지 개인적으로 선뜻 구매하기 힘든 가격인 것 같다;;
#3 기능 살펴보기
먼저 기능을 살펴보기 앞서서 테스트해볼 간단한 코드가 필요한데 여러 옵션들을 적용해보기 위해서 완성된 코드로 테스트해보면 좋겠다고 생각해서 에셋 스토어를 살펴보던 중 무료 템플릿이 있어서 해당 템플릿을 import해서 적용해 보았다.
Endless Runner라는 3D 무료 샘플 게임이다. 해당 게임을 import한 후 구매한 Obfuscator를 import 해주면 적용 준비가 끝난다.
import가 완료되면 Editor > Beebyte > Obfuscator 폴더에 ObfuscatorOptions를 클릭하면 Inspector 화면에서 위 그림을 볼수가 있다. 위에서 언급한 것 처럼 Rename 항목을 사용자가 선택 할 수 있게 되어있다.
먼저 난독화가 되기 전에 코드를 살펴보았다. dnSpy라는 도구를 이용하여 유니티에서 빌드한 경로에 Assembly-CSharp.dll 파일을 열어보면 위 그림과 같이 소스코드의 내용을 볼수가 있다.
#3-1 Classes name 난독화
난독화 옵션을 적용하고 빌드한 뒤 코드를 살펴보면 위 그림과 같이 Class 이름들이 임의의 문자열로 난독화 되어있는것을 볼 수 있다. 또한 함수의 경우 __BB_OBFUSCATOR_숫자 의 형식으로 난독화가 되어있다. 이 정도만 하더라도 표면적으로 쉽게 코드를 구분하기는 어려울 것이다.
#3-2 Methods name 난독화
이번에는 Classes 난독화 옵션을 제거하고 Methods name 난독화만 적용하여 빌드 해보았다. 같은 형식으로 함수 이름이 난독화된 것을 볼 수가 있다.
#3-3 Parameters 난독화
Parameter 난독화를 적용하면 위 그림과 같이 함수로 넘어오는 인자값들의 이름이 난독화 되는 것을 볼 수 있다. 역시 마찬가지로 난독화 형식은 위에서 테스트한 형식과 같다.
#3-4 Fields name 난독화
#3-5 전체 옵션 선택 후 난독화 확인
지금까지 각 옵션 별로 난독화 되는 부분이 어디인지를 살펴보았고, 위 그림은 모든 옵션을 적용한 뒤 빌드한 후 살펴본 소스코드이다. 각 옵션 별로 적용하면서 부분적으로 난독화가 되지 않는 영역들이 존재하여 위 사항은 빌드과정에서 오류가 난 부분들이 난독화가 되지 않은 상태로 빌드가 되어 나타난 현상이라고 추측하고 있지만 아직 좀더 살펴볼 필요가 있다.
그리고 난독화를 하여도 결국 해당 이름에 맞는 값들이 어떤식으로 매핑되어 있고 동작하는지를 파악한다면 코드 분석이 아주 어려운 것도 아니다. 다만 시간이 많이 걸릴 뿐...
다음은 이를 좀더 어렵게(?)하는 난독화 옵션에 설정값 변경을 살펴보자
#3-6 Naming Policies
말 그대로 이름 정책을 설정할 수 있다. 첫번째 영역에서 유니코드 시작 값을 지정할 수 있고, 두번째 영역에서 시작값을 기준으로 얼마만큼의 유니코드 값을 가져올지 범위를 지정할 수 있다.
그래서 위 그림과 같이 유니코드 시작 값을 변경하면 알파벳 뿐만아니라 다른 언어의 값들도 가져와서 난독화에 적용할 수 있다.
이렇게 적용하면 감히 예측조차 꺼려지게 되는 값들로 이름값들이 변경되는 것을 볼수 있다. 하지만 아직까지는 난독화에 사용되는 문자들이 여러개가 존재하여 적용된 이름들이 그나마 구분할 수 있을 정도이다.
하지만 지정된 범위값이 작아 사용되는 문자가 아주 적다면 좀더 복잡하게 난독화를 적용할 수 있다.
와우.... 마치 코드가 깨진 것 마냥 보기만 해도 정신이 혼란해지는 난독화 적용이다. 이 처럼 설정값을 조정하여 좀 더 다양한 난독화를 적용할 수 있다.
#4 마치며
이제 이 적용되는 난독화들이 어떤식을 동작하는지를 좀더 자세히 분석해보려 한다. Obfuscator의 C#코드를 간단히 훑어보았지만 그냥 이 부분에서 이름 난독화가 적용되는 거 같다는 느낌만 있지 실제 값이 바뀌는 부분이 어디인지는 파악이 되지 않았다.. 앞으로에 진행할 부분이 난독화 과정을 분석하여 비슷하게 구현하는 것을 목표로 하고 있지만 만만치 않을 것 같은 예감이다 ㅠㅠ
처음으로 블로그로 포스팅을 해봤는데 보고서 작성과는 다르게 제한적인 느낌이라 뭔가 어색하고 매일 포스팅하는 사람들이 새삼 존경스럽게 느껴졌다. 조금씩이라도 쓰는 습관을 만들어야겠다.
'Project > Unity_Obfuscator' 카테고리의 다른 글
Unity Obfuscator #6 (0) | 2019.07.19 |
---|---|
Unity Obfuscator #5 (0) | 2019.07.05 |
Unity Obfuscator #4 - code Analysis (0) | 2019.06.28 |
Unity Obfuscator #3 - 난독화 적용 후 il2cpp 살펴보기 (0) | 2019.06.14 |
Unity Obfuscator #2 - il2cpp (0) | 2019.06.07 |