Windows系统下的应用程序开机自启动 上

posted at 2023.8.29 10:10 by Administrator

为了方便用户使用,开机实现自启动,一直是杀毒软件与病毒木马重点博弈的地方。

实现开机自启动的途径和方式很多,其中修改注册表方式应用最为广泛。还包括快速启动目录、计划任务以及系统服务等。

一、注册表自启动

1、  实现原理

Windows提供了专门的开机自启动注册表,在每次开机完成后,它都会在这个注册表键下遍历键值,以获取键值下的程序路径,并创建进程启动程序。所以,要想修改注册表实现开机自启动,只需要在这个注册表键下添加想要设置自启动程序的程序路径就可以了。

修改注册表有两个常见的路径,分别是:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

在编程实现上,修改HKEY_CURRENT_USER主键的注册表,只需要用户默认权限,而修改HKEY_LOCAL_MACHINE,则要求有管理员权限。

如果程序运行在64Windows系统上,一定要需要解决注册表重定位的问题。

2、  函数介绍

RegOpenKeyEx函数

打开一个指定的注册表键。

LONG WINAPI RegOpenKeyEx(
     _In_     HKEY    hKey,
     _In_opt_  LPCTSTR    pSubKey,
     _In_     DWORD  ulOptions,
     _In_     REGSAM  samDesired,
     _In_     PHKEY   phkResult)

RegSetValueEx函数

LONG WINAPI RegSetValueEx(
     _In_     HKEY    hKey,
     _In_opt_  LPCTSTR    lpValueName,
     _In_     DWORD  Reserved,
_In_     DWORD  dwType,
     _In_   const  BYTE  *lpData,
     _In_     DWORD  cbData)

3、  编码实现

#include"stdafx.h"

#include<Windows.h>

              BOOL Reg_CurrentUser(char *lpszFileName, char *lpszValueName);
              BOOL Reg_LocalMachine(char *lpszFileName, char *lpszValueName);
 
int_tmain(intargc, _TCHAR* argv[])
{
// 第一种方式修改注册表:HKEY_CURRENT_USER
        if (FALSE == Reg_CurrentUser("C:\\Users\\feng\\Desktop\\swf 文字制作工具.exe - 快捷方式.lnk", "520"))
        {
                 printf("Reg_CurrentUser Error!\n");
        }
        // 第二种方式修改注册表:HKEY_LOCAL_MACHINE
        if (FALSE == Reg_LocalMachine("C:\\Users\\feng\\Desktop\\Microsoft Word 2010.lnk", "520"))
        {
          printf("Reg_LocalMachine Error!\n");
} 
        printf("Reg OK.\n");
system("pause");
        return 0;
}
void ShowError(char *lpszText)
{
        char szErr[MAX_PATH] = { 0 };
        ::wsprintf(szErr, "%s Error!\nError Code Is:%d\n", lpszText, ::GetLastError());
        ::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
} 
BOOL Reg_CurrentUser(char *lpszFileName, char *lpszValueName)
{
        // 默认权限
        HKEY hKey;
        // 打开注册表键
        if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
        {
                 ShowError("RegOpenKeyEx");
                 returnFALSE;
        }
        // 修改注册表值,实现开机自启
        if (ERROR_SUCCESS != ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
        {
                 ::RegCloseKey(hKey);
                 ShowError("RegSetValueEx");
                 returnFALSE;
        }
        // 关闭注册表键
        ::RegCloseKey(hKey); 
        returnTRUE;
} 
BOOL Reg_LocalMachine(char *lpszFileName, char *lpszValueName)
{
        // 管理员权限
        HKEY hKey;
        // 打开注册表键
        if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
        {
                 ShowError("RegOpenKeyEx");
                 returnFALSE;
        }
        // 修改注册表值,实现开机自启
        if (ERROR_SUCCESS != ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
        {
                 ::RegCloseKey(hKey);
                 ShowError("RegSetValueEx");
                 returnFALSE;
        }
        // 关闭注册表键
        ::RegCloseKey(hKey);
        returnTRUE;
}

4、  测试效果 

64位系统中运行程序,程序执行完毕后,打开注册表编辑工具Regedit.exe查看对应路径下的“520”的键值信息。

HKEY_CURRENT_USER路径下的效果图1

 

HKEY_LOCAL_MACHINE对应路径在64位系统中重新定位后的路径是:

HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run

效果图2

二、快速启动目录

Windows系统中,存在着很多可以实现开机自启动的地方,下面介绍利用快速启动目录来实现开机自启动。

1、  实现原理

Windows系统自带快速启动文件夹,只要把程序放入这个文件夹内,系统在启动时就会自动地加载并运行相应的程序,实现开机自启动功能。

快速启动目录并不是一个固定目录,每台计算机的快速启动目录都不相同。但是程序可以使用SHGetSpecialFolderPath函数获取Windows系统中快速启动目录的路径,快速启动目录的CSIDL标识值为CSIDL_STARTUP

然后,使用CopyFile函数,将想要自启动的程序复制到快速启动目录下即可。当然,为程序创建快捷方式并放入快速启动目录中,也达到同样效果。

2、   函数介绍

SHGetSpecialFolderPath函数

获取指定的系统路径

BOOL  SHGetSpecialFolderPath(
     HWND  hwndOwner,
     LPSTR   lpszPath,
     Int  nFolder,
BOOL fCreate)

           3、编码实现          

#include"stdafx.h"
#include<Windows.h>
#include<Shlobj.h>
#pragmacomment(lib, "shell32.lib")
BOOL AutoRun_Startup(char *lpszSrcFilePath, char *lpszDestFileName)
{
        BOOL bRet = FALSE;
        char szStartupPath[MAX_PATH] = {0};
        char szDestFilePath[MAX_PATH] = {0};
        // 获取快速启动目录路径
        bRet = ::SHGetSpecialFolderPath(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
        printf("szStartupPath=%s\n", szStartupPath);
        if (FALSE == bRet)
        {
               return FALSE;
        }
        // 构造拷贝的目的文件路径
        ::wsprintf(szDestFilePath, "%s\\%s", szStartupPath, lpszDestFileName);
        // 拷贝文件到快速启动目录下
        bRet = ::CopyFile(lpszSrcFilePath, szDestFilePath, FALSE);
        if (FALSE == bRet)
        {
               return FALSE;
        } 
        return TRUE;
} 
int_tmain(intargc, _TCHAR* argv[])
{
        if (FALSE == AutoRun_Startup("C:\\Users\\feng\\Desktop\\Microsoft Excel 2010.lnk", "Microsoft Excel 2010.lnk"))
        {
               printf("Startup Error!\n");
        }
        printf("Startup OK!\n");
        system("pause");
        return 0;
} 

       4、测试效果

                直接运行程序,程序执行完毕后,查看程序是否成功复制到快速启动目录下。如下图所示: 

 

Tags: ,

IT技术

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading