Объркайте вашия C# код в Unity3d

В тази статия пиша за това как можете да объркате вашия C# код в Unity3d. Както вероятно вече знаете, кодът на вашия C# скрипт се съхранява в .dll файл и този файл може лесно да бъде декомпилиран и прочетен точно като отворена книга. Почти невъзможно е да попречите на някой да направи обратно инженерство на вашия код, всеки, който е получил приложението ви, ще може да го направи. Можете обаче да направите по-трудно за някого да прочете кода ви, като го объркате.

Ако не знаете какво е обфускация, тогава можете да прочетете за него тук, а източникът може да бъде изтеглен тук.

Честно казано, за повечето приложения това ще бъде загуба на време, тъй като е много малко вероятно някой да погледне кода ви и да се опита да го хакне/открадне. И не забравяйте, че ако някой наистина иска да го направи, той ще го направи, всичко е само въпрос на време.

Така че все още искате да обфускирате кода си и може да се чудите защо е толкова трудно? Има толкова много страхотни програми за обфускиране на .net код.

Е, това е доста лесно, стига да правите възможно най-много от код и да използвате Unity GUI възможно най-малко. Защо? Основно има два основни проблема с обфускацията и Unity.

Ако започнем да прикачваме скриптове към GameObjects чрез плъзгане и пускане в GUI, скриптът и GameObject ще бъдат строго въведени. Това означава, че ако обфусцираме име на клас на скрипт, обвързан с GameObject, Unity вече няма да може да намери прикачения скрипт. Така че ще разрешим това, като заредим всички готови модули при първото стартиране на приложението и прикачим нашите скриптове.
Въпреки това, в Unity винаги трябва да има поне един скрипт на сцена, ние ще наричаме тези скриптове контролери, така че Scene1Controller, Scene2Controller и така нататък.
Няма да можем да скриваме имената на класовете на контролера, но все още можем да скриваме техните методи и свойства.

Проблем номер две е, че събитията в нашите обекти MonoBahavior също не са строго типизирани, например:

void Update()
{
 //Some code
}

ще стане нещо подобно

void T20()
{
 //Some code
}

след обфускация и следователно събитието Update няма да се задейства на този обект.

Затова искаме да ограничим количеството свободно въведени събития в нашия код и вместо това да използваме наши собствени строго въведени събития.

Не, нека започнем със създаването на класа BahaviorEventBinder.

public class BahaviorEventBinder : MonoBehaviour
{
   public event UpdateExecutedDelegate OnUpdateExecuted;
   public delegate void UpdateExecutedDelegate(); 
   public event OnEnableDelegate OnEnableExecuted;
   public delegate void OnEnableDelegate(); 
   public event OnDisableDelegate OnDisableExecuted;
   public delegate void OnDisableDelegate();
   void Update()
   {
      if (OnUpdateExecuted != null)
      {
         OnUpdateExecuted();
      }
   }
   void OnEnable()
   {
      if (OnEnableExecuted != null)
      {
         OnEnableExecuted();
      }
   }
   void OnDisable()
   {
      if (OnDisableExecuted != null)
      {
         OnDisableExecuted();
      }
   }
}

Всички наши MonoObjects ще наследят от този клас и този клас съдържа свободно въведен код. Така че този клас може да бъде обфусциран, но се уверете, че свободно въведените функции (Update, OnEnable и OnDisable) ще запазят имената си.

Сега продължете напред и създайте MonoBahavior, който наследява от нашия BahaviorEventBinder:

public class MyMonoBahavior : BahaviorEventBinder
{
    public MyMonoBahavior()
    {
       OnEnableExecuted += MyMonoBahavior_OnEnableExecuted;
       OnUpdateExecuted += MyMonoBahavior_OnUpdateExecuted;
       OnDisableExecuted += MyMonoBahavior_OnDisableExecuted;
    }
    private void MyMonoBahavior_OnEnableExecuted()
    {
       // On enable code goes here
    }
    private void MyMonoBahavior_OnUpdateExecuted()
    {
      // On update code goes here
    }
    private void MyMonoBahavior_OnDisableExecuted()
    {
      // On disable code goes here
    }
}

Нашето MonoBahavior вече е безопасно за замъгляване.

Сега се нуждаем от нещо, което ще свърже скрипта MyMonoBahavior с коригирането на prefab, тъй като след обфускацията MyMonoBahavior ще бъде наречен другояче.

public class MyMonoBahaviorRegistrator
{
    public void Registrate()
   {
      var gm = Resources.Load<GameObject>(“MyPrefab”);
      var s = gm.GetComponent<MyMonoBahavior>();
      if (s == null)
      {
         s = gm.AddComponent<MyMonoBahavior>();
      }
   }
}

Така че, когато се извика Registrate, ние ще заредим Prefab на моя MyMonoBahavior и ако не скриптът вече е прикачен (което няма да е първият път, когато стартираме приложението), ще добавим скрипта към prefab. Когато извикаме AddComponent, скриптът ще бъде добавен за постоянно към prefab. Така че дори ако затворим приложението и го рестартираме, скриптът пак ще бъде там, така че ако изречението е наистина важно.

Сега всичко, което трябва да направим, е да създадем клас контролер, който ще извика MyMonoBahaviorRegistrator.Registrator();
Това трябва да стане в първата сцена, така че ще наречем този скрипт Scene1Controller.
Името на класа Scene1Controller не може да бъде обфусцирано, тъй като трябва да бъде поставено в сцената.

public class Scene1Controller : BahaviorEventBinder
{
    public Scene1Controller()
    {
       OnEnableExecuted += Scene1Controller_OnEnableExecuted;
    }
    private void Scene1Controller_OnEnableExecuted()
    {
       new MyMonoBahaviorRegistrator().Registrate();
    }
}

Това е в общи линии! Сега вашият код трябва да е безопасен за обфускация, обикновено използвам SharpObfuscator, за да обфускавам кода си.

Не забравяйте да не объркате името на класа на Scene1Controller. В BahaviorEventBinder всичко може да бъде обфусцирано, освен свободно въведените имена на методи.

За да объркате, първо трябва да изградите проекта. В този случай го създадох като самостоятелно приложение за Windows. Намерете dll файла (/{името на приложението}_Data/Managed/Assembly-CSharp.dll) и го затъмнете.

Ако работите с android или iOS, първо трябва да извлечете .dll файла (и .apk, и .ipa са zip файлове, така че можете да ги отворите с winRar), да замажете .dll файла и след това да върнете замаскирания файл обратно.

Ако сте изпълнили тези стъпки правилно, вашият код трябва да работи без проблем.

За да проверите дали вашата сборка е обфусцирана, препоръчвам да използвате iLSpy.

Играта ZMBIS (Android) е разработена по този метод и е напълно обфусцирана. Изтеглете играта и я декомпилирайте и ще видите.

Източник

„Може да се изтегли тук“.

Не забравяйте да ме последвате в twitter.

BTC

1CGu9Ctt1AuyXiWMJ2nEDoH1RRAKtStdjx

ETH

0xd2291b554075da7f61210db2648a7f0a2d006190