简单聊一下Windows中的开机启动项
最近在做开机启动项管理,了解了一下Windows的开机启动项。
从用户层来讲,开机启动项可以通过以下四种方式完成。
注册表
startup文件夹
服务
计划任务
平常用得最多的,一般是注册表和startup文件夹。常规软件的开机启动项,都是通过注册表来完成的。也是接下来主要介绍的内容。
像我自己用的电脑,每一个软件的来源都是清楚的,所以从来不会有弹窗或者强制设置浏览器主页的情况发生。
以前在帮别人搞电脑时,就遇到过强制修改浏览器主页的,像这种一般就是某个进程搞的。而这个程序是开机自启的,所以会导致浏览器主页被修改。
我朋友这台电脑是因为flash搞的鬼,我把flash开机自启关了,强制修改浏览器主页也就解决了。flash做为一个ocx组件,开机自启,无非就是打广告。
我还遇到过一种情况,也是强制修改浏览器主页,我找遍了注册表和服务项,都没找到可疑项目,在进程列表里也找了,还是没找到相关可疑项。后面通过工具分析,发析是2345软件的一个驱动导致的,它在驱动里进行了修改。
像系统驱动这种情况,已经不属于用户层了,属于内核层了,对这一块的了解还不够,这里不做介绍。当时是想通过卸载2345软件来解决,结果它通过各种手段,限制你卸载,像驱动这种,在开机时就已经加载完成了,所以你无法手动去删除,只能进安全模式,后面懒得折腾,就没去搞了,修改浏览器主页为2345影响也不是那么大。当时还尝试了使用360安全卫士,确实是可以锁定浏览器主页,360也是通过内核层来完成的,这种工具早已经不在用户层了。
言归正传,下面介绍一下,常规Windows自启动所在的注册表路径
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
这个路径是平常软件设置最多的地方,当前用户的开机启动项。用api对这个这个路径进行操作不需要管理员权限
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
本机上的开机启动项,这个路径下平常可能像安全软件、系统软件会在这里设置启动项,用api进行操作时,需要管理员权限。
针对CURRENT_USER的,还有以下位置也可以设置开机启动项
下面列出的这些路径,加载的时机都不一样,但都达到了开机自启的效果。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_CURRENT_USER\ Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\Shell
HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts
针对CURRENT_USER的,有以下位置
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\System\Scripts
从win10开始,任务管理器加入了启动项管理。这里主要是针对注册表中和startup文件夹中的启动项进行管理。而通过服务、计算任务的启动项不会在这里显示。
一开始我还有个疑问,因为在任务管理器中禁用的项,在原始注册表中还存中。
就比如图中的ApiFoxAppAgent我已经禁用了,但是在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run这个位置还是能看到。
后面找了一下任务管理器禁用的原理,发现它是通过在其它位置建立节点来完成的。
在以下两个位置创建对应 的项,可以实现启动项的启用跟禁用
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run
新建一个二进制值,名称为对应启动项的名称,取值为下
启用 : 02 00 00 00 00 00 00 00 00 00 00 00 (hex)
禁用 : 03 00 00 00 xx xx xx xx xx xx d9 01(hex)
禁用这里的值是动态变化的,具体是怎么生成的,还需要查阅相关资料。但是将上面的xx替换成有效的16进制值,是可以实现禁用的。
后面想了一下,这种禁用方式非常方便,因为你只需要建立限制规则 ,而不必理会原来的启动项在还是不在,系统只需要判断这些规则即可。
这里目前我还没有用Windows api去实现,后面去尝试一下看如何写二进制 值到注册表。
参考资料:
https://renenyffenegger.ch/notes/Windows/dirs/Windows/System32/Taskmgr_exe#taskmgr-exe_startup-tab
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通