Обфускация сборки и отражения

Я хочу запутать мои файлы сборки (*.dll, *.exe) с помощью Dotfuscator. мой вопрос в том, что если я сделаю это, смогу ли я по-прежнему использовать классы и типы, которые есть в этих сборках, по их первоначальным именам (я имею в виду имена до обфускации) и использовать методы System.Reflection для работы с ними?

Если вам нужна дополнительная информация, сообщите мне


person amirhosseinab    schedule 15.09.2011    source источник


Ответы (4)


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

Если вы знаете или можете найти область, которая может использоваться с отражением, вы можете использовать

[global::System.Reflection.Obfuscation(Exclude=true, Feature="renaming")]

Это скажет обфускатору сохранить имя.

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

person Patrick Desjardins    schedule 15.09.2011

Прочтите, например, здесь http://msdn.microsoft.com/en-us/library/ms227298(v=vs.80).aspx Существует «режим библиотеки» для отключения запутывания общедоступных членов. В противном случае вы, вероятно, не сможете получить доступ к методам. Существует атрибут для управления запутыванием на уровне типа: http://msdn.microsoft.com/en-us/library/ms227281(v=vs.80).aspx

person xanatos    schedule 15.09.2011

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

person Asbjørn Ulsberg    schedule 15.09.2011
comment
Обычно публичные члены не запутываются (или, по крайней мере, есть возможность не запутывать публичных членов) - person xanatos; 15.09.2011
comment
@asbjornu - Есть ли способ отразить и избежать использования имени участника? - person amirhosseinab; 15.09.2011
comment
Решением (или нет) будет создание статического класса со словарем System.Type, а затем, когда вам нужно использовать отражение, получить тип из этого словаря. Так что не имеет значения, какое имя метод/класс стал после обсфукатора, у вас все еще есть ссылка на это. Конечно, если в вашей сборке имеется бесчисленное количество типов, вы получите гигантский статический класс без какого-либо шаблона проектирования, который может вызвать проблемы с производительностью в вашем приложении, а также необработанные исключения. - person Guilherme Branco Stracini; 04.07.2017

Вы можете создать свою собственную частную карту, чтобы получить новые имена из старых. Mapper должен записать таблицу сортировки на диск/db со следующей структурой: Module(executable),Index,OriginalType,ObfuscatedType

Создайте консольное приложение «Mapper», которое работает в двух режимах на основе аргумента: Приложение получит в качестве аргумента путь к исполняемому файлу.

  1. Загрузить сборку
  2. GetTypes из загруженной сборки
  3. PreObfuscation deletes all entries and writes anew the indexes and OriginalType values . PostObfuscation updates ObfuscatedType by index. The post build events must be as follows:
    1. Mapper.exe "target.exe" "Pre"
    2. [Затемнение]
    3. Mapper.exe «target.exe» «Пост»

Теперь вам нужна функция для получения ObfuscatedName из OriginalName, и все готово.

Обратите внимание, что это решение не будет работать с сокращением, так как количество типов изменится, и индексы больше не будут совпадать между

OriginalAssembly.GetTypes()

и

ObfuscatedAssembly.GetTypes()
person Cogent    schedule 09.03.2018