Rav*_*tel 3 .net c# obfuscation
我尝试过Smart Assembly并对它非常满意.它的错误报告功能很棒.依赖集成也是非常酷的功能.我的问题是有免费的替代品可以像智能装配一样工作吗?
我试过Eazfuscator.NET,这是一个很好的混淆器,但缺少两个我最喜欢的Smart Assembly.是否有任何免费工具可用于.Net框架的错误报告和依赖项集成.
在阅读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#):
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "merge with XXXXXX.dll", Exclude = false)]对于Visual Basic .NET,请使用以下内容填充ObfuscationSettings.vb:
Run Code Online (Sandbox Code Playgroud)Imports System Imports System.Reflection <Assembly: Obfuscation(Feature:="merge with XXXXXX.dll", Exclude:=False)>注意
使用要合并的程序集的文件名更改XXXXXX.dll.
小费
如果要与多个程序集合并,只需添加几个属性:
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "merge with Assembly1.dll", Exclude = false)] [assembly: Obfuscation(Feature = "merge with AnotherAssembly2.dll", Exclude = false)] …注意 使用程序集合并可能会导致一些可能使混淆失败的副作用.如果是这种情况,则使用最小公分母的原则 - 仅合并那些不会导致混淆失败的程序集.程序集嵌入可以与程序集合并一起使用或作为替代程序使用.
ILMerge的自定义参数
有时您可能需要将自定义参数传递给ILMerge实用程序.例如,您可能更喜欢自己控制类内部化或使用一些棘手的ILMerge功能.为此,您可以使用以下说明.
有关将自定义参数传递给ILMerge的说明
在IDE中打开obfuscatable项目将新的源文件添加到项目中并将其命名为ObfuscationSettings.cs(对于C#)或ObfuscationSettings.vb(对于Visual Basic .NET).您可能更喜欢使用其他名称而不是ObfuscationSettings.cs或ObfuscationSettings.vb使用以下内容填充ObfuscationSettings.cs(C#):
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "ilmerge custom parameters: <parameters>", Exclude = false)]对于Visual Basic .NET,请使用以下内容填充ObfuscationSettings.vb:
Run Code Online (Sandbox Code Playgroud)Imports System Imports System.Reflection <Assembly: Obfuscation(Feature:="ilmerge custom parameters: <parameters>", Exclude:=False)>注意
使用您想要传递的参数进行更改.当没有定义属性时,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#):
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]对于Visual Basic .NET,请使用以下内容填充ObfuscationSettings.vb:
Run Code Online (Sandbox Code Playgroud)Imports System Imports System.Reflection <Assembly: Obfuscation(Feature:="embed XXXXXX.dll", Exclude:=False)>注意
使用要嵌入的程序集的文件名更改XXXXXX.dll.
重要
建议隐藏嵌入式组件.
小费当仅提供文件名时,Eazfuscator.NET自动查找程序集路径.如果您希望指定汇编的确切文件路径,则可以使用脚本变量:
Run Code Online (Sandbox Code Playgroud)[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)]其中[flags]是由空格分隔的标志的可选枚举.
可用标志列表如下表所示.
下面是程序集嵌入属性的标志列表
标志说明no_compress禁用压缩no_encrypt禁用加密no_satellites禁用附属程序集的自动嵌入load_from_file指示Eazfuscator.NET在模糊处理程序集运行时从文件而不是内存加载嵌入式程序集.这可用于从System.Reflection.Assembly类型保留有意义的Location属性值.
我们来看看例子.
例4.24.嵌入式组件,无需压缩和加密
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed [no_compress no_encrypt] XXXXXX.dll", Exclude = false)]例4.25.没有加密的嵌入式组件; 压缩已启用
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed [no_encrypt] XXXXXX.dll", Exclude = false)]例4.26.嵌入组件; 压缩和加密已启用
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]例4.27.嵌入自己的卫星组件; 压缩和加密已启用
Run Code Online (Sandbox Code Playgroud)using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed satellites", Exclude = false)]故障排除虽然装配嵌入是链接装配的最非侵入性方法,但可能会出现一些罕见的问题.本章将介绍可能出现的问题以及相应的解决方案以避免这些问题.System.Reflection.Assembly类的位置属性问题摘要.System.Reflection.Assembly类的Location属性通常用于查找程序集附近文件的路径.虽然不是正确的解决方案,但这适用于大多数部署方案.
可能出什么问题?首先,当使用程序集卷影复制时,Location属性可能具有完全意外的值,从而破坏了预期的应用程序逻辑.其次,当嵌入相应的程序集时,Location属性具有空值.
解.请改用EscapedCodeBase属性.在所有部署方案中,此属性始终具有正确的值.请看下面的示例.
Run Code Online (Sandbox Code Playgroud)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"); } }
| 归档时间: |
|
| 查看次数: |
2853 次 |
| 最近记录: |