2014년 3월 14일 금요일

유니티 안드로이드/iOS 버전 Crypto Obfuscator를 이용해 Assembly-CSharp.dll 난독화하기

 던전워즈
Crypto Obfuscator 난독화 툴을 통해서 유니티 안드로이드 버전 난독화방법은 이미 잘알려져있다.
난독화시 각종 난독화 예외사항들만 잘 설정해주면
문제없이 동작한다. 어떤 클래스들을 난독화하고 어떤것을 제외할 것인가 하는 부분은 개별 프로젝트마다
다를 수 있으므로 언급하지 않는다.
현재 개발중인 게임에서 사용중인 안드로이드쪽 난독화 셋팅은 다음과 같다


 심볼 리네이밍 스킴은 적절한것을 선택하면된다. 나의 경우에는 프로시저이름의 해시형태로 나바꾸게 해놨는데
해시형태가 오히려 보기 더 어려운듯하여(보는 사람에게 짜증을 유발) 선택했다. Unprintable형태는 출력되지 않은 기호형태로 리네이밍하게 된다.(아예 알아볼수 없으니 짜증이고 나발이고 없다) 해시방식의 단점은 dll 파일의 크기가 커진다는 것이다.



난독화 예외항목에는 잘알려진 난독화 하면 안되는 유니티 관련된 것들과 NGUI관련한것을 포함시켰다. 하나하나 세세하게 설정하면
아주 훌륭한 수준의 난독화가 가능하겠지만 설정할것들이 너무 많아서 그냥 두리뭉실하게 뭉탱이 단위로 설정했다.
그래서 그런지 MonoBehaviour를 상속받은 것들은 난독화 되지 않는다. 각종게임 로직들은 그대로 노출되겠지만  민감한 코드들은 모두 외부로 빼서 처리하기 때문에 크게 문제는 없을듯하다.

문제는 iOS쪽이다. ios쪽 DLL난독화는 안드로이드나 PC쪽에 비해 아주 귀찮은 작업이다.
자세히 알지는 못하지만 iOS에서 유니티 xcode 프로젝트를 출력할때는 AOT단계를 거치게된다.
iOS의 LLVM이라는 환경이 온전하게 .NET가상머신 환경을 제공하지 못해.
각종 DLL의 바이트코드들이 LLVM의 형식이 맞게 변환되어서 메인 바이너리에 포함되는듯하다.
mac 버전의 유니티에는 mono-xcompiler라는 크로스 컴파일러가 있다. (4.3버전의 유니티인경우 윈도우 환경에서도
xcode프로젝트 생성이 가능하지만 DateTime관련해서 버그가 있으므로 iOS버전은 여전히 Mac에서 뽑는게 안전하다.)
아무튼 실질적으로 우리가 만들어 컴파일된 .NET의 스크립트파일들은 실질적으로는 사용되지 않지만 여전히 내부의
소스를 훤히 들어낸체 xcode의 프로젝트에 포함되어 있다. 단지 인터페이스의 역할만 하는 정도라면 메소드의 내부를 모두제거
하고 중요 심볼만 남겨둬도 될텐데 유니티는 왜그렇게 하지 않는지 이유를 모르겠다.

xcode 프로젝트의 data\managed\ 폴더안에보면 Assembly-CSharp.dll 이 존재하고
Libraries\폴더안에 보면 Assembly-CSharp.dll.s 라는 어셈블리 소스 파일이 존재한다.
실제 ios의 실행 바이너리에 포함되어 작동되는 코드들은 Assembly-CSharp.dll.s라는 어셈블리로 재컴파일되어
xcode빌드시 포함되게 된다.
Assembly-CSharp.dll.s 파일은 mono-xcompiler를 통해서 유니티 AOT단계를 거칠때 생성하게 된다.
mono-xcompiler는 .NET DLL파일로 부터 iOS의 LLVM에 맞는 적절한 어셈블리 명령을 생성하게 되는 것이다.

그렇기 때문에 우리가 iOS버전의 DLL을 난독화하기 위해서는 두가지의 단계를 거쳐야한다.
첫째는 xcode프로젝트의 Assembly-CSharp.dll을 난독화하고
두번째는 이렇게 난독화된, DLL로부터 어셈블리 소스를 mono-xcompiler를 이용해서 다시 생성하는 것이다.

iOS버전 DLL난독화에는 다음과 같은 셋팅을 사용했다.


안드로이드 난독화 셋팅과의 차이점은 어셈블리 상세 설정의 체크를 모두 해제 했다는 것이다.
mono-xcompiler가 난독화된 DLL과 별로 친하지 않기 때문에 조금이라도 민감한 수준의 난독화를 하게 되면
크로스컴파일이 실패하게 된다.
crypto obfuscator의 맥 버전이 없어서 난독화는 매우 귀찮은 작업이다.
mac에서 xcode 프로젝트 생성 -> Data\Managed\ 폴더내의 모든 파일들을 윈도우로 옮겨서 Assembly-CSharp.dll 난독화
다시 난독화된 파일을 맥으로 옮겨서 Data\Managed\ 폴더에 있는 원본과 교체
이휴 mono-xcompiler를 이용해서 어셈블리 재생성
iOS 및 Mac os와 전혀 친하지 않기 때문에 나에게는 너무나 불편하고 힘든작업이다.

Mono-xcompiler는 맥의 다음경로에 위치하고 있다.

유니티 아이콘에서 패키지 내용보기-> Contents\BuildTargetTools\iPhonePlayer\  폴더내부에 있는데
전체 경로는 어플리케이션 뭐시기로 시작하는 어딘가이다.
저기 보이는 저 mono-xcompiler를 사용해서 *.dll.s 파일을 만들면된다.
mono-xcompiler 를 다음형태로  작동시키면되는데 나의 경우 a\라는 폴더를 만들고 거기 안에 xcode프로젝트의 data\managed안에 있는 모든 내용들을 복사해서 넣어놓고 작업한다.

export MONO_PATH=/Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/a/
export MONO_CFG_DIR=/Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/a/mono/2.0/
/Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/mono-xcompiler --aot=full,asmonly,nodebug,static,outfile="/Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/Assembly-CSharp.dll.s" "/Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/a/Assembly-CSharp.dll"

콘솔에서 작업해야 하는데 유닉스 쉘 스크립트를 만들어 놓고쓰면 편하게 작업할 수 있다.
위의 그림에 보이는 cli-unity-xcp 라는게 위의 명령을 처리하는 스크립트 파일이다.
스크립트 파일링크

아무튼 해당 스크립트를 실행하면 몇초후 Assembly-CSharp.dll.s 라는 파일이 만들어질텐데 이파일을 xcode프로젝트의 Libraries 폴더내에 있는 것과 교체해주면 난독화 작업이 완료되게 된다.


댓글 없음:

댓글 쓰기