Добавить классы друзей в список исключений обфускации

Я использую Dotfuscator CE с Visual Studio 2015 Update 3 для запутывания своих сборок .Net. Мы знаем, что общедоступные типы и члены не запутываются по умолчанию. Мне любопытно узнать, как мы можем добавить классы друзей в список исключений, чтобы они не были запутаны?

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

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE dotfuscator SYSTEM "http://www.preemptive.com/dotfuscator/dtd/dotfuscator_v2.3.dtd">
<dotfuscator version="2.3">
  <propertylist>
    <property name="SourceDirectory" value="This Path Will Be Replaced By Visual Studio" />
    <property name="SourceFile" value="This Filename Will Be Replaced By Visual Studio" />
  </propertylist>
  <global>
    <option>quiet</option>
  </global>
  <input>
    <asmlist>
      <inputassembly refid="e4ca1ab5-26cb-4ab7-9621-87063f75a38f">
        <option>honoroas</option>
        <option>stripoa</option>
        <option>library</option>
        <option>transformxaml</option>
        <file dir="${SourceDirectory}" name="${SourceFile}" />
      </inputassembly>
    </asmlist>
  </input>
  <output>
    <file dir="${SourceDirectory}" />
  </output>
  <renaming>
    <option>xmlserialization</option>
    <mapping>
      <mapoutput overwrite="true">
        <file dir="${SourceDirectory}\Dotfuscated" name="Map.xml" />
      </mapoutput>
    </mapping>
    <referencerulelist>
      <referencerule rulekey="{6655B10A-FD58-462d-8D4F-5B1316DFF0FF}" />
      <referencerule rulekey="{7D9C8B02-2383-420f-8740-A9760394C2C1}" />
      <referencerule rulekey="{229FD6F8-5BCC-427b-8F72-A7A413ECDF1A}" />
      <referencerule rulekey="{2B7E7C8C-A39A-4db8-9DFC-6AFD38509061}" />
      <referencerule rulekey="{494EA3BA-B947-44B5-BEE8-A11CC85AAF9B}" />
      <referencerule rulekey="{89769974-93E9-4e71-8D92-BE70E855ACFC}" />
      <referencerule rulekey="{4D81E604-A545-4631-8B6D-C3735F793F80}" />
    </referencerulelist>
  </renaming>
  <sos mergeruntime="true">
    <option>version:v4</option>
    <option>sendanalytics</option>
    <option>dontsendtamper</option>
  </sos>
  <smartobfuscation>
    <smartobfuscationreport verbosity="all" overwrite="false" />
  </smartobfuscation>
</dotfuscator>

На самом деле у меня есть класс Model со спецификатором доступа Friend. Я публикую свой объект с помощью метода PostAsJsonAsync, например.

Dim result As HttpResponseMessage = client.PostAsJsonAsync(APIEndPoints.LOGIN, _LoginModel).Result

Вот класс друзей:

Friend Class LoginModel

    Public AccessKey As String

    Public Password As String
End Class

Метод API, который получает запрос и модель:

[HttpPost]
        [Route("authenticate")]
        public async Task<JsonResult> Authenticate([FromBody] LoginViewModel lvm)
// Here lvm.Accesskey is null

Когда API получает запрос и LoginModel, его поля пусты. Если я сделаю свою LoginModel общедоступной, она сработает. Примечание: это происходит только тогда, когда я запутываю свою DLL, в противном случае реализация работает и с классом Friend.

Также обратите внимание: классы друзей распространены в VB.Net. Они работают как общедоступные классы при доступе в сборке, но являются закрытыми вне сборки.


person Azaz ul Haq    schedule 14.02.2017    source источник


Ответы (2)


Судя по вашему разъяснению, похоже, вы хотите исключить не только имена типов Friend, но и имена полей Public в этих типах. Я истолковал ваш первоначальный вопрос как желание исключить все, что помечено как «Друг», независимо от контекста.

Важным моментом здесь является то, что, с точки зрения правил Dotfuscator, исключение типа не исключает автоматически его членов.

Вот набор правил исключения, который исключает типы друзей верхнего уровня, а также поля Public и Friend этих типов:

