2022. 8. 15. 13:44ㆍAndroid
주제: 유니티 크랙 제작
기간: 22.07.18 ~ 22.07.25
먼저, build했던 apk파일을 분석하기 위해서는 디컴파일을 우선적으로 해야한다.
디컴파일을 위해 apktool을 사용하였다.
apktool 다운로드 링크)
https://github.com/iBotPeaches/Apktool
apktool을 설치
apktool d (apk경로) –o (저장할경로 - 디렉토리 생성됨)
이제 본격적으로 분석을 할 차례이다. 유니티 리버싱은 컴파일 방식에 따라 분석 방법도 달라진다.
유니티 컴파일 방식에는 두가지가 있다.
MONO vs IL2CPP
MONO:
- C#코드를 IL로 변환하고 MONO가상머신이 읽는다.
- JIT 컴파일 방식, 런타임으로 실행되며 빌드가 빠르다.
- .NET Framework 기반으로 여러 플랫폼에서 구동이 가능하다
- 변조가 비교적 간단하여 보안에 취약하다.
IL2CPP:
- 만들어진 IL코드를 C++ 소스코드로 변환하여 C++컴파일러에 전달하고 .so를 생성한다. (libil2cpp.so)
- AOT컴파일방식으로 속도가 향상되었다.
- 변조가 MONO컴파일에 비해 어렵다. (불가능하진 않다. il2cppdumper를 사용하면 도움이 된다.)
추출한 유니티 게임의 apk가 어떤 방식으로 컴파일되어있는지는 라이브러리를 보고 판단할 수 있다.
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
dnSpy로 Assembly-Csharp.dll을 열고 {} - 하위 항목을 펼쳐 함수를 클릭하면 아래와 같이 코드가 보인다.
2022.08.03 - [Android] - UNITY Crack #1 Coding
위 링크의 기존 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
리버싱 참고)
http://linforum.kr/bbs/board.php?bo_table=android&wr_id=3&sca=%EA%B0%95%EC%A2%8C&page=3
'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 |