C# 如何保护进程的内存

C# 如何保护进程的内存,c#,windows,memory,C#,Windows,Memory,我有一个进程,在内存中会有一些重要的值。我不希望任何人能够读取我进程的内存并获得这些值。因此,我试图创建一个程序,查看正在运行的程序列表,并确定其中是否有“调试器”等。但我意识到,有人可以编写一个快速程序来转储进程的内存。我知道我的系统中有几个进程的内存受到保护。我怎样才能得到这个呢?(注:我用的是C#)我认为最好的方法是采用商业解决方案,如本例所示,这是他们的解决方案。如果您真的关心保护应用程序免受嗅探、IP盗窃等攻击,而不是卷起自己的解决方案,那么沿着这条路线走可能会更好 编辑:我不会开玩笑

我有一个进程,在内存中会有一些重要的值。我不希望任何人能够读取我进程的内存并获得这些值。因此,我试图创建一个程序,查看正在运行的程序列表,并确定其中是否有“调试器”等。但我意识到,有人可以编写一个快速程序来转储进程的内存。我知道我的系统中有几个进程的内存受到保护。我怎样才能得到这个呢?(注:我用的是C#)

我认为最好的方法是采用商业解决方案,如本例所示,这是他们的解决方案。如果您真的关心保护应用程序免受嗅探、IP盗窃等攻击,而不是卷起自己的解决方案,那么沿着这条路线走可能会更好


编辑:我不会开玩笑说我要设计的解决方案将是防篡改、防裂、防白痴的。把这留给我提到的Arxan这样的公司(我不是销售代表,我只是举个例子),当然这可能会很昂贵,但你可以在晚上睡得更好,因为你知道破碎比根本没有解决方案要困难得多…

首先,总会有办法转储程序的内存映像。你的计划只会让事情变得更难,永远不可能。也就是说,可能有办法“隐藏”这些值。一般认为这很难做到,也不值得费心,但有些程序会在内存中加密这些值。但是,为了能够使用它们,它们需要临时解密它们,然后重新加密(或丢弃)它们

虽然使用.Net framework进行加密很容易,但在C#中丢弃解密的值并不是一件容易的事情。在C语言中,您将分配一块内存来存储解密后的值,并在释放之前清除(通过向其写入零或随机数据)。在C#中,无法保证您的数据不会存储在某个地方(缓存、垃圾收集),也无法清除它。但是,正如eulerfx在评论中指出的,可以使用.Net 4.0。我不知道这有多安全

如您所见,在内存中总是会有一段短时间的值未加密,这就是此处的漏洞。

任何在具有足够权限的用户(如本地管理员)下运行的应用程序都可以随时调用和读取您的进程,而无需连接到进程调试端口,而您的处理无法防止,甚至无法检测到这一点。我甚至不想讨论系统内核驱动程序可以做什么

最终,所有可用的解决方案要么是蛇油,要么只是通过提高门槛使问题变得更难来混淆问题的一种方法。有些人确实很难做到,但没有人能做到防弹。但归根结底,用户无法对具有物理访问权和足够高权限的用户隐藏任何内容


如果您不想让用户阅读某些内容,只需在用户计算机上没有。使用一种服务模式,其中您的IP位于服务器上,用户通过internet访问它(即web服务)

您可以使用这个类来保护字符串:我毫不怀疑一个专家黑客可以做到这一点。我只是想确定所有的新手都不能。@Lienau:专家与新手的问题是,一个专家就足以破解它,然后所有的新手都会在谷歌上找到如何破解它。只有少数人懂得如何从零开始越狱,但许多iPhone都是越狱的。如果价格值得,有人会这么做。在这种情况下,您可以为SecureString编写一个包装器,将要存储为字符的值的字节附加到SecureString实例。SecureString提供加密,您的包装器在需要时将字符解码回字节(或任何其他类型)。