【WIN】windows自启动项查询整理

本文详细介绍了Windows系统中自启动项的查询和管理,包括自启动文件夹、注册表启动项、系统服务、系统驱动、任务计划和动态链接库映像劫持。提供了查询和遍历注册表、服务、驱动等自启动项的方法,并给出了相应的代码示例。同时,提到了通过系统服务和驱动程序进行自启动的隐蔽性以及任务计划程序的使用。

整理一下 Windows 自启动项的存放位置

Windows 自启动项查询整理

目前有很多产品 都可以获取系统自启动项 如360安全卫士、autoRun、Dism++等等,在使用上各有不同,Windows的自启动项主要有以下几项:

  1. 自启动文件夹
  2. 注册表启动项
  3. 系统服务
  4. 系统驱动程序
  5. 任务计划
  6. 动态链接库
  7. 映像劫持

本文主要提供一下上述几项的信息和查询方式,另外需要补充的是,对于查询结果处理的准确性可结合多方面进行校验,这边罗列一下可以提供校验的工具:

  1. 【系统】。Windows提供了可以查看自启动软件(msconfig),服务(services.msc),定时任务的工具(管理工具)的工具,包括注册表也可以用来使用,以上这几个是系统提供的可供查询的路径。
  2. 【AutoRun】。这是一个软件,可以自行去找相关资源使用,这个软件很强大。可以参考这个去实现查询功能,里边很多设计的点都可以借鉴。

1. 自启动文件夹

自启动文件夹指的是Win系统上有专门的文件夹来存放自启动项,直接通过资源管理器查看即可:

1. %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
2. %ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup

直接复制上述路径粘贴到资源管理器即可打开,如下所示两个路径下的应用程序也会是Win系统的启动项
在这里插入图片描述
如果是通过C++去查询,则需要使用函数去获取自启动项的绝对路径,使用 ExpandEnvironmentStrings可以获取环境变量所指向的绝对路径。

如果获取的是快捷方式,可以看看我的这篇文章:

【WIN】【C/C++】获取快捷方式指向的位置

【WIN】【C/C++】获取文件版本号

【WIN】【C++】遍历文件夹下所有文件

2. 通过注册表启动项

注册表作为Windows一个核心,自然也少不了保存相关项来存储自启动程序,注册表下的自启动项路径主要有以下 8 个部分,其中可能有重复项,需要自己去过滤重复项:

1. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
2. HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
3. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
4. HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
5. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
6. HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
7. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
8. HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
此外,64位操作系统中,还存在一个重定向到32位的映射路径,如下:
9. HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run	

注册表项相对较多,可以提供一个统一的接口,逐个调用获取每个注册表路径下的启动项就好。

接口的大致过程分为三个步骤:

  1. RegOpenKeyEx()进入目标路径
  2. 使用while循环RegEnumValue遍历当前注册表路径
  3. 使用RegClose关闭句柄

百度【枚举注册表子项 | RegEnumValue】能查到较多相关demo,既然都写了,那就贡献一个我自己写的接口:

其中获取文件属性的代码我注释掉了,如有需要,请到这里👇获取源码

【WIN】查询文件信息(公司、版本、版权、描述、厂商等)_欧恩意的博客-优快云博客

typedef struct _AUTO_RUNS_ST
{
   
   
	WCHAR   szName[MAX_PATH];      //软件名称
	WCHAR   szPath[MAX_PATH];      //软件路径
	WCHAR   szVersion[MAX_PATH];   //软件版本
	WCHAR   szCompany[MAX_PATH];   //软件公司
	WCHAR   szDesp[MAX_PATH * 4];  //软件描述
	WCHAR   szCmdLine[MAX_PATH];   //启动命令行
}AUTO_RUNS_ST, *AUTO_RUNS_ST;

/*
*	[in]Htype: 注册表句柄 
*	[in]lpSubKey: 子路径 如:“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run”
*	[in]bIs64KEY: 被查询机器是否是64bit
*	[out]vecAutoItems: 查询结果的输出结构体
*/
bool EnumAutoRun(   __in HKEY Htype, 
                    __in LPCTSTR lpSubKey, 
                    __in bool bIs64KEY, 
                    __out std::vector<AUTO_RUNS_ST> &vecAutoItems )
{
   
   
	bool bRet = FALSE;	
	DWORD dwSamDesire = 0;

	// 1、自启动项查询
	DWORD dwIndex = 0;
	HKEY hKey = HKEY_LOCAL_MACHINE;
	DWORD dwSizeValueName = MAX_PATH;
	DWORD dwSizeofKeyName = MAX_PATH;
	BYTE szValueName[MAX_PATH] = {
   
    0 };
	TCHAR szKeyName[MAX_PATH] = {
   
    0 };
	long nError = 0;
	size_t nEnd;

	if ( bIs64KEY )
	{
   
   
		dwSamDesire = bIs64KEY ? (KEY_READ | KEY_WOW64_64KEY) : (KEY_READ | KEY_WOW64_32KEY);
	}

    if (RegOpenKeyExW(Htype, lpSubKey, 0, dwSamDesire, &hKey))
    {
   
   
        printf(_T("EnumAutoRun RegOpenKeyExW Failed!Error code(%d)"), GetLastError());
        goto _EXIT_;
    }

	// 2、遍历:根据得到的软件路径查询相关信息
	do
	{
   
   
		dwSizeValueName = MAX_PATH;
		dwSizeofKeyName = MAX_PATH;

		AUTO_RUNS_ST stuAutoRun;
		memset(stuAutoRun, 0, sizeof(stuAutoRun));
		
		nError = RegEnumValueW(hKey, dwIndex++, szKeyName, &dwSizeofKeyName, NULL, &dwType, szValueName, &dwSizeValueName);
		if (nError == ERROR_SUCCESS)
		{
   
   
			// 转string->截取字符串 -> 得到程序路径
			std::wstring strFilePath = (wchar_t*)szValueName;

			// 先处理带‘"’的字符串
			int nReplace = strFilePath.find_first_of
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值