Обфускируйте свой код C # в Unity3d

В этой статье я пишу о том, как можно скрыть свой код C # в Unity3d. Как вы, наверное, уже знаете, ваш код сценария C # хранится в файле .dll, и этот файл можно легко декомпилировать и прочитать, как открытую книгу. Практически невозможно запретить кому-либо реконструировать ваш код, любой, кто получил ваше приложение, сможет это сделать. Однако вы можете затруднить чтение вашего кода, запутав его.

Если вы не знаете, что такое обфускация, вы можете прочитать об этом здесь, а исходный код можно скачать здесь.

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

Итак, вы все еще хотите запутать свой код и можете задаться вопросом, почему это так сложно? Существует так много отличных программ для обфускации кода .net.

Что ж, это довольно просто, если вы делаете как можно больше из кода и как можно реже используете графический интерфейс Unity. Почему? По сути, есть две основные проблемы с обфускацией и Unity.

Если мы начнем прикреплять скрипты к GameObject путем перетаскивания в графический интерфейс, скрипт и 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();
      }
   }
}

Все наши MonoObject наследуются от этого класса, и этот класс содержит слабо типизированный код. Таким образом, этот класс можно запутать, но убедитесь, что слабо типизированные функции (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 с исправлением префаба, поскольку после обфускации 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, мы загружаем префаб моего MyMonoBahavior, и если скрипт уже не прикреплен (что не будет при первом запуске приложения), мы добавим скрипт в префаб. Когда мы вызываем AddComponent, скрипт будет постоянно добавлен в префаб. Таким образом, даже если мы закроем приложение и перезапустим его, скрипт все равно будет там, так что если предложение действительно важно.

Теперь все, что нам нужно сделать, это создать класс контроллера, который будет вызывать MyMonoBahaviorRegistrator.Registrate ();
Это должно быть сделано в первой сцене, поэтому мы будем называть этот скрипт Scene1Controller.
Имя класса Scene1Controller не может быть запутано, так как оно должно быть помещено в сцену.

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

Вот и все! Теперь ваш код должен быть безопасен для обфускации, я обычно использую SharpObfuscator, чтобы скрыть свой код.

Помните, что не следует скрывать имя класса Scene1Controller. В BahaviorEventBinder можно обфусцировать все, кроме слабо типизированных имен методов.

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

Если вы работаете с Android или iOS, вам сначала нужно извлечь файл .dll (и .apk, и .ipa являются zip-файлами, чтобы вы могли открывать их с помощью WinRar), затемните файл .dll, а затем верните запутанный файл обратно.

Если вы выполнили эти шаги правильно, ваш код должен работать без проблем.

Чтобы проверить, не запутана ли ваша сборка, я рекомендую использовать iLSpy.

Игра ZMBIS (Android) разработана с использованием этого метода и полностью запутана. Скачайте игру и де компилируйте ее, и вы увидите.

Источник

Скачать можно здесь.

Не забывай подписаться на меня в твиттере.

BTC

1CGu9Ctt1AuyXiWMJ2nEDoH1RRAKtStdjx

ETH

0xd2291b554075da7f61210db2648a7f0a2d006190