본문 바로가기
프로그래밍/Unity

Unity - Obfuscator 메뉴얼

by neive 2021. 12. 30.
728x90

https://assetstore.unity.com/packages/tools/utilities/obfuscator-48919?aid=1011lvKwp

 

Obfuscator

 

Assets/Editor/Beebyte/Obfuscator/ObfuscatorOptions.asset 파일을 클릭해보면

 

설정 가능

 

 

Button

더 강력한 난독화를 위해 프로그래밍 방식으로 버튼 클릭을 할당하는 것을 고려하십시오.
using UnityEngine;
using UnityEngine.UI;
using Beebyte.Obfuscator;
public class Buds : MonoBehaviour
{
	public Button Button;
	public void Start()
 	{
 		Button.onClick.AddListener(CodedClick);
 	}
 	//Assigned in the Start() method
 	private void CodedClick() //This gets obfuscated
 	{
 		Debug.Log("Coded Click");
 	}
 	// Assigned through the inspector within On Click () +
 	// so requires [SkipRename] when obfuscating public mono methods
 	[SkipRename]
 	public void InspectorClick() //Visible
 	{
 		Debug.Log("Inspector click");
 	}
}
이 예에서 'CodedClick'은 난독화됩니다.

 

Animation Clip

버튼과 같은 방식으로 다음을 사용하여 프로그래밍 방식으로 추가하는 것을 고려하십시오.
AnimationClip.AddEvent(애니메이션 이벤트 이벤트).
그렇지 않고 Unity Inspector를 통해 할당된 경우 메서드에 주석을 추가하는 것을 잊지 마십시오.
[SkipRename]

 

Methods

더 많은 방법을 사용하면 더 나은 난독화를 얻을 수 있습니다. 
S.O.L.I.D.와 같은 우수한 소프트웨어 사례를 따릅니다. ~ 할 것이다
코드의 유지보수성을 향상시킬 뿐만 아니라 리버스 엔지니어링이 더 어려워집니다.

 

Check your protection

 

난독화를 확인하고 Obfuscator를 조정하려면 어셈블리

검사기를 사용하는 것이 중요합니다. 품질을 향상시키는

옵션입니다. 다양한 어셈블리 검사기를 사용할 수 있습

니다. 예를 들면 DotPeek(JetBrains & 무료) 및 ILSpy(오

픈 소스). 먼저 최종 빌드에서 DLL을 추출해야 할 수 있

으며 온라인에서 도움이 되는 리소스를 찾을 수 있습니

다. 이것으로.

 

 

IL2CPP

• 난독화의 영향을 확인하는 간단한 방법은 global-metadata.dat 파일을 텍스트로 보는 것입니다.
편집기 및 메소드 이름 검색
• Obfuscator가 IL2CPP 빌드를 난독화하도록 지시하는 데 필요한 추가 단계가 없습니다.
• Unity 버전 및 빌드 대상 어셈블리에 따라
Library/ScriptAssemblies/는 난독화되지 않습니다. 난독화 된 형태를 보려면 다음을보십시오.
Library/PlayerDataCache/Data/Managed/ 또는 대안으로
• 또한 Classes/Native/Bulk_Assembly-CSharp_0.cpp에서 엿볼 수 있습니다.
난독화 작업 중.

 

Asset Store Publishing / Creating Libraries

다른 사람들이 프로젝트에서 사용할 수 있도록 라이브러리를 난독화하려는 경우 합병증을 피하기 위해
사용자를 위해(그리고 아마도 프로젝트 계층에 도움이 될 수 있음) 고유한 버전을 만드는 것이 가장 좋습니다.
[건너뛰기], [건너뛰기 이름] 등을 필요할 때 사용할 수 있습니다.
이렇게 하려면 다음과 같은 클래스를 만들어야 합니다.
using System;
namespace MyCompany.Obfuscator
{
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct |
 	AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Parameter |
 	AttributeTargets.Event | AttributeTargets.Enum | AttributeTargets.Property |
 	AttributeTargets.Delegate)]
 	public class SkipAttribute : System.Attribute
    {
 		public SkipAttribute() {}
 	}
}
그런 다음 이 속성을 동일한 속성으로 지정하여 마치
Beebyte.Obfuscator.SkipAttribute:

 

Obfuscator Version

항상 사용 가능한 최신 Obfuscator 버전을 사용하는 것이 좋습니다. 이전 버전과의 호환성은
항상 사용자가 자주 업데이트하도록 권장하는 우선 순위입니다. Obfuscator는 시맨틱 형식을 사용합니다.
릴리스 번호에 대한 버전 관리:
Obfuscator v[Major].[Minor].[Patch]
• [주요한]
새 메이저 버전으로 업그레이드하려면 추가 구성 단계가 필요할 수 있습니다.
성공하기 위해 구축합니다. 그러나 이것은 특정 옵션 기능이 있는 경우에만 필요할 수 있습니다.
사용되었습니다. 주요 빌드가 반드시 이전 버전과 호환되는 것은 아닙니다.
• [미성년자]
이 빌드에는 새로운 기능과 버그 수정이 포함될 수 있습니다.
• [패치]
이 빌드에는 버그 수정이 포함되어 있습니다.

 

 

Assemblies

