C# 使用压缩的.Net DLL的方法而不将其解压缩到硬盘

C# 使用压缩的.Net DLL的方法而不将其解压缩到硬盘,c#,.net,dll,password-protection,C#,.net,Dll,Password Protection,步骤1: 我想压缩我的一些.Net DLL文件,一些内置类库作为Zip或7z,并通过密码保护主题,我可以通过一些windows实用程序(如7z应用程序)手动完成这项工作 应用场景之前的项目文件: App.exe 动态链接库 B.dll 应用场景第一步后的最终文件: App.exe X.zip密码保护和压缩存档文件 并且X.zip包含A.dll和B.dll 第2步:现在,我想知道有没有一种方法可以将a.dll和B.dll直接提取到RAM而不是硬盘,并通过App.exe使用它们的方法 我想在这个场景

步骤1: 我想压缩我的一些.Net DLL文件,一些内置类库作为Zip或7z,并通过密码保护主题,我可以通过一些windows实用程序(如7z应用程序)手动完成这项工作

应用场景之前的项目文件:

App.exe 动态链接库 B.dll 应用场景第一步后的最终文件:

App.exe X.zip密码保护和压缩存档文件 并且X.zip包含A.dll和B.dll

第2步:现在,我想知道有没有一种方法可以将a.dll和B.dll直接提取到RAM而不是硬盘,并通过App.exe使用它们的方法

我想在这个场景中保持这些Dll文件的安全,并防止用户从HDD复制主题,所以我想在将主题加载到RAM后使用他们的功能

编辑:


我通常使用以下技术:C、WPF、.Net 4.5

我认为您可以使用AppDomain.AssemblyResolve事件

当您的程序集被请求时,将它们从内存中的zip提取到字节数组中。使用Assembly.Loadbyte[]重载从内存中的字节数组加载程序集,并返回该程序集


请参阅和

我认为您可以使用AppDomain.AssemblyResolve事件

当您的程序集被请求时,将它们从内存中的zip提取到字节数组中。使用Assembly.Loadbyte[]重载从内存中的字节数组加载程序集,并返回该程序集


参见和

至于内存中的加载,我可以看出@Maarten在使用该方法方面有一个很好的观点

我的意见和建议是永远不要在代码/DLL中直接存储任何敏感的内容。我在某个地方读到过,我坚持这句话:

NET中没有秘密

所以,你总是可以用IL进行反编译,可以说是逆向工程,不管你如何巧妙地混淆它。对于聪明的用户,你只能节省时间

一些解决方案:

现在,我们来看看解决方案。如果我理解正确,您正试图保护dll中的一些敏感信息,即在以脱机方式部署到用户之后,您不希望他们访问这些信息。关于这个话题,有很多问题,甚至有更多可能的解释,但归根结底,你可以尝试一下:

将敏感信息放在一个单独的文件中,访问权限有限 例如,可以将COM或C++ DLL用于存储加密字符串。非托管dll是不可反编译的,但是,专家当然可以理解dll的反汇编。 您可以使用某种内部进程内数据库,但仍有人可以嗅出它的连接并获取数据 ……等等

结论:


最后,我认为一个更安全的选择可能是将软件的关键部分作为服务提供,某种对API的访问,您可以通过它保护和访问敏感信息,而不是将其包含在应用程序中,如果可能的话。

至于内存中的加载,我可以看出@Maarten在使用该方法方面有一个很好的观点

我的意见和建议是永远不要在代码/DLL中直接存储任何敏感的内容。我在某个地方读到过,我坚持这句话:

NET中没有秘密

所以,你总是可以用IL进行反编译,可以说是逆向工程,不管你如何巧妙地混淆它。对于聪明的用户,你只能节省时间

一些解决方案:

现在,我们来看看解决方案。如果我理解正确,您正试图保护dll中的一些敏感信息,即在以脱机方式部署到用户之后,您不希望他们访问这些信息。关于这个话题,有很多问题,甚至有更多可能的解释,但归根结底,你可以尝试一下:

将敏感信息放在一个单独的文件中,访问权限有限 例如,可以将COM或C++ DLL用于存储加密字符串。非托管dll是不可反编译的,但是,专家当然可以理解dll的反汇编。 您可以使用某种内部进程内数据库,但仍有人可以嗅出它的连接并获取数据 ……等等

结论:


最后,我认为一个更安全的选择可能是将软件的关键部分作为服务提供,某种对API的访问,您可以通过它保护和访问敏感信息,而不是将其包含在应用程序中,如果可能的话。

可能就是你要找的。如果App.exe可以获得二进制文件,那么一个有决心的用户也可以。你确定你所引入的复杂性不会对你的实际用户产生负面影响吗?确保代码安全的唯一方法是根本不将其交给用户,即将其放在服务器上,并让客户端应用程序与服务器通信。我使用另一种方法保护App.exe。我的dll文件是
包含一些对我们很重要的信息…更重要的是,我假设你的代码中会有密码?如果是这样,并且考虑到.NET应用程序编译为IL,那么反编译应用程序将相对容易,找到解压代码和密码,然后使用普通工具解压。编辑:很抱歉看到你在我发布这篇文章后的最后一条评论…可能是你正在寻找的。如果App.exe可以获得二进制文件,那么一个有决心的用户也可以。你确定你所引入的复杂性不会对你的实际用户产生负面影响吗?确保代码安全的唯一方法是根本不将其交给用户,即将其放在服务器上,并让客户端应用程序与服务器通信。我使用另一种方法保护App.exe。我的dll文件包含一些对我们很重要的信息…更重要的是,我假设你的代码中有密码?如果是这样,并且考虑到.NET应用程序编译为IL,那么反编译应用程序将相对容易,找到解压代码和密码,然后使用普通工具解压。编辑:很抱歉在我发布这篇文章后看到了你的最后一条评论…对于如何将程序集加载到内存部分是正确的,如果我们讨论的是问题的安全部分的话;我不认为有什么方法可以阻止用户拍摄内存快照并将程序集存储到磁盘/分析它。要部分实现这一点,唯一的方法就是破坏DLL。是的,但也有一些方法可以打破这种破坏。特别是,我想保护我的资源和硬盘拷贝的DLL…正确的如何将程序集加载到内存部分,如果我们讨论的是问题的安全部分;我不认为有什么方法可以阻止用户拍摄内存快照并将程序集存储到磁盘/分析它。要部分实现这一点,唯一的方法就是破坏DLL。是的,但也有一些方法可以打破这种破坏。特别是我想保护我的资源和硬盘拷贝的DLL…是的,我同意你的观点,在.NET中没有秘密,但有时我们希望共同保护我们的方法和资源。我有一个解决方案来保护EXE文件,我通常把我的DLL包在我的EXE中,但在这个项目中,我希望有几个EXE,并在主题之间共享我的DLL,所以我必须将主题放在EXE之外。现在我想对这些dll和资源有一个安全级别。现在我将Assembly.Loadbyte\[\]与DotNetZip库一起使用。另外,我对内部进程内方法很感兴趣,但我对它了解不够,然后我使用Assembly.Load如果你需要在不同的应用程序之间共享DLL中的一些数据,你可以尝试一些类似内存映射文件的方法:也许?是的,我同意你的看法,在.NET中没有秘密,但有时我们希望把我们的方法和资源放在一起。我有一个解决方案来保护EXE文件,我通常把我的DLL包在我的EXE中,但在这个项目中,我希望有几个EXE,并在主题之间共享我的DLL,所以我必须将主题放在EXE之外。现在我想对这些dll和资源有一个安全级别。现在我将Assembly.Loadbyte\[\]与DotNetZip库一起使用。另外,我对内部进程内方法很感兴趣,但我对它了解不够,然后我使用Assembly.Load如果您需要在不同的应用程序之间共享DLL中的一些数据,您可以尝试内存映射文件之类的方法:也许?