假设我希望我的客户能够为他们的应用程序创建插件,但我不想让他们破解我的程序内存,是否可以防止这种情况发生?
或者将 DLL 加载到一种无法访问主程序内存的内存区域中?
您可以让插件在单独的进程中运行。插件所需的任何信息都作为消息传递给该进程。应用程序需要的任何结果都作为消息接收。每个插件可以有一个单独的进程,也可以让所有插件在同一个进程中运行。
顺便说一句,大多数现代版本的插件功能都使用嵌入式运行时环境,例如 JVM。然后,插件在与应用程序相同的进程中运行,但在虚拟环境的范围内,这有效地限制了插件对您的程序造成的破坏。在这种情况下,没有 DLL,而是脚本代码或字节代码。
最简洁的答案是不”。
长答案:DLL 被加载到内存中,并且从进程的角度和操作系统的角度来看,对于所有意图和目的来说,它似乎都是可执行文件本身的一部分。当然,DLL(可能)在多个可执行文件之间共享,因此操作系统需要跟踪特定 DLL 有多少“用户”,但从一个进程的角度来看,它是可执行文件的一部分。它是一个单独的地址范围,但 DLL 内容的权限和权限与任何其他 DLL 或主可执行文件本身完全相同。
如果您有插件,则需要信任插件。如果这不是您想要的,那么不要使用 DLL 模型来制作插件(例如,使用共享内存区域和另一个可执行文件来仅允许访问共享内存)。