通过用户或自动启动确定应用程序的启动方式

时间:2016-06-10 10:45:58

标签: c++ windows winapi

我的Windows应用程序可由用户或自动启动(注册表,' Software \ Microsoft \ Windows \ CurrentVersion \ Run')启动。

是否可以确定我的应用程序的启动方式?

我找到的唯一方法 - 添加命令行参数。像myapp.exe -automyapp.exe -user之类的东西。是否可以避免使用命令行参数?

2 个答案:

答案 0 :(得分:1)

最干净的方法是使用您在Run注册表项中指定的路径中包含的命令行参数。当然,没有什么可以阻止用户使用相同的命令行参数手动运行应用程序。

另一种选择是创建一个运行主应用程序的启动器。创建一个Registry运行的启动器应用程序,或者一个自动启动Windows的启动器服务,并在用户登录时启动主应用程序。然后你可以做各种事情让主应用程序检测它何时运行发射器:

  1. 使用管道,窗口消息等使两者相互通信

  2. 在调用STARTUPINFO::lpReserved时,让启动器在STARTUPINFO::lpReserved2CreateProcess()字段中传递机密值(有关详情,请参阅this article详情)。

  3. 让主应用检查其父进程ID是否为启动程序可执行文件(是的, IS 是Windows中父进程的概念)。请参阅CreateToolhelp32Snapshot()Process32First() / Process32Next()PROCESSENTRY32结构具有th32ParentProcessID字段。您可以提取与该进程ID关联的文件名。

  4. 让启动器创建一个launched process can inherit

  5. 的内核对象
  6. 等等等。

  7. 但同样,没有什么可以阻止用户手动运行启动器,或者杀死启动器服务并编写新的启动器应用程序来模仿原始行为。

    最好只使用命令行参数,不要担心用户试图伪造它。基本用户可能甚至不知道注册表或命令行,知识渊博的用户可能会忽略它们。恶意用户可能会弄​​清楚如何绕过您的检测,或者只是完全禁用/替换它们。

答案 1 :(得分:0)

我同意穆罕默德的观点 - 命令行标志似乎是最简单,最可扩展的方式来做你正在做的事情。

然而,我有另一个想法(只是为了好玩,我仍然是cmd args):你可以在注册表中注册一个不同的程序,它可以做你想做的任何事情而不是它会执行原来的程序。像注册表引导程序一样。