从应用程序本身之外从.NET应用程序中检索嵌入式资源有多难?即使资源被压缩和普通加密,使用工具检索它们有多困难? (我不关心数据本身,资源本身的检索的只是方法的保护).NET中的资源有多安全?
编辑:
我觉得我的问题被误解了,这是少谈加密还有更多关于检索的内容,除了反射镜之外,还有什么可以使用的?
从应用程序本身之外从.NET应用程序中检索嵌入式资源有多难?即使资源被压缩和普通加密,使用工具检索它们有多困难? (我不关心数据本身,资源本身的检索的只是方法的保护).NET中的资源有多安全?
编辑:
我觉得我的问题被误解了,这是少谈加密还有更多关于检索的内容,除了反射镜之外,还有什么可以使用的?
使用诸如.NET Reflector或.NET Resourcer之类的工具从编译后的.NET DLL中检索资源是微不足道的。
您是否有其他方式知道?我将测试Resourcer,但Reflector目前不是问题。 – 2010-03-10 20:36:54
那么,你可以写一点代码。 Assembly.GetManifestResourceStream()。 – 2010-03-10 20:39:31
另外,请尝试在Visual Studio中打开程序集。只是好奇,你发现Reflector不能提取它们吗? – 2010-03-10 21:17:07
如果您使用应用程序中嵌入的密钥加密资源,那么通过一点逆向工程就可以轻松地检索密钥,从而获取资源。
如果您使用安全算法对它们进行加密并要求用户输入密码,那么如果没有密码,将无法提取资源。但我想这不是你想要的。我想你想阻止用户在应用程序之外使用你的资源?
如果是的话,简短的答案是:.NET中的资源不安全。
我提高了你;但是,ANYING中的资源并不安全。使用什么语言并不重要,如果加密密钥嵌入在应用程序本身中,则可以将其拔出。 – NotMe 2010-03-10 20:18:49
如果我告诉你一个有一百万美元的保险箱,那么走开,你最终会进入安全。没有技术可以保护这些资金,你唯一真正的障碍就是时间。
软件也一样。保护资源的唯一方法就是不要把它们放在有人可以的地方,给予足够的时间,去找他们。我知道的最有效的选择是将关键资源存储在您控制的服务器上。
当然,很多人得到这个错误。不管怎样,他们都允许将安全资源临时复制到用户的计算机上。在这一点上,游戏丢失了。这意味着您只能真正确保拥有自然临时克隆的资源。例如,过期的安全令牌或计算结果不会显示如何计算。
问题不在于.NET资源,而在于一般的安全问题。您可以将这个问题改为“我的客户端应用程序存储我不想进行反向工程的秘密”,而不是改变意图。
什么是在您的资源文件中,为什么它需要被保护?你有没有考虑过一种设计,你根本不把这些秘密存储在客户端?如果您在保护客户端机密方面进行银行业务,我认为您会感到失望。
怎样才能让您使用第三方库的许可证文件? - 如果您想在客户端上使用第三方库,则需要能够获取客户端上的许可证文件 - 但您不希望最终用户能够将许可证文件取出并重新使用它自己... - 如果它泄漏,许可证被吊销。那么你如何保护它? – BrainSlugs83 2014-06-06 03:34:22
下面是一些快速代码来从组件中获取资源。你决定它是多么容易和安全...
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;
}
}
}
加密的方式,究竟是什么? – 2010-03-10 19:38:24
很多工具都可以做到这一点。 ILSpy可以做到这一点。资源很容易检索。在.NET程序集内部使用的解密方法可以很容易地逆转。 – BrainSlugs83 2014-06-06 03:29:39