我的 Windows 应用程序可以由用户或自动启动(注册表,“Software\Microsoft\Windows\CurrentVersion\Run”)启动。
是否可以确定我的应用程序的启动方式?
我找到的唯一方法 - 添加命令行参数。类似于 myapp.exe -auto
和 myapp.exe -user
。是否可以避免命令行参数?
最佳答案
最干净 方法是使用包含在 Run
注册表项中指定路径中的命令行参数。当然,没有什么可以阻止用户使用相同的命令行参数手动运行应用程序。
另一种选择是创建一个运行主应用程序的启动器。要么创建注册表运行的启动器应用程序,要么创建随 Windows 自动启动并在用户登录时启动主应用程序的启动器服务。然后你可以做各种事情让主应用程序检测它何时运行启动器:
让两者通过管道、窗口消息等方式相互通信
让启动器在调用
时在
(有关详细信息,请参阅 this article)。STARTUPINFO::lpReserved
或STARTUPINFO::lpReserved2
字段中传递一个secret 值>CreateProcess()让主应用程序检查其父进程 ID 是否是启动器可执行文件(是的,Windows 中是父进程的概念)。参见
CreateToolhelp32Snapshot()
和Process32First()
/Process32Next()
.PROCESSENTRY32
结构有一个th32ParentProcessID
字段。您可以提取与该进程 ID 关联的文件名。让启动器创建一个内核对象,launched process can inherit .
等等等等
但同样,没有什么可以阻止用户仅手动运行启动器,或终止启动器服务并编写新的启动器应用来模仿原始行为。
最好坚持使用命令行参数,不要担心用户试图伪造它。基本用户可能甚至不知道注册表或命令行,知识渊博的用户可能会忽略它们。恶意用户可能会弄清楚如何绕过您的检测,或者完全禁用/替换它们。
关于c++ - 确定应用程序的启动方式 - 由用户启动或自动启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37746283/