我的Windows应用程序可由用户或自动启动(注册表,' Software \ Microsoft \ Windows \ CurrentVersion \ Run')启动。
是否可以确定我的应用程序的启动方式?
我找到的唯一方法 - 添加命令行参数。像myapp.exe -auto
和myapp.exe -user
之类的东西。是否可以避免使用命令行参数?
答案 0 :(得分:1)
最干净的方法是使用您在Run
注册表项中指定的路径中包含的命令行参数。当然,没有什么可以阻止用户使用相同的命令行参数手动运行应用程序。
另一种选择是创建一个运行主应用程序的启动器。创建一个Registry运行的启动器应用程序,或者一个自动启动Windows的启动器服务,并在用户登录时启动主应用程序。然后你可以做各种事情让主应用程序检测它何时运行发射器:
使用管道,窗口消息等使两者相互通信
在调用STARTUPINFO::lpReserved
时,让启动器在STARTUPINFO::lpReserved2
或CreateProcess()
字段中传递机密值(有关详情,请参阅this article详情)。
让主应用检查其父进程ID是否为启动程序可执行文件(是的, IS 是Windows中父进程的概念)。请参阅CreateToolhelp32Snapshot()
和Process32First()
/ Process32Next()
。 PROCESSENTRY32
结构具有th32ParentProcessID
字段。您可以提取与该进程ID关联的文件名。
让启动器创建一个launched process can inherit。
等等等。
但同样,没有什么可以阻止用户手动运行启动器,或者杀死启动器服务并编写新的启动器应用程序来模仿原始行为。
最好只使用命令行参数,不要担心用户试图伪造它。基本用户可能甚至不知道注册表或命令行,知识渊博的用户可能会忽略它们。恶意用户可能会弄清楚如何绕过您的检测,或者只是完全禁用/替换它们。
答案 1 :(得分:0)
我同意穆罕默德的观点 - 命令行标志似乎是最简单,最可扩展的方式来做你正在做的事情。
然而,我有另一个想法(只是为了好玩,我仍然是cmd args):你可以在注册表中注册一个不同的程序,它可以做你想做的任何事情而不是它会执行原来的程序。像注册表引导程序一样。