Запутывающее собрание и отражение - PullRequest
7 голосов
/ 15 сентября 2011

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

Если вам нужно больше деталей, пожалуйста, скажите мне

Ответы [ 4 ]

8 голосов
/ 15 сентября 2011

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

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

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

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

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

2 голосов
/ 15 сентября 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

1 голос
/ 15 сентября 2011

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

0 голосов
/ 09 марта 2018

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

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

  1. Нагрузка в сборе
  2. GetTypes из загруженной сборки
  3. PreObfuscation удаляет все записи и заново записывает индексы и значения OriginalType. PostObfuscation обновляет ObfuscatedType по индексу. События после сборки должны быть следующими:
    1. Mapper.exe "target.exe" "Предварительно"
    2. [Затемнение]
    3. Mapper.exe "target.exe" "Пост"

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

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

OriginalAssembly.GetTypes()

и

ObfuscatedAssembly.GetTypes()
...