2010-03-10 56 views
6

从应用程序本身之外从.NET应用程序中检索嵌入式资源有多难?即使资源被压缩和普通加密,使用工具检索它们有多困难? (我不关心数据本身,资源本身的检索的只是方法的保护).NET中的资源有多安全?


编辑:

我觉得我的问题被误解了,这是少谈加密还有更多关于检索的内容,除了反射镜之外,还有什么可以使用的?

+2

加密的方式,究竟是什么? – 2010-03-10 19:38:24

+0

很多工具都可以做到这一点。 ILSpy可以做到这一点。资源很容易检索。在.NET程序集内部使用的解密方法可以很容易地逆转。 – BrainSlugs83 2014-06-06 03:29:39

回答

8

使用诸如.NET Reflector.NET Resourcer之类的工具从编译后的.NET DLL中检索资源是微不足道的。

+0

您是否有其他方式知道?我将测试Resourcer,但Reflector目前不是问题。 – 2010-03-10 20:36:54

+2

那么,你可以写一点代码。 Assembly.GetManifestResourceStream()。 – 2010-03-10 20:39:31

+0

另外,请尝试在Visual Studio中打开程序集。只是好奇,你发现Reflector不能提取它们吗? – 2010-03-10 21:17:07

6

如果您使用应用程序中嵌入的密钥加密资源,那么通过一点逆向工程就可以轻松地检索密钥,从而获取资源。

如果您使用安全算法对它们进行加密并要求用户输入密码,那么如果没有密码,将无法提取资源。但我想这不是你想要的。我想你想阻止用户在应用程序之外使用你的资源?

如果是的话,简短的答案是:.NET中的资源不安全。

+3

我提高了你;但是,ANYING中的资源并不安全。使用什么语言并不重要,如果加密密钥嵌入在应用程序本身中,则可以将其拔出。 – NotMe 2010-03-10 20:18:49

2

如果我告诉你一个有一百万美元的保险箱,那么走开,你最终会进入安全。没有技术可以保护这些资金,你唯一真正的障碍就是时间。

软件也一样。保护资源的唯一方法就是不要把它们放在有人可以的地方,给予足够的时间,去找他们。我知道的最有效的选择是将关键资源存储在您控制的服务器上。

当然,很多人得到这个错误。不管怎样,他们都允许将安全资源临时复制到用户的计算机上。在这一点上,游戏丢失了。这意味着您只能真正确保拥有自然临时克隆的资源。例如,过期的安全令牌或计算结果不会显示如何计算。

2

问题不在于.NET资源,而在于一般的安全问题。您可以将这个问题改为“我的客户端应用程序存储我不想进行反向工程的秘密”,而不是改变意图。

什么是在您的资源文件中,为什么它需要被保护?你有没有考虑过一种设计,你根本不把这些秘密存储在客户端?如果您在保护客户端机密方面进行银行业务,我认为您会感到失望。

+1

怎样才能让您使用第三方库的许可证文件? - 如果您想在客户端上使用第三方库,则需要能够获取客户端上的许可证文件 - 但您不希望最终用户能够将许可证文件取出并重新使用它自己... - 如果它泄漏,许可证被吊销。那么你如何保护它? – BrainSlugs83 2014-06-06 03:34:22

3

下面是一些快速代码来从组件中获取资源。你决定它是多么容易和安全...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var assemblies = from file in args 
         let assembly = TryLoad(file) 
         where assembly != null 
         from rName in assembly.GetManifestResourceNames() 
         select new { assembly, rName }; 

     foreach (var item in assemblies) 
      using (var rs = item.assembly 
           .GetManifestResourceStream(item.rName)) 
       SaveTo(rs, item.rName); 

    } 

    static void SaveTo(Stream stream, string name) 
    { 
     var buffer = new byte[32*1024]; 
     var bufferLen = 1; 
     using (var fs = new FileStream(name, FileMode.Create)) 
      while (bufferLen > 0) 
       if ((bufferLen = stream.Read(buffer, 0, buffer.Length)) > 0) 
        fs.Write(buffer, 0, bufferLen); 
    } 

    static Assembly TryLoad(string filename) 
    { 
     if (string.IsNullOrEmpty(filename) || 
      !File.Exists(filename)) 
      return null; 
     try 
     { 
      var fullName = Path.GetFullPath(filename); 
      return Assembly.LoadFile(fullName); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
      return null; 
     } 
    } 
}