모든 어셈블리 정의를 난독화(2017.3 이상)
• 활성화되면 난독화가 크게 강화됩니다.
• 이것은 '어셈블리' 목록에서 각 어셈블리 정의 클래스를 지정하는 대신 사용할 수 있습니다.
어셈블리
• Unity 빌드 프로세스에서 처음 생성된 난독화할 어셈블리 목록입니다.
• 파일 확장자가 포함되어야 합니다.
• 예:
◦ 어셈블리-CSharp.dll
◦ MyAssemblyDefinitionName.dll
컴파일된 어셈블리
• 빌드를 실행하기 전에 사전 컴파일된 난독화할 어셈블리 목록.
• 파일 확장자가 포함되어야 합니다.
• 예를 들어 IDE를 통해 Wheel이라는 DLL을 컴파일하고 Assets 폴더에 넣으면
이 목록에는 Wheel.dll이 포함됩니다.
참조된 어셈블리
• AssemblyResolutionException이 있는 경우 컴퓨터에서 참조된 DLL을 찾고
이 목록에 파일 위치를 추가하십시오. Obfuscator는 다음과 같은 경우 이 파일 또는 디렉토리를 확인합니다.
빌드 프로세스의 일부로 DLL을 찾으려고 합니다.
이름 바꾸기
• 활성화되면 난독화가 크게 강화됩니다.
• 난독화된 DLL만 주어지면 원래 이름을 리버스 엔지니어링하는 것이 거의 불가능합니다.
• 난독화된 DLL과 '랜덤 시드'(이름 지정 정책)가 주어지면 해커는 다음을 수행해야 합니다.
이름을 추측하고 해시한 다음 코드를 검색하여 해당 해시가 어디에서나 사용되는지 확인합니다. 그것
이 추측 단계 없이 원래 이름을 반환하는 것은 거의 불가능합니다.
• 멤버 유형(클래스, 메소드 등)을 활성화하면 항상 개인 인스턴스가 난독화됩니다.
Obfuscator가 충돌을 일으킬 수 있음을 감지하지 않는 한 해당 유형.
• '보호됨'을 활성화하면 보호된 인스턴스가 난독화됩니다.
• '공개'를 활성화하면 공개 인스턴스가 난독화됩니다.

 

Include enum constants

• 활성화되면 난독화를 강화합니다.

• 다음과 같은 코드가 있는 경우 주의하십시오.

public class Booster
{
	private readonly Fuel _fuel;
	public Booster(Fuel fuel)
    {
 		_fuel = fuel;
 	}
 
	public void Ignite()
    {
 		// Ignited ]][[][[[[[][[][][[]]][[[[[[]][]]]][]][][[]][[[[ booster!
 		LogFrame.WriteMessage("Ignited " + _fuel + " booster!");
 	}
 }

 

Strip Namespaces

• 클래스를 기본 네임스페이스로 이동하여 활성화된 경우 난독화를 강화합니다.
• 'Strip Namespaces'가 적용되기 전에 항상 'Skip Namespaces'가 검색됩니다.
• 두 개의 다른 네임스페이스에 같은 이름을 가진 두 개의 클래스를 갖는 것이 허용됩니다.
Obfuscator는 충돌을 피하기 위해 고유한 이름을 할당합니다.

 

MonoBehaviours

공개 모노 메서드 포함
• 활성화되면 난독화를 강화합니다.
• MonoBehaviour 객체의 공용 메서드를 난독화하려면 이 옵션을 반드시 지정해야 합니다.
Rename->Methods->Public에 추가로 활성화됩니다.
• 일반적으로 이 기능을 활성화하고 싶지만 다음을 수행하는 메서드에서 [SkipRename]을 사용할 준비가
Unity Inspector 내에서 버튼 클릭 및 애니메이션 클립이 선택되었습니다.
행동 양식.
공개 모노 필드 포함
• 활성화되면 난독화를 강화합니다.
• 스트리밍된 자산은 이 기능을 비활성화해야 합니다. 또는 스트리밍 자산 필드에 주석 달기
[SkipRename]으로.
MonoBehaviour 클래스 이름 난독화(Unity 2018.2+)
• 활성화되면 난독화가 크게 강화됩니다.
• 활성화되면 MonoBehaviour에서 파생된 클래스를 난독화합니다.
• 스트리밍된 수업은 주석을 달지 않는 한 이 옵션이 활성화된 상태에서 작동하지 않습니다.
[이름 바꾸기]를 건너뜁니다.
• 이 난독화는 독립 실행형 빌드(예: Windows, Linux, MacOS)에만 적용됩니다.
• 이 기능(LZ4 등)에서는 빌드 압축이 불가능합니다.
MonoBehaviour 클래스 이름 난독화(Unity 4.2 - 2018.1)
• 활성화되면 난독화가 크게 강화됩니다.
• 활성화되면 MonoBehaviour에서 파생된 클래스를 난독화합니다.
• 스트리밍된 수업은 주석을 달지 않는 한 이 옵션이 활성화된 상태에서 작동하지 않습니다.
[이름 바꾸기]를 건너뜁니다.
• MonoBehaviours를 포함하는 미리 컴파일된 DLL은 이 기능으로 이름이 변경되지 않습니다. 그들
[SkipRename]으로 주석이 달린 것처럼 처리됩니다. Unity 어셈블리 사용 고려
대신 정의 파일을 사용하고 대신 임시 DLL에 어셈블리 참조를 추가합니다.
Config.cs의 영구 DLL
• 이것은 원본 소스 파일(이름 변경)을 건드려야 하는 유일한 옵션이지만 복원됩니다.
빌드 후.
• 빌드에 실패한 경우 소스가 복원됩니다.
• Unity IDE가 종료되는 치명적인 이벤트 발생 시 소스가 복원됩니다.
다음에 Unity IDE 내에서 프로젝트를 열 때.
• 이 옵션을 처음 활성화하기 전에 프로젝트를 백업하십시오.
• _monoBehaviourTranslations라는 파일이 임시로 루트에 생성됩니다.
이 빌드 과정에서 프로젝트가 삭제되고 소스 파일 복원 시 제거됩니다.
비표준 소스 경로(Unity 4.2 - 2018.1)
• 혼란스러운 경우 특정 MonoBehaviour를 찾을 위치를 Obfuscator에 지시하는 데 사용됩니다.
• 빌드할 때 Obfuscator에서 프롬프트가 표시되지 않는 한 이 필드를 비워 두십시오.
추상 MonoBehaviours(Unity 4.2 – 2018.1)
• 이름을 바꿀 수 없는 추상 MonoBehaviours 목록을 보유합니다.

 

기타

난독화 버전 속성 추가
• DLL이 두 번 난독화되는 것을 방지합니다.
그만 일해.
• 난독화를 시작하는 사용자 정의 빌드 스크립트가 있는 경우
이것. 그렇지 않으면 안전하게 비활성화할 수 있습니다.

진행률 표시줄 세부 정보
• 빌드 중 난독화 상태를 표시합니다.
• "Detailed" 설정은 다음과 같이 대규모 프로젝트의 빌드 시간을 증가시키는 것으로 알려져 있습니다.
약 40%이지만 가장 유익한 진행 상황을 제공합니다.

 

String obfuscation

 

난독화 문자열 리터럴

• 코드에 주석이 있고 활성화된 경우 난독화를 강화합니다.

• 리터럴을 난독화하는 두 가지 방법이 있습니다.

◦ 메서드 또는 클래스의 [ObfuscateLiterals](권장):

 [ObfuscateLiterals]
 private string DescribeAmountRemaining()
 {
 	if (_amountRemaining <= 0) {
 		return "Empty";
 	}
 	if (_amountRemaining >= 100) {
 		return "Full";
 	}
 	return _amountRemaining + "%";
 }

Using a marker:

 private string DescribeAmountRemaining()
 {
 	if (_amountRemaining <= 0) {
 		return "^Empty^";
 	}
 	if (_amountRemaining >= 100) {
 		return "^Full^";
 	}
 	return _amountRemaining + "^%^";
 }
• 문자열 리터럴 난독화(양방향 난독화)는 멤버 이름 변경만큼 강력하지 않습니다.
(단방향 난독화).
• 난독화된 DLL만 있으면 원래 문자열을 리버스 엔지니어링할 수 있습니다.
• 응용 프로그램은 원래 문자열(양방향 난독화)을 읽어야 해커가
이론을 읽을 때도 동일한 기술을 적용하십시오. 원본 소스 클래스 및 메서드 이름
응용 프로그램에 필요하지 않으므로 단방향 난독화가 적용됩니다.
• 캐싱은 메모리를 사용할 때 보안 고려 사항으로 인해 문자열 난독화에 적용되지 않습니다.
버려집니다.
• 바이트 배열의 크기는 일반적으로 문자열 기반으로 추측하기 어렵게 증가합니다.
그 길이에
• 난독화할 때마다 바이트가 다릅니다.
• 같은 문자열에 두 개의 서로 다른 형식으로 난독화를 적용해도 바이트가 다릅니다.
코드의 장소
난독화 마커 유니코드
• 마커를 사용하여 난독화하는 경우 이 값을 사용하여 마커를 변경할 수 있습니다.
• 값은 10진수 표기법입니다.
• 기본값은 94입니다. ^
모든 메소드에서 리터럴 난독화
• 활성화되면 난독화를 강화합니다.
• [ObfuscateLiterals]로 모든 메소드 또는 클래스에 주석을 다는 것과 같습니다.
난독화 메서드에서 난독화 리터럴만
• 활성화되면 난독화를 약화시킵니다.
• 활성화되면 일반적으로 난독화되는 리터럴이 다음과 같은 경우 난독화되지 않습니다.
상위 메소드는 난독화에서 제외됩니다.
난독화되지 않은 리터럴의 스트립 마커
• 활성화된 경우 난독화 마커 유니코드로 시작하고 끝나는 모든 문자열
문자는 해당 문자를 양쪽 끝에서 제거합니다.
• 이는 모든 발생을 변경할 필요 없이 문자열 난독화를 비활성화할 수 있도록 하기 위한 것입니다.
소스 코드 내의 난독화 문자.
• 문자열 마커 난독화를 사용한 적이 없고 의도한 적이 없다면 안전하게
이 옵션을 비활성화하십시오.

 

 

Fake Code

 

Add fake code

 

• 활성화되면 난독화를 강화합니다.
• 파일 크기를 늘립니다.
• 난독화 빌드 시간이 늘어납니다.
• 코드 흐름을 변경하지 않습니다.
• 기존 방법을 복제하고 사람들을 오도하는 방식으로 사본을 미묘하게 수정합니다.
클래스당 최소 false 메서드
• 가짜 메서드를 가질 수 있는 클래스는 최소 개수의
복제된 방법.
• 권장 사항은 기본값을 유지하는 것입니다.
클래스당 최대 false 메서드
• 값이 낮을수록 파일 크기와 빌드 시간이 줄어듭니다.
• 값이 높을수록 보안이 향상되지만 이점은 곧 무시될 수 있습니다.
• 단일 클래스는 주입된 가짜 메서드의 이 수를 초과하지 않습니다.
• 권장 사항은 기본값을 유지하는 것입니다.

복제에 대한 최대 지침
• 파일 크기와 빌드 시간을 제한하는 또 다른 방법은 몇 개의 큰 파일이 있는 경우에 유용합니다.행동 양식.
• 권장 사항은 기본값을 유지하는 것입니다.

 

 

Naming Policies

