UNITY Crack #3 APK Reversing

2022. 8. 15. 13:44Android

주제: 유니티 크랙 제작

기간: 22.07.18 ~ 22.07.25

 


 

먼저, build했던 apk파일을 분석하기 위해서는 디컴파일을 우선적으로 해야한다.

디컴파일을 위해 apktool을 사용하였다.

 

apktool 다운로드 링크)

https://github.com/iBotPeaches/Apktool

 

GitHub - iBotPeaches/Apktool: A tool for reverse engineering Android apk files

A tool for reverse engineering Android apk files. Contribute to iBotPeaches/Apktool development by creating an account on GitHub.

github.com

 

apktool을 설치

apktool d (apk경로) –o (저장할경로 - 디렉토리 생성됨)

 

decompile 과정

 

decompile 결과

 


 

이제 본격적으로 분석을 할 차례이다. 유니티 리버싱은 컴파일 방식에 따라 분석 방법도 달라진다.

유니티 컴파일 방식에는 두가지가 있다.

 

MONO vs IL2CPP

 

MONO:

  • C#코드를 IL로 변환하고 MONO가상머신이 읽는다.
  • JIT 컴파일 방식, 런타임으로 실행되며 빌드가 빠르다.
  • .NET Framework 기반으로 여러 플랫폼에서 구동이 가능하다
  • 변조가 비교적 간단하여 보안에 취약하다.

IL2CPP:

  • 만들어진 IL코드를 C++ 소스코드로 변환하여 C++컴파일러에 전달하고 .so를 생성한다. (libil2cpp.so)
  • AOT컴파일방식으로 속도가 향상되었다.
  • 변조가 MONO컴파일에 비해 어렵다. (불가능하진 않다. il2cppdumper를 사용하면 도움이 된다.)

 

추출한 유니티 게임의 apk가 어떤 방식으로 컴파일되어있는지는 라이브러리를 보고 판단할 수 있다.

 

위 decompile 결과 폴더에서 lib\armebi-v7a

 

mono가 있는것을 보고 mono로 컴파일되어있다는 것을 확인하였다.

만약 ilc2pp로 컴파일되었다면 ilbil2pp.so라는 파일이 있다.

 

처음 유니티 컴파일에 대해 잘 모를 때 빌드를 하여 의도하지는 않았으나 mono로 빌드되어있었다.

우선 mono로 프로젝트를 진행해보았다.

 

(il2cpp 변조는 진행하지 않았으므로 그에 대한 내용은 글 하단에 있는 링크를 참고)

 


 

(디컴파일한 파일 경로)\assets\bin\Data\Managed\Assembly-Csharp.dll

Assembly-Csharp.dll dnSpy로열어준다.

 

dnSpy는 .NET언어로 작성된 프로그램이 대상인 디버깅툴이다. 코드 읽기와 편집도 가능하다.

 

dnSpy 다운로드 링크)

https://github.com/dnSpy/dnSpy

 

GitHub - dnSpy/dnSpy: .NET debugger and assembly editor

.NET debugger and assembly editor. Contribute to dnSpy/dnSpy development by creating an account on GitHub.

github.com

 

dnSpy로 Assembly-Csharp.dll을 열고 {} - 하위 항목을 펼쳐 함수를 클릭하면 아래와 같이 코드가 보인다.

dnSpy로 Assembly-Csharp.dll open

 

2022.08.03 - [Android] - UNITY Crack #1 Coding

 

UNITY Crack #1 Coding

주제: 유니티 크랙 제작 기간: 22.07.18 ~ 22.07.25 여름방학 프로젝트로 안드로이드를 선정했다. 본격적인 프로젝트 시작에 앞서 유니티로 개발된 어플도 경험해보기 위해 직접 유니티로 간단한 코

mi-sutga-ru.tistory.com

위 링크의 기존 TimerSet.cs과 아래 코드를 비교하면 두 코드가 거의 유사한 것을 확인할 수 있다.

 

아래는 dnSpy에서 디컴파일해준 코드 전문이다.

-TimerSet.cs

