强制用户模式程序在非分页内存下 运行
Force user mode program to run under non paged memory
我需要编写一个程序(最好使用高级语言,如 C# 或 Java,但也可以是 C/C++),在任何情况下都不得将其数据写入磁盘.
即使不执行任何 I/O 操作,数据也可以通过 OS 页面错误写入磁盘。
有什么方法可以避免吗?
在 Windows 系统上,VirtualLock()
可用于锁定内存的各个区域。我不知道有任何选项可以锁定整个过程的所有内存页面。在将敏感数据存储到其中之前,您必须立即在内存分配上使用此函数。
在 POSIX 系统上,这可以通过在不应交换的进程中使用 mlock()
系列函数来实现。例如,这将防止交换当前映射的内存页面以及将来映射的任何页面:
mlockall(MCL_CURRENT | MCL_FUTURE);
在某些系统上,锁定内存页是一项特权操作。您必须检查特定系统的详细信息。
到目前为止,最简单的解决方案是将所有内容(包括休眠文件)存储在加密磁盘上。从技术上讲,所有位仍会在磁盘上,但如果没有密钥,它们将毫无意义。
请注意,这不会向授权用户隐藏您的应用程序中的位。这不是 DRM 方案。但请注意,坚定的用户无论如何都可以撤消任何类型的内存页面保护。
我需要编写一个程序(最好使用高级语言,如 C# 或 Java,但也可以是 C/C++),在任何情况下都不得将其数据写入磁盘.
即使不执行任何 I/O 操作,数据也可以通过 OS 页面错误写入磁盘。
有什么方法可以避免吗?
在 Windows 系统上,VirtualLock()
可用于锁定内存的各个区域。我不知道有任何选项可以锁定整个过程的所有内存页面。在将敏感数据存储到其中之前,您必须立即在内存分配上使用此函数。
在 POSIX 系统上,这可以通过在不应交换的进程中使用 mlock()
系列函数来实现。例如,这将防止交换当前映射的内存页面以及将来映射的任何页面:
mlockall(MCL_CURRENT | MCL_FUTURE);
在某些系统上,锁定内存页是一项特权操作。您必须检查特定系统的详细信息。
到目前为止,最简单的解决方案是将所有内容(包括休眠文件)存储在加密磁盘上。从技术上讲,所有位仍会在磁盘上,但如果没有密钥,它们将毫无意义。
请注意,这不会向授权用户隐藏您的应用程序中的位。这不是 DRM 方案。但请注意,坚定的用户无论如何都可以撤消任何类型的内存页面保护。