我想为单独的 exe 创建一个启动程序。我需要在启动器之外无法访问主程序(而不是启动)。
6 回答
根本不可能安全地做到这一点。启动器可以做的任何事情,用户也可以做。
您可以通过使启动器将加密签名的时间戳传递给单独的程序来使用户更难。但是,用户可以从启动器中提取私钥并手动签署时间戳。
您可以让程序检查其父 PID,并确保启动器 EXE 使用您自己的私钥签名,但用户可以修改程序以删除该检查。
您还可以将 EXE 转换为 DLL,使用启动器调用的方法,但用户可以编写自己的 EXE 来调用该方法。
一种选择是在运行第二个程序时需要一个参数,尽管这很容易被利用。你没有说这到底是为了什么,所以它可能已经足够好了。
根据您的启动程序的功能,您可能能够检查这些操作是否已完成,如果没有,则退出程序。
如果您需要特别安全,您可以设置一些私钥-公钥系统,并加密一条动态信息(如时间戳)。老实说,我认为这将比它的价值更多,如果任何一个程序被反汇编,它仍然是可以利用的。
您可能希望将主要功能实现为单独的DLL文件并从启动的应用程序中调用它。这样一来,主要功能并不完全是一个单独的应用程序,因此它可能不是您想要的,但它是分开的,需要运行另一个应用程序(启动器)。
适当的解决方案取决于您要防止的确切内容。
如果你的目标是“在任何情况下,一个熟练的黑客都不能通过 A.exe 启动 B.exe”,那是很难实现的。
如果您的目标是“我不希望用户意外启动 B.exe,因为 A.exe 是他们应该使用的”,那么可以选择。例如,将命令行参数从 A.exe 传递到 B.exe,普通用户不会知道要传递该参数。
我有两个建议来实现你想要的。
第二个exe是否需要实际上是一个exe?你能把它改成图书馆调用吗?将功能作为在您的启动器进程下运行的线程调用。
使用未发布的命令行参数。如果未提供它们,则终止第二个 exe。这并不完全安全,但我相信这就是现代游戏启动器的工作方式。
最终,我认为没有“通过默默无闻的安全”来做到这一点
您可以在启动器中创建一个以 Guid 作为名称的互斥锁。然后检查程序中的互斥锁。正如其他人所说,这不是很安全,但会阻止大多数人直接启动该程序。