Объркайте вашия 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