我有一个在内存中有一些重要值的进程。我不希望任何人能够读取我的进程的内存并获取这些值。所以我尝试创建一个程序,查看运行的程序列表,并确定它们中的任何一个是“调试器”等。但我意识到有人可以编写一个快速程序来转储我的进程的内存。我知道我系统上的几个进程都有内存保护。我怎么能得到这个呢? (ps:我正在使用C#)
答案 0 :(得分:7)
在具有足够权限的用户(例如本地管理员)下运行的任何应用程序可以随时调用ReadProcessMemory并随意读取您的进程,而无需附加到您的进程调试端口,没有您的处理能够防止,甚至检测到这一点。我甚至没有进入系统内核驱动程序的可能性......
最终,所有可用的解决方案都是蛇油,或者只是通过提高标准以使其变得更难来混淆问题。有些确实让它变得非常困难,但没有一个能让它成为防弹。但最终,人们无法向具有物理访问权限并且具有足够提升权限的用户隐藏任何内容。
如果您不希望用户阅读某些内容,则只需在用户计算机上没有。使用服务模型,其中您的IP在服务器上,用户通过互联网访问它(即Web服务)。
答案 1 :(得分:5)
首先,总会有一种方法来转储程序的内存映像。你的程序只能让它变得更难,永远不可能。也就是说,可能有办法“隐藏”价值观。通常认为很难做到并且不值得麻烦,但有些程序会在内存中加密这些值。但是,为了能够使用它们,他们需要临时解密它们并在之后重新加密(或丢弃)它们。
虽然.Net框架的加密很容易,但在C#中丢弃解密的值并不容易。在C中,您将分配一块内存来存储解密的值,并在释放之前清除(通过向其写入零或随机数据)。在C#中,无法保证您的数据不会存储在某处(缓存,垃圾收集),您将无法清除它。但是,正如eulerfx在评论中指出的那样,可以使用.Net 4.0 SecureString。这是多么安全,我不知道。
正如您所看到的,总会有一个很短的时间,其中值在未加密的内存中,这就是此处的漏洞。
答案 2 :(得分:0)
我认为最好的方法是采用商业解决方案,例如PDF brochure,这是他们的website。如果您真的关心保护应用程序免受嗅探,IP盗窃等而不是卷起您自己的解决方案,那么您最好沿着这条路走下去......
编辑: 我不会在开玩笑的路上开玩笑说我将制作的解决方案将是防篡改,防破解,白痴证明。把它留给像我提到的像Arxan这样的公司(我不是一个销售代表 - 我只是举个例子),确定它可能代价高昂,但是你可以在晚上睡得更好知道更难让一个破解者破解而不是 没有解决方案 ......