具有错误报告和依赖性集成的SmartAssembly的免费替代方案

Rav*_*tel 3 .net c# obfuscation

我尝试过Smart Assembly并对它非常满意.它的错误报告功能很棒.依赖集成也是非常酷的功能.我的问题是有免费的替代品可以像智能装配一样工作吗?

我试过Eazfuscator.NET,这是一个很好的混淆器,但缺少两个我最喜欢的Smart Assembly.是否有任何免费工具可用于.Net框架的错误报告和依赖项集成.

Rav*_*tel 5

在阅读Eazfuscator.NET的文档时,我发现它包含两个称为汇编合并和汇编嵌入的功能.为了报错,我创建了自己的库.您可以在CodePlex CrashReporter.NET上找到此库

任何人都可以按照以下说明使用汇编合并或嵌入

装配合并

介绍

合并程序集允许将多个程序集合并为一个.从部署和安全角度来看,这可能是有益的.

程序集合并技术使用下面的ILMerge实用程序.因此,为了使用程序集合并,请确保在您的计算机上安装了ILMerge.通过单独使用ILMerge实用程序也可以实现程序集合并,但在大多数情况下,使用Eazfuscator.NET提供的程序集合并接口要方便得多.

使用从Eazfuscator.NET合并的程序集与直接ILMerge使用的好处

Eazfuscator.NET在Eazfuscator.NET Assistant的帮助下自动集成到项目构建过程中.在直接使用ILMerge的情况下,您必须手动为项目编写构建事件处理程序Eazfuscator.NET神奇地处理项目的签名选项.在直接使用ILMerge的情况下,您必须手动为其提供签名密钥和选项Eazfuscator.NET为ILMerge提供从输入程序集自动检测的目标平台信息.如果直接使用ILMerge,您必须手动提供此信息Eazfuscator.NET为ILMerge提供所有必需选项,因此您无需阅读ILMerge手册.它加快了整合速度

默认情况下,在程序集的模糊处理期间不使用程序集合并.

说明

要启用程序集合并,应将特殊形成的属性应用于程序集.为此,您可以使用以下说明.

关于启用程序集合并的说明

在IDE中打开obfuscatable项目将新的源文件添加到项目中并将其命名为ObfuscationSettings.cs(对于C#)或ObfuscationSettings.vb(对于Visual Basic .NET).您可能更喜欢使用其他名称而不是ObfuscationSettings.cs或ObfuscationSettings.vb使用以下内容填充ObfuscationSettings.cs(C#):

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "merge with XXXXXX.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

对于Visual Basic .NET,请使用以下内容填充ObfuscationSettings.vb:

Imports System
Imports System.Reflection

<Assembly: Obfuscation(Feature:="merge with XXXXXX.dll", Exclude:=False)> 
Run Code Online (Sandbox Code Playgroud)

注意

使用要合并的程序集的文件名更改XXXXXX.dll.

小费

如果要与多个程序集合并,只需添加几个属性:

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "merge with Assembly1.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "merge with AnotherAssembly2.dll", Exclude = false)]
…
Run Code Online (Sandbox Code Playgroud)

注意 使用程序集合并可能会导致一些可能使混淆失败的副作用.如果是这种情况,则使用最小公分母的原则 - 仅合并那些不会导致混淆失败的程序集.程序集嵌入可以与程序集合并一起使用或作为替代程序使用.

ILMerge的自定义参数

有时您可能需要将自定义参数传递给ILMerge实用程序.例如,您可能更喜欢自己控制类内部化或使用一些棘手的ILMerge功能.为此,您可以使用以下说明.

有关将自定义参数传递给ILMerge的说明

在IDE中打开obfuscatable项目将新的源文件添加到项目中并将其命名为ObfuscationSettings.cs(对于C#)或ObfuscationSettings.vb(对于Visual Basic .NET).您可能更喜欢使用其他名称而不是ObfuscationSettings.cs或ObfuscationSettings.vb使用以下内容填充ObfuscationSettings.cs(C#):

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "ilmerge custom parameters: <parameters>", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

对于Visual Basic .NET,请使用以下内容填充ObfuscationSettings.vb:

Imports System
Imports System.Reflection

<Assembly: Obfuscation(Feature:="ilmerge custom parameters: <parameters>", Exclude:=False)> 
Run Code Online (Sandbox Code Playgroud)

注意

使用您想要传递的参数进行更改.当没有定义属性时,Eazfuscator.NET默认传递/ internalize/ndebug参数.如果您不想将任何参数传递给ILMerge,则更改为无字符串.

程序集嵌入指令

程序集嵌入

介绍

嵌入式程序集允许将程序集的依赖项嵌入到程序集本身中.从部署和安全角度来看,这可能是有益的.

嵌入式装配与合并类似.主要区别在于嵌入时程序集不会合并为单个程序集.它们只是加密并打包为程序集资源.因此,输出中有一个程序集,它包含同一文件中的打包依赖项.

当我们合并时(或反之亦然),嵌入有什么意义?合并程序集可为生成的程序集提供最佳性能.它们可以被NGENed,它们可以在所有受限环境中工作(Windows Phone,Compact Framework等).操作系统可以为这样的程序集缓存文件映射和JIT代码,从而带来快速应用程序启动.大会合并肯定是岩石.

合并的唯一缺点是,在不破坏应用程序的情况下应用它并不总是可行的.所以这就是装配嵌入来解决问题的关键所在.

嵌入式组件是易于实现的目标,它们开箱即用.缺点?好吧,他们在场.嵌入式组件无法进行NGEN,它们在某些受限环境(Xbox,Windows Phone和Compact Framefork)中无法运行.在应用程序加载期间提取嵌入式程序集是一种性能损失(惩罚很小,因此您不太可能注意到它).

嵌入式程序集也带来了一些好处.嵌入式程序集是加密的,因此这是对黑客的一种安全加固.嵌入式组件经过压缩,从而减小了所得组件的尺寸.当然,程序集嵌入是实现单文件部署的最简单方法,使您的应用程序由单个.exe(或.dll)文件组成.

说明

要启用程序集嵌入,应将特殊形成的属性应用于程序集.为此,您可以使用以下说明.有关启用程序集嵌入的说明

在IDE中打开obfuscatable项目将新的源文件添加到项目中并将其命名为ObfuscationSettings.cs(对于C#)或ObfuscationSettings.vb(对于Visual Basic .NET).您可能更喜欢使用其他名称而不是ObfuscationSettings.cs或ObfuscationSettings.vb使用以下内容填充ObfuscationSettings.cs(C#):

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

对于Visual Basic .NET,请使用以下内容填充ObfuscationSettings.vb:

Imports System
Imports System.Reflection

<Assembly: Obfuscation(Feature:="embed XXXXXX.dll", Exclude:=False)> 
Run Code Online (Sandbox Code Playgroud)

注意

使用要嵌入的程序集的文件名更改XXXXXX.dll.

重要

建议隐藏嵌入式组件.
小费

当仅提供文件名时,Eazfuscator.NET自动查找程序集路径.如果您希望指定汇编的确切文件路径,则可以使用脚本变量:

[assembly: Obfuscation(Feature = @"embed $(InputDir)\Lib\AssemblyToEmbed.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

小费

如果要嵌入多个程序集,则只需添加几个属性:

[assembly: Obfuscation(Feature = "embed Assembly1.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "embed AnotherAssembly2.dll", Exclude = false)]
…
Run Code Online (Sandbox Code Playgroud)

调音

默认情况下,嵌入式组件经过压缩和加密 您可能更喜欢关闭压缩,加密或两者.为此,请阅读以下注释.

程序集嵌入的自定义属性的完整表示法具有以下形式:

[assembly: Obfuscation(Feature = "embed [flags] XXXXXX.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

其中[flags]是由空格分隔的标志的可选枚举.

可用标志列表如下表所示.

下面是程序集嵌入属性的标志列表

标志说明no_compress禁用压缩no_encrypt禁用加密no_satellites禁用附属程序集的自动嵌入load_from_file指示Eazfuscator.NET在模糊处理程序集运行时从文件而不是内存加载嵌入式程序集.这可用于从System.Reflection.Assembly类型保留有意义的Location属性值.

我们来看看例子.

例4.24.嵌入式组件,无需压缩和加密

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed [no_compress no_encrypt] XXXXXX.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

例4.25.没有加密的嵌入式组件; 压缩已启用

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed [no_encrypt] XXXXXX.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

例4.26.嵌入组件; 压缩和加密已启用

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

例4.27.嵌入自己的卫星组件; 压缩和加密已启用

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed satellites", Exclude = false)]
Run Code Online (Sandbox Code Playgroud)

故障排除虽然装配嵌入是链接装配的最非侵入性方法,但可能会出现一些罕见的问题.本章将介绍可能出现的问题以及相应的解决方案以避免这些问题.System.Reflection.Assembly类的位置属性问题摘要.System.Reflection.Assembly类的Location属性通常用于查找程序集附近文件的路径.虽然不是正确的解决方案,但这适用于大多数部署方案.

可能出什么问题?首先,当使用程序集卷影复制时,Location属性可能具有完全意外的值,从而破坏了预期的应用程序逻辑.其次,当嵌入相应的程序集时,Location属性具有空值.

解.请改用EscapedCodeBase属性.在所有部署方案中,此属性始终具有正确的值.请看下面的示例.

using System;

class Program
{
    static string GetEulaPath()
    {
        var assembly = typeof(Program).Assembly;
        // string location = assembly.Location; // Please do not use this. This is a flawed approach
        string location = new Uri(assembly.EscapedCodeBase).LocalPath; // <-- Use this instead
        return Path.Combine(Path.GetDirectoryName(location), "EULA.rtf");
    }
}
Run Code Online (Sandbox Code Playgroud)