Есть ли способ сделать условную проверку на предмет обфускации вашего кода в C #? - PullRequest
2 голосов
/ 23 марта 2011

Есть ли способ проверить, запутана ли ваша кодовая база программно?

В моем проекте я использую отражение для загрузки классов из внешней библиотеки DLL (которую я контролирую). Данные для загрузки информации (сборка и имя класса) хранятся в файле ресурсов.

Как только я запутываю проект, я не могу связать внешнюю DLL с выходным EXE-файлом (т.е. свернуть все сборки в один выходной исполняемый файл), поскольку имя сборки в файле ресурсов больше не является правильным (DLL имеет стать частью EXE). Но я должен сохранить необъяснимую функциональность и для целей отладки.

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

Ответы [ 4 ]

3 голосов
/ 23 марта 2011

Запросите информацию о типе класса, который, как вы знаете, будет запутан, и проверьте, является ли имя по-прежнему необъяснимым. В коде typeof(MyClass).Name == "MyClass" (возможно, потребуется включить пространство имен).

3 голосов
/ 23 марта 2011

Большинство Обфускаторов, таких как Dotfuscate, помещают пользовательский Атрибут уровня сборки в сборку.Если это ваш обфускатор, проверьте наличие атрибута, например:

bool foundObfuscatationAttribute = false;
foreach (object attribute in attributes)
{
    if (attribute.GetType().FullName = "DotfuscatorAttribute")
    {
        foundObfuscatationAttribute = true;
        break;
    }
}
//If found...

Поскольку мы не хотим ссылаться на сборку, которая содержит сам атрибут, мы проверяем по имени.

0 голосов
/ 03 августа 2017

Другой способ проверить, не скрыт ли сборка (dll) от Dotfuscator, без необходимости в зависимости в папке:

public static bool IsDllOfuscated(string dirFile)
{
    return Assembly.Load(File.ReadAllBytes(dirFile)).GetType("DotfuscatorAttribute") != null;        
}
0 голосов
/ 23 марта 2011

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

...