将朋友 类 添加到混淆排除列表
Add Friend Classes to Exclusion List of Obfuscation
我使用带有 Visual Studio 2015 Update 3 的 Dotfuscator CE 来混淆我的 .Net 程序集。
我们知道默认情况下 Public 类型和成员不会被混淆。
我很想知道我们如何在排除列表中添加 Friend Classes 以便那些不应该被混淆?
这是我用来混淆 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>
实际上我有一个带有 Friend 访问说明符的模型 class。我 post 它的对象通过 PostAsJsonAsync 方法,例如
Dim result As HttpResponseMessage = client.PostAsJsonAsync(APIEndPoints.LOGIN, _LoginModel).Result
朋友来了 Class:
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 public 那么它就可以工作。
注意:只有当我混淆我的 DLL 时才会发生这种情况,否则实现也适用于 Friend class。
另请注意:朋友 class 在 VB.Net 中很常见。在程序集内访问时,它们的工作方式类似于 public classes,但在程序集外它们是私有的。
如果您试图排除输入程序集的 Friend 类型和成员,因为您的程序集有 Friend Assembly,请注意 Dotfuscator 会自动从重命名中排除此类代码元素(Dotfuscator 提供的唯一一种混淆) Dotfuscator CE) 并将发出以下警告:
WARNING: NameOfYourInputAsssembly has non-input Friend Assemblies and is in Library Mode; internal members will not be renamed or pruned. Consider adding Friend Assemblies as input for increased obfuscation.
(此处的术语 "internal" 是 VB 的 "Friend" 关键字的 C# 等价物)。
如警告所示,您可以将 Friend Assembly 作为 Dotfuscator 的另一个输入。
如果这样做,Dotfuscator 可以重命名 Friend 类型和成员,并更新 Friend Assembly 以使用新名称引用这些类型和成员。
如果您仍想排除好友类型和成员,可以使用以下重命名排除规则集来执行此操作,将其添加为配置文件中 <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。
根据您的说明,您似乎不仅要排除 Friend 类型的名称,还要排除这些类型中 Public 字段的名称。我将你最初的问题解释为想要排除任何标记为 Friend 的内容,无论上下文如何。
这里很重要的一点是,根据 Dotfuscator 的规则,排除类型不会自动排除其成员。
这里是排除top-level 好友类型和Public 以及这些类型的好友字段的排除规则集:
<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>
(我注意到您对多个输入程序集使用了相同的配置,但这条规则仍然是安全的,因为如果输入程序集不包含指定的类型,那么该规则将被忽略。)
作为参考,the Professional Edition documentation on Exclusion Rules(和该页面的 sub-topics)可能会有用 - 社区版和专业版共享相同的配置文件格式,以获得两个版本支持的功能。
披露:我在 Dotfuscator 团队工作,负责 PreEmptive Solutions。
我使用带有 Visual Studio 2015 Update 3 的 Dotfuscator CE 来混淆我的 .Net 程序集。 我们知道默认情况下 Public 类型和成员不会被混淆。 我很想知道我们如何在排除列表中添加 Friend Classes 以便那些不应该被混淆?
这是我用来混淆 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>
实际上我有一个带有 Friend 访问说明符的模型 class。我 post 它的对象通过 PostAsJsonAsync 方法,例如
Dim result As HttpResponseMessage = client.PostAsJsonAsync(APIEndPoints.LOGIN, _LoginModel).Result
朋友来了 Class:
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 public 那么它就可以工作。 注意:只有当我混淆我的 DLL 时才会发生这种情况,否则实现也适用于 Friend class。
另请注意:朋友 class 在 VB.Net 中很常见。在程序集内访问时,它们的工作方式类似于 public classes,但在程序集外它们是私有的。
如果您试图排除输入程序集的 Friend 类型和成员,因为您的程序集有 Friend Assembly,请注意 Dotfuscator 会自动从重命名中排除此类代码元素(Dotfuscator 提供的唯一一种混淆) Dotfuscator CE) 并将发出以下警告:
WARNING: NameOfYourInputAsssembly has non-input Friend Assemblies and is in Library Mode; internal members will not be renamed or pruned. Consider adding Friend Assemblies as input for increased obfuscation.
(此处的术语 "internal" 是 VB 的 "Friend" 关键字的 C# 等价物)。
如警告所示,您可以将 Friend Assembly 作为 Dotfuscator 的另一个输入。 如果这样做,Dotfuscator 可以重命名 Friend 类型和成员,并更新 Friend Assembly 以使用新名称引用这些类型和成员。
如果您仍想排除好友类型和成员,可以使用以下重命名排除规则集来执行此操作,将其添加为配置文件中 <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。
根据您的说明,您似乎不仅要排除 Friend 类型的名称,还要排除这些类型中 Public 字段的名称。我将你最初的问题解释为想要排除任何标记为 Friend 的内容,无论上下文如何。
这里很重要的一点是,根据 Dotfuscator 的规则,排除类型不会自动排除其成员。
这里是排除top-level 好友类型和Public 以及这些类型的好友字段的排除规则集:
<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>
(我注意到您对多个输入程序集使用了相同的配置,但这条规则仍然是安全的,因为如果输入程序集不包含指定的类型,那么该规则将被忽略。)
作为参考,the Professional Edition documentation on Exclusion Rules(和该页面的 sub-topics)可能会有用 - 社区版和专业版共享相同的配置文件格式,以获得两个版本支持的功能。
披露:我在 Dotfuscator 团队工作,负责 PreEmptive Solutions。