10진수로 시작하는 유니코드
• 특이한 문자로 변경 시 난독화를 강화합니다.
• 값은 10진수 표기법입니다.
• 기본값은 65 'A'입니다.
• 일부 특수 유니코드 값은 많은 문제를 방지하기 위해 입력할 수 없습니다.
• 'Obfuscate MonoBehaviour Class Name' 기능을 함께 사용하는 경우 이 변경에 주의하십시오.
그 기능의 일부는 일시적으로 파일 이름을 다음을 사용하여 이름으로 바꾸는 것을 포함하기 때문에
문자. 일부 오래되거나 일반적이지 않은 운영 체제는 특이한 문자를 좋아하지 않을 수 있습니다.
그러나 많은 사람들이 그것들을 받아들일 것입니다.
N, 여기서 문자 수 = (2^N)
• 낮추면 난독화를 강화합니다.
• 값을 낮추면 난독화된 이름의 길이가 늘어나고 이름의 수가 줄어듭니다.
사용되는 다른 문자.
• 보기 [[]]]][[]]][[][]]][[]]]]]]][]][[[[][]][]][][ ( 문자 91, N = 1)은 시각적으로 훨씬 어렵습니다.
AGTNEHWK(문자 65, N = 4)보다 인식
• 기본값은 현재 4이지만 향후 릴리스에서 1로 변경될 수 있습니다.
해시 소금
• Obfuscator 설치 시 무작위로 생성됩니다.
• 값은 난독화된 이름을 직접 변경합니다.
• 동일한 소스 코드를 빌드하는 동일한 솔트를 사용하는 개발자 팀이 DLL을 생성합니다.
동일한 난독화 된 이름을 가진 것입니다.
• 솔트는 별도로 구성하지 않는 한 생성된 'nameTranslation.txt' 파일 내에 인쇄됩니다.
(이름 매핑 기록 참조).
• 솔트의 길이는 16자 이상이어야 하며 임의의 문자 조합을 사용하여
좋은 세트(예: [a-zA-Z0-9]). 이러한 소금은 전용 기계(~25,000 USD)가 필요합니다.
2020년 기준 평균 약 10조년 무차별 대입!
• 솔트를 조직 내에서 비공개로 유지
모든 빌드에서 해시 솔트 재생성
• 활성화하면 빌드가 수행될 때마다 새로운 해시 솔트가 무작위로 선택됩니다.
• Obfuscator가 멱등성이 될 필요가 없다면 이것을 활성화하는 것이 좋습니다.

 

Name Mapping History

이름 번역 파일 생성
• 다음의 매핑과 함께 사용된 시드를 포함하는 프로젝트의 루트에 파일을 생성합니다.
새로 난독화 된 이름을 이전으로.
• 클라이언트가 보고한 스택 추적을 변환하는 데 필요합니다.
이름 번역 파일
• 이름 번역 파일의 이름!
해시 소금 포함
• 활성화된 경우 해시 솔트가 헤더 라인 '#Hashes'에 인쇄됩니다.
줄당 화살표 순서 역전
• 활성화된 경우 매핑이 새 것 -> 이전입니다.
• 비활성화된 경우 매핑이 이전 -> 새 것입니다.
• 이것은 이미 사용을 시작한 고객을 위해 추가된 이전 버전과의 호환성 기능이었습니다.
자동화된 스택 추적 구문 분석 도구를 작성합니다.
이름 패딩 구분 기호
• 스택 추적을 구문 분석하는 도구를 만들려는 경우에만 이 값을 변경하십시오.
• 자동화된 도구가 번역되어야 하는 문자열을 인식하는 방법을 제공합니다.
• 기본값은 0입니다.
• 이를 변경하면 <Insert issue>에 문제가 발생할 수 있습니다.
가짜 방법 번역
• 활성화되면 주입된 가짜 코드의 이름도 nameTranslation.txt에 표시됩니다.
• 가짜 코드는 일반적으로 실행되지 않으므로 이 옵션을 그대로 두는 것이 일반적입니다.
장애가있는.

 

Reflection and RPC

Unity 리플렉션 방법 검색
• 활성화되면 런타임 오류를 방지합니다.
• Unity 리플렉션 메서드는 StartCoroutine과 같이 문자열을 가져와 검색하는 메서드입니다.
같은 이름을 가진 코드의 메서드입니다.
• 이 옵션은 나중에 제거될 수 있습니다(기본값은 활성화됨).
Unity 반사 메서드 난독화
• 활성화되면 난독화를 강화합니다.
RPC 메소드에 대한 리터럴 난독화 및 교체
• 활성화되면 난독화를 강화하지만 시드 변경을 제한할 수 있습니다.
• 비활성화되면 [RPC] 주석이 있는 메서드의 이름이 바뀌지 않습니다.
• 활성화된 경우 임의 시드를 변경하면 이전 클라이언트가 통신할 수 없음을 의미합니다.
새로 구축된 서버와 그 반대의 경우.
대체 RPC 주석
• 일부 자산은 [RPC]처럼 작동하는 고유한 주석을 제공합니다. 알려주는 방법입니다
Obfuscator는 [RPC]를 처리하는 것과 같은 방식으로 이러한 주석을 처리합니다.
건너뛴 클래스에서도 리터럴 교체
• 런타임 오류를 방지하기 위해 활성화된 상태로 두는 것이 좋습니다.
• 비활성화되고 클래스가 'StartLevel'이라는 메서드에 주석을 추가하는 경우
[ReplaceLiteralsWithName], "StartLevel"의 문자열 리터럴은 다음으로만 대체됩니다.
컨테이너 클래스도 일반적으로 난독화되는 경우 난독화된 대응물입니다.
• 이것을 비활성화하려는 사용 사례는 매우 제한적입니다.
리터럴 바꾸기
• 여기에 선언된 메소드는 해당 메소드 이름을 포함하는 모든 문자열을 다음으로 변경합니다.
애매한 상대.
• 리플렉션을 사용하여 생성하도록 요청한 방법을 조회하는 자산에 사용됩니다.
기본 MonoBehaviour 클래스에 알려지지 않은 MonoBehaviour.
• 선언된 각 메서드에 [ReplaceLiteralsWithName]으로 주석을 다는 것과 같습니다.

 

삭제

난독화된 멤버인 경우 제거할 속성
• 사용 시 난독화 강화
• 코드가 다음과 같은 경우:
[커스텀("드론 실행")]
비공개 무효 SomeMethod() { ..
그런 다음 이 목록에 "Custom"을 추가하면 다음과 같이 난독화됩니다.
개인 무효 JEQQKAEFJJ() { ..
즉, [Custom] 속성이 삭제됩니다.
• "Custom"은 속성 클래스가 CustomAttribute(C# 맵
CustomAttribute에 대한 사용자 지정 및 Obfuscator가 이를 처리함)
• SomeMethod()를 건너뛰고 난독화하지 않으면 [Custom] 속성이
제거됨.
• Unity 인스펙터 창 또는
메서드 또는 클래스가 수행한 작업을 설명하는 문자열 매개변수를 사용하는 메뉴 모음입니다.
• 유형, 메소드, 매개변수, 필드, 속성 및 이벤트에 대해 작동합니다.
• Beebyte 속성은 항상 제거됩니다.
• [System.Obfuscation.Reflection] 속성도 제거되지 않는 한 제거됩니다.
StripAfterObfuscation 속성이 True로 설정됩니다.

 

보존

지정된 네임스페이스만 난독화
• 활성화되면 'Obfuscate
네임스페이스'.
• 대규모 프로젝트가 있고 점차적으로 난독화를 도입하려는 경우 유용할 수 있습니다.
재귀적으로 네임스페이스 난독화
• 활성화되면 하위 네임스페이스도 난독화됩니다.
난독화 네임스페이스
• 난독화될 네임스페이스 목록.
• 기본 네임스페이스만 난독화하려면 하이픈/마이너스 '-' 문자를 사용합니다.
재귀적으로 네임스페이스 건너뛰기

활성화하면 자식 네임스페이스도 건너뜁니다.

비활성화하면 정확한 네임스페이스만 건너뜁니다.

 

Skip Namespaces

• 난독화되지 않을 네임스페이스 목록.
• 기본 네임스페이스를 제외하려면 하이픈/마이너스 '-' 문자를 사용합니다.
수업을 빠지다
• 난독화되지 않을 클래스 목록.
• [건너뛰기]로 클래스에 주석을 추가하는 것과 같습니다.
Unity 메소드
• MonoBehaviour에서 파생된 클래스에 존재하는 여기에 선언된 메서드는
난독.
• 선언된 메서드가 클래스에 있는 경우 [SkipRename]으로 주석을 다는 것과 같습니다.
MonoBehaviour에서 파생되었습니다.
• 리플렉션을 사용하여 찾은 이벤트 스타일 메서드만 여기에 선언해야 합니다. 있다
기본 클래스에서 확장된 메서드를 선언할 필요가 없습니다(그러나 해를 끼치지는 않음).

 

Preserve Prefixes

• 선언된 문자열로 시작하는 메소드는 난독화할 때 이를 마스크로 사용합니다.

• 메서드가 특정 문자열로 시작해야 하는 자산에 유용합니다.

 

 

대체 속성 이름

목록 중 하나에 선언된 모든 속성은 Beebyte.Obfuscator 속성으로 처리됩니다. 짝.

• 예를 들어 이름 바꾸기 건너뛰기 목록에 JsonProperty를 추가하면 더 이상 주석을 달지 않아도 됩니다. [JsonProperty]가 이미 있는 경우 [SkipRename]이 있는 각 속성.

 

 

Attributes

 

.net frame work

[System.Reflection.Obfuscation]

• [Skip]와 동일

 

[System.Reflection.Obfuscation(ApplyToMembers=false)]

• [SkipRename]과 동일

 

[System.Reflection.Obfuscation(제외=거짓)]

• Obfuscator가 주석이 없는 대상을 난독화하도록 지시합니다. 그렇지 않으면 그렇게 했습니다.

• Obfuscator가 이름을 바꾸면 확실히 실패한다는 것을 알고 있으면 무시됩니다.

 

Beebyte.Obfuscator
[Skip]
• Obfuscator가 대상이나 그 자식을 난독화하지 않도록 지시합니다.
• 클래스, 메소드, 인터페이스, 구조체, 필드, 매개변수, 이벤트, 열거형,
속성 및 대리자.
• 클래스에서 사용하는 경우 옵션의 "클래스 건너뛰기" 목록에서 선언하는 것과 같습니다.
[SkipRename]
• Obfuscator가 대상의 이름을 난독화하지 않도록 지시하지만 어린이는
난독.
• 클래스, 메소드, 인터페이스, 구조체, 필드, 매개변수, 이벤트, 열거형,
속성 및 대리자.
[ReplaceLiteralsWithName]
• 난독화 어셈블리 내의 모든 문자열 리터럴을 대체하도록 Obfuscator에 지시합니다.
대상의 이름을 새로 난독화된 이름과 일치시킵니다.
• 클래스, 메서드, 인터페이스, 구조체, 필드, 속성, 이벤트, 열거형 및
대리인.
[Rename]
• Obfuscator가 대상의 이름을 이 매개변수에 전달된 인수로 변경하도록 지시합니다.
주석.
• 클래스, 메서드, 인터페이스, 구조체, 필드, 속성, 열거형 및 대리자에서 사용할 수 있습니다.
[ObfuscateLiterals]
• Obfuscator가 내부에 선언된 모든 문자열 리터럴에 문자열 난독화를 적용하도록 지시합니다.
주석이 달린 메소드 또는 클래스.
• 메서드 및 클래스에서 사용할 수 있습니다.
• 람다 식 내에서 리터럴을 난독화하려면 이 주석을 다음과 같이 지정해야 합니다.
클래스 수준에서 사용됩니다.
[DoNotFake]
• Obfuscator가 지정된 대상에 대해 가짜 메서드를 생성하지 않도록 지시합니다.
• 클래스 또는 개별 메서드에서 사용 가능합니다.
• 하나의 거대한 방법에 이것을 사용하여
파일 크기에 너무 많은 영향을 미치지 않으면서 더 작은 방법을 위한 많은 가짜 방법. 하지만
큰 메서드를 새 클래스와 메서드로 리팩토링하는 것을 강력히 고려해야 합니다.
더 깨끗한 코드와 더 강력한 난독화 결과를 위해.
[SuppressLog]
• 대상에 대해 Obfuscator에서 지정된 경고 메시지가 출력되는 것을 방지합니다.
에 적용됩니다.

 

자산 호환성

Beebyte는 이러한 제품 또는 회사와 관련이 없습니다.

안티 치트 툴킷
이 플러그인은 코드 변조 및 메모리 조작 및 보완을 방지하는 데 중점을 둡니다.
Obfuscator 잘. 변경할 필요가 없으며 ACTK_EXCLUDE_OBFUSCATION은 변경할 필요가 없습니다.
정의되어 있으므로 간단히 설치하고 즐기십시오!

NGUI 2
조치가 필요하지 않습니다.
Obfuscator 옵션 내의 기본 설정은 이미 다음 메서드에서 이 자산을 처리합니다.
"Replace Literals" 섹션에 추가되는 이름:

 OnHover
 OnSelect
 OnInput
 OnScroll
 OnKey
 OnPress
 OnDrag
 OnClick
 OnDoubleClick
 OnDrop
 OnTooltip
 
Behaviour 디자이너
 공유 변수는 이름이 같아야 하므로 주석을 추가하는 경우 주의하십시오.
[SkipRename] 또는 [Rename("someCrypticName")] 및 다른 인스턴스에 주석을 추가하는 것을 잊지 마십시오.
같은 주석으로.
 생성한 작업에는 [SkipRename]으로 주석이 달린 클래스가 있어야 합니다.
 behaviorTree.GetVariable("MyVariable") 또는 이에 상응하는 Set 메서드를 사용하는 경우
변수 정의에 [SkipRename] 또는 [ReplaceLiteralsWithName]을 추가해야 합니다.

 

Odin

코드 스트리핑을 피하기 위한 AOT 생성
자산 스트리핑을 방지하기 위해 AOT Generation을 활성화한 경우 다음과 같은 문제가 발생할 수 있습니다.
다음 오류:
'System.Void' 메서드에 대한 IL2CPP 오류
Sirenix.Serialization.AOTGenerated.PreventCodeStrippingViaReferences::.cctor()'
어셈블리 '<project_dir>\Temp\StagingArea\assets\bin\Data\Managed\
Sirenix.Serialization.AOTGenerated.dll'
추가 정보: 대상에서 예외가 발생했습니다.
기도.
...
...
...
처리되지 않은 예외:
System.Reflection.TargetInvocationException: 예외가 발생했습니다.
호출 대상. ---> System.InvalidOperationException: 할 수 없음
어셈블리에서 'SomeType' 형식에 대한 참조를 확인합니다.
'Sirenix.Serialization.AOTGenerated, 버전=0.0.0.0, 문화=중립,
PublicKeyToken=null'. 이 유형이 다른 어셈블리에 존재합니까?
프로젝트?
이것은 Odin이 유형에 대한 원본 참조를 포함하는 DLL을 생성하고
Obfuscator는 이 생성된 DLL을 일반 DLL과 함께 난독화하도록 지시하지 않았습니다.
이 문제를 해결하려면 두 가지 중 하나를 수행해야 합니다.
빌드 후 이 DLL을 삭제하도록 Odin을 구성한 경우(선호)
내 어셈블리에 Plugins/Sirenix/Assemblies/AOT/Sirenix.Serialization.AOTGenerated.dll 추가
Obfuscator의 옵션:

또는 이 생성된 DLL을 삭제하지 않도록 Odin을 구성한 경우 빌드한 다음 대신 Plugins/Sirenix/Assemblies/AOT/Sirenix.Serialization.AOTGenerated.dll을 추가해야 합니다. 컴파일된 어셈블리 섹션으로:

Editor Windows Serialization

Odin의 Editor 직렬화를 사용하는 경우(Odin을 사용하는 경우 가능성이 높음) 첫 번째 단계로 공개 필드의 난독화를 비활성화하는 것이 좋습니다.

더 난독화된 솔루션의 경우 이 기능을 다시 활성화하고 싶지만 모든 이름은 보존합니다.
bool[,] 또는 Dictionary<a, b> 등과 같이 Odin에 의해 직렬화되는 SerializedMonoBehaviour 필드
또한 SerializedMonoBehaviour 필드의 유형으로 사용되는 모든 클래스의 필드 이름은
도 보존됩니다. 예를 들어
using System.Collections.Generic;
using Beebyte.Obfuscator;
using Sirenix.OdinInspector;
namespace Astral
{
	public class SolarSystem : SerializedMonoBehaviour
 	{
 		[SkipRename] // This is required if obfuscating public MonoBehaviour field names
 		public Dictionary<string, Planet> planets;
 	}
 	public class Planet
 	{
 		[SkipRename] // This is ALWAYS required if obfuscating public fields
 		public int Radius;
 	}
}
직렬 변환기
Odin의 SerializationUtility.SerializeValue(..) 또는 SerializationUtility.DeserializeValue(..)를 사용하는 경우
메소드에서 직렬화 가능한 클래스에 [Serializable] 주석을 추가하는 것이 중요합니다. 이 때문입니다
Odin의 직렬화 메커니즘(다른 많은 것과 마찬가지로)은 결과에 클래스 및 필드 이름을 포함합니다.
바이너리 데이터 파일.
[Serializable]은 Obfuscator가 클래스 이름과 필드 이름 모두의 이름 바꾸기를 건너뛰도록 지시합니다.

 

UFPS

vp_Timer.CancelAll("SomeMethod")을 사용하는 경우 [SkipRename]을 추가하거나 SomeMethod 정의의 [ReplaceLiteralsWithName]. 난독화에서 핵심 UFPS 스크립트를 제외하도록 선택한 경우 다음을 추가해야 합니다. 핵심 UFPS에서 발생하는 메서드 이벤트의 [SkipRename], 즉 클래스를 만들고 OnStart_Reload 메서드를 정의하려면 해당 메서드에서 [SkipRename]을 사용하고 싶을 것입니다. 메모 생성한 클래스가 원래 UFPS 클래스에서 명시적으로 상속되는 경우 이 단계는 필수의. UFPS 리플렉션 콜백을 수용하기 위해 Preserve Prefixes 내에서 기본값이 설정되었습니다. 온메시지_ 온밸류_ OnAttempt_ 캔스타트_ 캔스톱_ 시작_ 온스톱_ 실패 시작_ OnFailStop

 

Photon

Photon은 열거형과 함께 ToString()을 자주 사용하므로 열거형을 난독화하기로 선택한 경우 다음을 확인하십시오.
PhotonNetwork/Enums.cs에서 열거형을 건너뜁니다. 더 난독화 된 접근 방식을 위해 주석을 달 수 있습니다.
대신 [SkipRename]을 사용하여 각 열거형 값을 지정합니다.
 'ExitGames' 및 'Photon'의 기본값이 건너뛴 네임스페이스 목록에 추가되었습니다.
 편의를 위해 건너뛸 열거형 목록을 포함하도록 기본 설정이 업데이트되었습니다.
 
 CloudRegion 코드
 PhotonNetworking메시지
 PhotonLogLevel
 PhotonTargets
 CloudRegionFlag
 연결 상태
 암호화 모드
 EncryptionDataParameters
 클라이언트 상태
 클라이언트 상태/조인 유형
 연결 끊기 원인
 서버 연결
 매치메이킹 모드
 조인모드
 수신기 그룹
 이벤트 캐싱
 속성 유형 플래그
 로비 유형
 인증 모드 옵션
 사용자 정의 인증 유형
 PickupCharacterState
 캐릭터 상태
 OnSerializeTransform
 보기동기화
 OnSerializeRigidBody
 소유권 옵션
 조인 유형
 OpJoinRandomRoomParams
 기본

 

Mirror

• 네트워크 동작
문자열 리터럴을 난독화하는 경우 [ObfuscateLiterals] 주석을 클래스 수준에 적용합니다.
[ClientRpc] 메서드에 [ObfuscateLiterals]를 적용하는 것만으로는 충분하지 않습니다.
자산은 주석을 복제하지 않고 메서드를 복제합니다.

 

Troubleshooting

 

내 게임의 일부가 더 이상 작동하지 않습니다!

특정 플러그인과 관련된 문제를 알고 있다면 해당 플러그인을 추가하는 것을 고려할 수 있습니다.
네임스페이스 건너뛰기 목록에 네임스페이스:

이렇게 하면 해당 플러그인의 코드가 프로젝트 코드와 함께 컴파일되는 문제를 해결할 수 있습니다. 일반적으로
플러그인은 어떤 식으로든 리플렉션에 의존합니다.
크고 복잡한 프로젝트를 난독화하는 경우에는 작은 옵션 세트만 활성화(예:
난독화하는 클래스 이름으로 시작한 다음 점차적으로 더 많은 옵션을 다시 도입하십시오.
Skip을 사용하여 전체 네임스페이스가 난독화되는 것을 방지하도록 선택할 수 있습니다.
옵션의 네임스페이스 섹션.

 

직렬화

Obfuscator는 [Serializable]의 클래스 및 필드 이름을 건너뛸 것입니다.
직렬화 된 클래스 및 필드 이름은 종종 데이터에 기록되고 이를 난독화하면
역직렬화할 때 기존 데이터가 더 이상 일치하지 않아 오류가 발생함을 의미합니다. 마찬가지로, 만약
임의의 시드가 변경되면 새로운 난독화된 이름이 더 이상 이전 데이터와 일치하지 않습니다.
오래된 이름이 포함되어 있습니다.
일부 직렬화 구현(예: protobuf)은 이에 대한 좋은 예외가 될 수 있습니다.
(구현에 따라 다름). 그들의 디자인은 클래스와 필드에 독립적일 수 있기 때문에
이러한 클래스의 난독화를 강제 실행하기로 결정할 수 있는 이름은 다음을 사용하여 수행할 수 있습니다.
수행원:
[System.Reflection.Obfuscation(Exclude = false, ApplyToMembers = true)]
public class MyProtobufClass {
}
일반적으로 Obfuscator가 무언가에 주석을 달아 난독화하도록 할 수 있습니다.
[System.Reflection.Obfuscation(제외=거짓)].
ScriptableObjects는 같은 방식으로 직렬화 가능으로 처리되지만 확실하다면 강제할 수도 있습니다.
ScriptableObjects의 직렬화 부분을 사용하지 않습니다. ScriptableObjects의 경우 다음을 수행할 수 있습니다.
숨겨진 옵션을 설정하도록 선택하십시오. options.treatScriptableObjectsAsSerializable = false; 너의
속성을 사용하는 대신 ObfuscatorOptions.asset 파일을 사용합니다.
난독화를 강제하면 런타임 오류가 발생할 수 있으므로 강력한 테스트를 수행하는 것이 좋습니다.

 

AssemblyResolutionException

이것은 Obfuscator가 기본적으로 참조된 DLL을 찾을 수 없음을 의미합니다. 다음을 확인하십시오.
• DLL의 파일 경로를 추가하여 이 DLL을 찾을 위치를 Obfuscator에 지시할 수 있습니다.
또는 Obfuscator 옵션에 정의된 "참조된 어셈블리" 목록에 대한 디렉토리
어셈블리 섹션.
Obfuscator는 이제 참조를 찾을 때 해당 파일 또는 디렉토리를 고려합니다.
어셈블리.
• 이름이 변경된 DLL은 기본적으로 Obfuscator가 찾기 어려운 경우가 있습니다.
그러나 파일 경로를 "참조된 어셈블리"에 추가하면 이 문제가 해결됩니다.
• 기본(PipelineHook.cs) 이외의 사용자 정의 빌드 프로세스를 사용하는 경우 찾을 수 있습니다.
와 같은 전화를 걸기에 적절한
Obfuscator.AppendReferenceAssemblies(
 AssemblyReferenceLocator.GetAssemblyReferenceDirectories().ToArray()
);
Obfuscate() 호출 전에.

 

Moving file failed

이는 이전 Unity 버전(2018.1 및
더 오래된).
이름 패딩 구분 기호를 재설정해 보십시오(또는 파일 형식 친화적인 문자로 변경).

오류가 계속 발생하면 문자 코드도 변경하십시오.

 

MonoSymbolFileException

 

이 오류가 발생하면 가능한 한 많은 정보를 이메일로 보내
Unity 버전, 빌드 대상 및 실행 여부를 포함한 support@beebyte.co.uk
개발 모드.
"모든 방법에서 리터럴 난독화" 옵션이 활성화된 경우 발생하는 것으로 알려져 있습니다.
효과가 있을 수 있는 해결 방법은 Postbuild.cs 파일을 편집하고 다음을 만드는 것입니다.
IgnoreSymbols 호출:

Obfuscator.IgnoreSymbols(true);
Obfuscator.Obfuscate(dll, compiledDll, _options,EditorUserBuildSettings.activeBuildTarget);

또는 "모든 방법에서 리터럴 난독화" 옵션을 비활성화합니다.

 

빌드 프로세스에서 난독화하는 데 너무 오래 걸립니다.

범인은 거의 항상 "가짜 코드"입니다. 옵션 내에서 값을 줄이는 것을 고려하거나 비활성화하십시오.
그것.
난독화하는 데 여전히 오랜 시간이 걸리는 경우 다음을 호출하여 원인을 더 명확하게 알 수 있습니다.
Obfuscator.SetPrintChronology(true) Obfuscate() 호출 직전입니다(Postbuild.cs 참조). 그런 다음
빌드가 성공하면 성공 메시지에 추가 정보가 표시됩니다.

 

Android에서 보낸 메시지가 작동하지 않음

Java 코드에 다음이 있는 경우:
그런 다음 [SkipRename]을 사용하여 C# 프로젝트 내에서 OnSayHello 메서드에 주석을 달아야 합니다.
Obfuscator에게 해당 메서드를 그대로 두도록 지시합니다.


건너뛸 익명 Class가 필요합니다.

소스 코드에서 익명 클래스는 여기에 표시된 'anon' 변수처럼 보입니다.

public class NewBehaviourScript : MonoBehaviour
{
	public Text uiTextPanel;
 
	void Start()
 	{
 		var anon = new {count = 1};
 
 		uiTextPanel.text = anon.ToString();
 	}
}

컴파일되면 <>__AnonType0`1과 같은 이름이 지정됩니다.
이러한 익명 클래스를 건너뛰어야 하는 경우 "Equivalent
건너뛰기 속성" 섹션:
System.Runtime.CompilerServices.CompilerGenerated
이것은 익명 클래스에 [CompilerGenerated] 특성이 적용되기 때문에 작동합니다.

 

I need help!

어려움을 겪고 있고 이 문서에서 답을 찾지 못했거나
버그가 있는 경우 support@beebyte.co.uk로 이메일을 보내 다음 정보를 포함하십시오.
• Asset Store 구매에 대한 판매 주문 번호 또는 송장 번호
• Unity IDE 버전
• 난독화 버전
• 빌드 대상(예: Windows 독립 실행형, Android를 구축할 플랫폼)
• 알고 있는 경우 백엔드 스크립팅(Mono 또는 IL2CPP)
• 예외가 표시되면 전체 스택 추적을 제공하십시오.
Obfuscator에서 버그를 발견했다고 생각되면 다음을 수행할 수 있는 새로운 작은 프로젝트를 제공합니다.
문제를 재현하는 것은 매우 유용하고 높이 평가됩니다.

 

 

 

직접 찾아낸 점

 

MonsterLove State 머신을 사용한다면

이런식으로 enum 값을 통해서 함수가

생성 되니까 [SkipRename] 을 enum 과

함수 위에 붙여주면 정상동작

    [SkipRename]
    protected enum States
    {
        Idle,
        Run,
    }
    
    protected StateMachine<States, StateDriverUnity> m_Fsm;

    [SkipRename]
    protected void Idle_Enter()
    {

    }

    [SkipRename]
    protected void Run_Enter()
    {

    }

 

 

 

 

 

 

728x90

댓글