<excludelist>
  <type name=".*" regex="true" speclist="+notpublic">
    <comment>Exclude top-level types that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "private" in IL).</comment>
    <field name=".*" speclist="+public" regex="true">
      <comment>Exclude public fields of types the parent rule matches</comment>
    </field>
  </type>
</excludelist>

Вы также можете просто исключить типы и элементы, которые, как вы знаете, вызовут проблемы при переименовании, а не исключать большое количество имен, используя правила, основанные на доступности. Вот пример, предполагающий, что LoginModel определено в сборке YourAssembly и пространстве имен YourNamespace.Here:

<excludelist>
  <type name="YourAssembly.YourNamespace.Here.LoginModel">
    <field name="AccessKey" signature="string" />
    <field name="Password" signature="string" />
  </type>
</excludelist>

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

Для справки: документация Professional Edition по правилам исключения (и подтемы на этой странице) могут быть полезны — Community Edition и Professional Edition используют один и тот же формат файла конфигурации для функций, поддерживаемых обеими версиями.

Раскрытие информации: я работаю в команде Dotfuscator для PreEmptive Solutions.

person Joe Sewell    schedule 15.02.2017

Если вы пытаетесь исключить типы и члены Friend вашей входной сборки, потому что ваша сборка имеет Friend Assembly, то имейте в виду, что Dotfuscator автоматически исключит такие элементы кода из переименования (единственный вид обфускации, предоставляемый Dotfuscator CE) и выдаст следующее предупреждение:

ВНИМАНИЕ: NameOfYourInputAsssembly содержит не входные сборки друзей и находится в режиме библиотеки; внутренние члены не будут переименованы или сокращены. Рассмотрите возможность добавления Собраний друзей в качестве входных данных для усиления запутывания.

(Термин «внутренний» здесь является эквивалентом C# ключевого слова VB «Friend»).

Как следует из предупреждения, вместо этого вы можете включить Friend Assembly в качестве еще одного входа в Dotfuscator. Если вы сделаете это, Dotfuscator сможет переименовать типы и члены Friend и обновить сборку Friend, чтобы ссылаться на эти типы и члены по новым именам.


Если вы все еще хотите исключить типы и участников Friend, вы можете сделать это с помощью следующего набора правил исключения переименования, добавленного как дочерний элемент тега <renaming> в файле конфигурации:

<excludelist>
  <type name=".*" regex="true" speclist="+notpublic">
    <comment>Exclude types that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "private" in IL).</comment>
  </type>
  <type name=".*" regex="true" speclist="+nestedassembly">
    <comment>Exclude nested types that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "private" in IL).</comment>
  </type>
  <type name=".*" regex="true" excludetype="false">
    <comment>Select, but do not exclude, all types.</comment>
    <method name=".*" speclist="+assembly" regex="true">
      <comment>Exclude methods that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "assembly" in IL).</comment>
    </method>
    <field name=".*" speclist="+assembly" regex="true">
      <comment>Exclude fields that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "assembly" in IL).</comment>
    </field>
    <propertymember name=".*" speclist="+assembly" regex="true">
      <comment>Exclude properties that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "assembly" in IL).</comment>
    </propertymember>
    <eventmember name=".*" speclist="+assembly" regex="true">
      <comment>Exclude events that are only accessible to the assembly ("Friend" in VB, "internal" in C#, or "assembly" in IL).</comment>
    </eventmember>
  </type>
</excludelist>

Редактировать: я пропустил вложенные типы в предыдущей версии этого ответа.

Раскрытие информации: я работаю в команде Dotfuscator для PreEmptive Solutions.

person Joe Sewell    schedule 14.02.2017
comment
Спасибо @Joe за подробности, но решение не сработало. Я обновляю свой вопрос, чтобы предоставить более подробную информацию. Короче говоря, правила исключения, упомянутые в вашем ответе, не исключали запутывания классов друзей. - person Azaz ul Haq; 15.02.2017
comment
Когда я вижу запутанную DLL в Idasm, это показывает, что общедоступные данные-члены класса Friend были запутаны до имен a и b. - person Azaz ul Haq; 15.02.2017
comment
@AzazulHaq Я опубликовал отдельный ответ в свете вашего разъяснения. - person Joe Sewell; 15.02.2017