using System;
using UnityEngine;
using UnityEngine.UI;

// Token: 0x02000002 RID: 2
public class TimerSet : MonoBehaviour
{
	// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
	private void Start()
	{
		this.text_Timer = GameObject.Find("Background").transform.Find("Timer").GetComponent<Text>();
		this.text_Timer.text = "0";
		this.Reset();
	}

	// Token: 0x06000002 RID: 2 RVA: 0x00002114 File Offset: 0x00000314
	private void Update()
	{
		this.time_current += 100f * Time.deltaTime;
		if (this.time_current > this.time_base + 100f)
		{
			if (this.isEnded)
			{
				return;
			}
			this.time_base += 100f;
			if (this.time_current < this.time_Max)
			{
				this.text_Timer.text = this.time_base.ToString();
				return;
			}
			this.End();
		}
	}

	// Token: 0x06000003 RID: 3 RVA: 0x0000208C File Offset: 0x0000028C
	private void End()
	{
		Debug.Log("End");
		this.time_current = this.time_Max;
		this.text_Timer.text = this.time_base.ToString();
		this.isEnded = true;
	}

	// Token: 0x06000004 RID: 4 RVA: 0x000020C1 File Offset: 0x000002C1
	private void Reset()
	{
		this.time_base = 0f;
		this.time_current = 0f;
		this.text_Timer.text = this.time_base.ToString();
		this.isEnded = false;
		Debug.Log("Start");
	}

	// Token: 0x04000001 RID: 1
	public Text text_Timer;

	// Token: 0x04000002 RID: 2
	public float time_base;

	// Token: 0x04000003 RID: 3
	public float time_current;

	// Token: 0x04000004 RID: 4
	public float time_Max = 1000000f;

	// Token: 0x04000005 RID: 5
	public bool isEnded;
}

 


 

이제 변조를 할 차례이다.

코드를 분석한 후, dnSpy에서 코드 우클릭 ->  Edit Class (C#)...를 누르고 변조하고 싶은대로 코드를 변경할 수 있다.

나는 초당 1씩 오르던 숫자를 초당 100씩 오르도록 변경하였다.

 

이후 재빌드과정은 다음 글에서 이어진다.

 


 

참고 목록

 

디컴파일 참고)

https://ndb796.tistory.com/448

 

간단한 Apktool 설명, 설치, 사용 방법 (안드로이드 앱 분석)

Apktool은 대표적인 안드로이드 애플리케이션(Android Application) 대상의 리버스 엔지니어링 도구입니다. APK 파일을 분석하여 리소스를 뽑아낼 수 있고(디코딩), 코드를 수정하여 다시 재빌드(Rebuild)

ndb796.tistory.com

리버싱 참고)

http://linforum.kr/bbs/board.php?bo_table=android&wr_id=3&sca=%EA%B0%95%EC%A2%8C&page=3

 

안드로이드 유니티 게임 엔진 MONO 해킹

유니티로 제작된 안드로이드 게임은 원하는 컴파일 방식(Mono, IL2CPP)을 선택하여 빌드를 할 수 있습니다.가장 많이 사용하는 Mono의 경우 JIT 컴파일을 사용하여 IL(중간언어)로 작성된 dll 파일을 읽

linforum.kr

http://linforum.kr/bbs/board.php?bo_table=android&wr_id=4

 

안드로이드 유니티 게임 엔진 IL2CPP 해킹

이전 글에서는 mono로 빌드된 유니티 게임 변조방법에 대해서 살펴보았습니다. mono로 빌드된 게임의 경우 쉽게 디컴파일되어 게임코드를 볼 수 있을 뿐만 아니라 아주 간단하게 코드 삽입 및 변

linforum.kr

'Android' 카테고리의 다른 글

REAL Android Crack #2 개요  (0) 2022.09.13
REAL Android Crack #1 adb란? / Nox apk 추출  (0) 2022.09.13
UNITY Crack #4 APK Re-Build, Signing  (0) 2022.08.16
UNITY Crack #2 APK Build  (0) 2022.08.03
UNITY Crack #1 Coding  (0) 2022.08.03