Добавление классов друзей в список исключений запутывания
Я использую Dotfuscator CE с обновлением 3 для Visual Studio 2015, чтобы запутать мои сборки.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. Они работают как публичные классы, когда к ним обращаются внутри сборки, но они закрыты вне сборки.
2 ответа
Исходя из вашего пояснения, похоже, что вы хотите исключить не только имена типов Friend, но также имена открытых полей в этих типах. Я истолковал ваш первоначальный вопрос как желающий исключить что-либо с пометкой "Друг", независимо от контекста.
Важным моментом здесь является то, что с точки зрения правил 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.
Если вы пытаетесь исключить типы и элементы Friend вашей сборки ввода, поскольку в вашей сборке есть Friend Friend, учтите, что Dotfuscator автоматически исключит такие элементы кода из переименования (единственный вид запутывания, предоставляемого Dotfuscator CE) и выдаст следующее предупреждение:
ВНИМАНИЕ: NameOfYourInputAsssembly имеет не входящие сборки друзей и находится в режиме библиотеки; внутренние члены не будут переименованы или сокращены. Подумайте о том, чтобы добавить сборки друзей в качестве входных данных для увеличения запутанности.
(Термин "внутренний" здесь является C# эквивалентом ключевого слова VB "Друг").
Как следует из предупреждения, вы можете вместо этого включить дружественную сборку как еще один вход для 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.