C# обфускация на уровне исходных текстов?

Общие вопросы о Unity3D

Re: C# обфускация на уровне исходных текстов?

Сообщение nourtdinov 24 май 2017, 07:28

Для обфускации можно использовать обфускатор DevXUnity Obfuscator по ссылке http://unity3d.netobf.com/Download
он офусцирует в режиме реального времени (измелили скрипт обфускация сразу сработала) а не только при формировании билда, сразу можно учитывать нюансы процесса обфускации и обходить их..

Кроме самого процесса переименования классов, функций полей и т.п. позволяет
- запутывать сам код функций - превращает в такой вид что понять логику работы уже становится не реальным..
- шифровать строки
- шифровать ресурсные файлы (resources assets). Текстовые файлы, изображения, или как бинарные данные
- защищать данные используемые через PlayerPrefs (скрывает реальные имена, шифрует содержимое)
- механизм полной автоматической локализации проекта (как элементов сцены так и кода) с поддержкой авто перевода на выбранные языки.
- и поддержка всех платформ

Изображение
nourtdinov
UNец
 
Сообщения: 13
Зарегистрирован: 20 янв 2017, 17:25
  • Сайт

Re: C# обфускация на уровне исходных текстов?

Сообщение Dewa1s 24 май 2017, 08:31

кхм,а при обфускации в реальном времени отладчик-то не отвалится?
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12

Re: C# обфускация на уровне исходных текстов?

Сообщение nourtdinov 24 май 2017, 13:50

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

Зато отлаживается именно то что будет в конце, иначе люди будут просто сталкиваться с тем, что не учли нюансы обфускации при попытке сделать дистрибутив (или запустить ее)

Если процесс обфускации пока не нужен (на момент разработки каких то частей), он просто отключается галочкой.
Последний раз редактировалось nourtdinov 26 май 2017, 07:13, всего редактировалось 1 раз.
nourtdinov
UNец
 
Сообщения: 13
Зарегистрирован: 20 янв 2017, 17:25
  • Сайт

Re: C# обфускация на уровне исходных текстов?

Сообщение seaman 25 май 2017, 11:09

1. Он что все же обфусцирует исходники? Если да -как с ними тогда работать? Если нет - с чего Вы его тут выложили?
2. Обфускация "на лету" это весьма странно и нормально возможно только под PC версию. Я проводил исследования.
Юнити компилирует все исходники дважды. Первый раз на лету при их изменении. Этот процесс можно перехватить и сделать с получившейся сборкой что хочешь. Эти сборки лежат в четком месте: project\Library\ScriptAssemblies\ Я эту возможность хотел использовать для реализации АОП в Юнити инжекцией кода. В общем вполне успешно.
Однако при окончательной сборке проекта оказалось, что Юнити не использует те сборки, которые уже откомпилированы. Она все компилирует с нуля. Если речь идет о Стендэлон PC версии - можно после компиляции проекта запустить автоматом утилиту и инжектировать что хочешь - там обычный CIL. Однако для остальных платформ так не получится.
Возможно было бы для любых платформ, если бы Юнити использовала уже готовые сборки при преобразовании под другие платформы. Или если бы можно было перехватить момент, когда Юнити их заново скомпилировала, но еще не запустила преобразование il2cpp (или аналогичные)
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: C# обфускация на уровне исходных текстов?

Сообщение nourtdinov 26 май 2017, 07:09

seaman писал(а):1. Он что все же обфусцирует исходники? Если да -как с ними тогда работать? Если нет - с чего Вы его тут выложили?
2. Обфускация "на лету" это весьма странно и нормально возможно только под PC версию. Я проводил исследования.
Юнити компилирует все исходники дважды. Первый раз на лету при их изменении. Этот процесс можно перехватить и сделать с получившейся сборкой что хочешь. Эти сборки лежат в четком месте: project\Library\ScriptAssemblies\ Я эту возможность хотел использовать для реализации АОП в Юнити инжекцией кода. В общем вполне успешно.
Однако при окончательной сборке проекта оказалось, что Юнити не использует те сборки, которые уже откомпилированы. Она все компилирует с нуля. Если речь идет о Стендэлон PC версии - можно после компиляции проекта запустить автоматом утилиту и инжектировать что хочешь - там обычный CIL. Однако для остальных платформ так не получится.
Возможно было бы для любых платформ, если бы Юнити использовала уже готовые сборки при преобразовании под другие платформы. Или если бы можно было перехватить момент, когда Юнити их заново скомпилировала, но еще не запустила преобразование il2cpp (или аналогичные)


