整理一下 Windows 自启动项的存放位置
Windows 自启动项查询整理
目前有很多产品 都可以获取系统自启动项 如360安全卫士、autoRun、Dism++等等,在使用上各有不同,Windows的自启动项主要有以下几项:
- 自启动文件夹
- 注册表启动项
- 系统服务
- 系统驱动程序
- 任务计划
- 动态链接库
- 映像劫持
本文主要提供一下上述几项的信息和查询方式,另外需要补充的是,对于查询结果处理的准确性可结合多方面进行校验,这边罗列一下可以提供校验的工具:
- 【系统】。Windows提供了可以查看自启动软件(msconfig),服务(services.msc),定时任务的工具(管理工具)的工具,包括注册表也可以用来使用,以上这几个是系统提供的可供查询的路径。
- 【AutoRun】。这是一个软件,可以自行去找相关资源使用,这个软件很强大。可以参考这个去实现查询功能,里边很多设计的点都可以借鉴。
1. 自启动文件夹
自启动文件夹指的是Win系统上有专门的文件夹来存放自启动项,直接通过资源管理器查看即可:
1. %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
2. %ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup
直接复制上述路径粘贴到资源管理器即可打开,如下所示两个路径下的应用程序也会是Win系统的启动项

如果是通过C++去查询,则需要使用函数去获取自启动项的绝对路径,使用 ExpandEnvironmentStrings可以获取环境变量所指向的绝对路径。
如果获取的是快捷方式,可以看看我的这篇文章:
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
注册表项相对较多,可以提供一个统一的接口,逐个调用获取每个注册表路径下的启动项就好。
接口的大致过程分为三个步骤:
RegOpenKeyEx()进入目标路径- 使用
while循环和RegEnumValue遍历当前注册表路径- 使用
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

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

被折叠的 条评论
为什么被折叠?



