从应用程序本身外部从.NET应用程序检索嵌入资源有多难?即使资源被压缩和平凡加密,使用工具检索它们有多难? (我不关心数据本身的保护,只关心资源本身的检索方法)
编辑:
我认为我的问题被误解了,除了反射器之外,更少关于加密和更多关于检索,还有什么可以使用?
答案 0 :(得分:8)
使用.NET Reflector或.NET Resourcer等工具从已编译的.NET DLL中检索资源是微不足道的。
答案 1 :(得分:6)
如果使用应用程序中嵌入的密钥加密资源,则可以通过一些逆向工程来轻松检索密钥,从而检索资源。
如果使用安全算法加密它们并要求用户输入密码,那么在没有密码的情况下就无法提取资源。但我猜这不是你想要的。我想你想阻止用户在应用程序之外使用你的资源吗?
如果是这样,简短的回答是:.NET中的资源不安全。
答案 2 :(得分:3)
以下是一些从Assemblies中获取资源的快速代码。你决定它是多么容易和安全......
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;
}
}
}
答案 3 :(得分:2)
如果我给你看一张价值一百万美元的保险箱,然后走开,你最终会进入那个保险箱。没有技术可以保护这笔钱,你唯一真正的障碍就是时间。
软件也一样。保护资源的唯一方法是不要将它们放在可以有足够时间的人可以到达的地方。我所知道的最有效的选择是将关键资源存储在您控制的服务器上。
当然很多人都错了。无论如何,它们都允许将安全资源临时复制到用户的计算机上。在这一点上,游戏失败了。这意味着您只能真正保护具有自然临时克隆的资源。例如,过期的安全令牌或计算结果未显示计算方式。
答案 4 :(得分:2)
问题不在于.NET资源,而在于更多关于安全性的问题。你可以将这个问题改写为“我的客户端应用程序存储我不想进行逆向工程的秘密”,而不是改变意图。
资源文件中有什么,为什么需要保护?您是否考虑过根本不将这些秘密存储在客户端的设计?如果你想保证客户端的机密安全,我想你会感到失望。