1) он обфусцирует сборки которые компилируются из исходников + сборки которые присутствуют как готовые dll (опционально)
и именно на лету, как поменяли что то, и unity решил их скопилировать, обфусатор проделает свою работы синхронно, он встраивается в цепочку и становится частью механизма формирования сборки в Unity

2) Обфускация на лету имеется ввиду что при любой компиляции средой unity (будь то компиляция для работы внутри редактора, или же создание сборки дистрибутива под любую платформу)

сборки которые компилируются в Unity действительно лежат в project\Library\ScriptAssemblies\ однако их менять, когда они уже готовы - бесполезно, т.к. Unity их не будет использовать для формирования сборок под платформы
- как только что то в скриптах поменялось и переключились на Unity он перекомпилирует сборки (в директории project\Temp) загрузит в память новую сборку а копию кинет в каталог project\Library\ScriptAssemblies\ но сам не будет на замену этих сборок реагировать
- при формировании дистрибутивов под платформы Unity по новой все перекомпилирует (с опциями под платформу) и сразу все это дело запакует в дистр (т.е. перехватить промежуточный вариант для замены простыми средствами не выйдет)

для PC платформы можно конечно потом в дистибутиве обфусцировать найденную Dll, для APK можно то при большом желании проделать, но вот для iOS и тому подобных платформ это не выйдет (поэтому и нужна обфускация на лету)

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

Таким образом получаем обфускацию с поддержкой всех платформ..

Плюс помогают повысить уровень защиты встроенные в обфускатор:
- механизмы шифрования (строки, картинки, бинарные данные),
- полностью автоматизированная локализация под разные языки
- авто перевод на выбранные - для пред-просмотра (сразу видно как будет выглядеть на китайском:)
- проверка арфографии
- шифрование строк
- запутывание самого кода функций (не путать с переименованием) когда код становится очень трудно анализируемым (когда нужно скрыть алгоритмы) из за перемешивания логики выполнения кода.
и тп.
nourtdinov
UNец
 
Сообщения: 13
Зарегистрирован: 20 янв 2017, 17:25
  • Сайт

Re: C# обфускация на уровне исходных текстов?

Сообщение seaman 26 май 2017, 13:00

Все это здорово.
Вот только я - увы так и не понял как этого добились Вы. Как перехватили компиляцию при сборке дистрибутива? Сами же пишете - "(т.е. перехватить промежуточный вариант для замены простыми средствами не выйдет)". Намекните - какими "непростыми", если не тайна.
Единственная возможность, которую вижу я - замена компилятора. Аналогично поступил alexzzzz для поддержки в Юнити фич C# 7 (почти всех). Вот с другим компилятором по идее можно на лету и обфусцировать и все остальное. Только это - возможная несовместимость с самой Юнити!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: C# обфускация на уровне исходных текстов?

Сообщение nourtdinov 26 май 2017, 13:47

seaman писал(а):Все это здорово.
Вот только я - увы так и не понял как этого добились Вы. Как перехватили компиляцию при сборке дистрибутива? Сами же пишете - "(т.е. перехватить промежуточный вариант для замены простыми средствами не выйдет)". Намекните - какими "непростыми", если не тайна.
Единственная возможность, которую вижу я - замена компилятора. Аналогично поступил alexzzzz для поддержки в Юнити фич C# 7 (почти всех). Вот с другим компилятором по идее можно на лету и обфусцировать и все остальное. Только это - возможная несовместимость с самой Юнити!


Сделано подменой компилятора на свою прослойку (динамически), а она уже вызывает стандартную компиляцию и потом обфускацию, аналогично встраивают поддержку своих компиляторов (в том числе и для C# 7 скорее всего alexzzzz использует тот же принцип)
но несовместимости с юнити не возникает, тк все равно итого используется стандартный компилятор (C#, Boo, UnityScript, MS C#), я лишь в конце делаю обфускацию.

Естественно в новых версиях Unity механизмы встраивания могут меняться и нужно обновлять эту часть,
в Unity 2017.1 как раз было изменение по сравнению с 5.6, и в последней версии обфускатора уже работает и на ней.
nourtdinov
UNец
 
Сообщения: 13
Зарегистрирован: 20 янв 2017, 17:25
  • Сайт

Re: C# обфускация на уровне исходных текстов?

Сообщение seaman 26 май 2017, 15:11

Ясно. Спасибо большое!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Пред.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26