程序开机自启动大全

让程序在系统中稳定甚至隐蔽地自启动,是众多程序爱好者非常头疼的问题。
    笔者查找了很多资料,下面是各种方法的汇总与实现:
 
    1. 启动文件夹
   
    2. 修改注册表
    Windows启动时会在注册表中查找固定的几项,并按照配置启动相应的程序,我们只需要在这些位置加入自己的程序,便可以使Windows启动之后立即运行我们的程序。
    (1) RUN Key
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
    (2) RunOnce Key
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce
    该键值在程序运行一次以后就自动删除。
    (3) RunOnceEx Key
    RunOnceEx的基本功能和RunOnce类似,即运行程序一次,但语法和调用上略有不同,可以参考微软的Knowledge Base的文章:
“Q232509 yntax for the RunOnceEx Registry Key”和微软的Knowledge Base的文章:“Q232487 escription of RunOnceEx and RunEx Registry Keys”。
    (4) RunOnceSetup Key
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup
    (5) RunServicesOnce Key
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServicesOnce
    HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesOnce
    (6) RunServices Key
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServices
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServices
    RunServices和RunServicesOnce是为了调用后台运行的服务程序的,它们可以在登录前运行。但不是所有程序都可以作为服务程序运行,我们必须将程序写成服务程序。
    (7) load KeyValue
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsNTCurrentVersionWindowsload
    (8) Winlogon Key
    HKEY_CURRENT_USERSOFTWAREMicrosoftWindows NTCurrentVersionWinlogon
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon
    该键下面的Userinit、Shell等键值可以用逗号分隔,从而实现登录的时候启动多个程序。
   
    3. 利用组策略
    单击“开始→运行”,输入gpedit.msc回车可以打开“组策略编辑器”,在左侧窗格展开“本地计算机策略→用户配置→管理模板→系统→登录”,然后在右窗格中双击“在用户登录时运行这些程序”,单击“显示”按钮,在“登录时运行的项目”下就显示了自启动的程序。其实组策略中的功能都是通过修改注册表来实现的,登录时运行项目也不例外,它们存在于:
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun
   
    4. 计划任务
   
    5. 利用木马或被感染文件
    任何在开机时自动加载的以.sys和.exe形式存在的文件都可以被我们替换成为我们的rootkit,我们甚至可以利用病毒感染技术
将我们的程序插入到这些文件之中。其中,有意感染反病毒软件或者其他安全保护软件不失为最好的方法之一。
    6. 注册为驱动程序
    bool setupDriver(char *theDriverName)
    {
      char aPath[1024];
      char aCurrentDirectory[515];
      //创建一个与本机服务控制管理器的连接
      SC_HANDLE sh = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
      if(!sh)
      {
            return false;
      }
      GetCurrentDirectory( 512, aCurrentDirectory);
      _snprintf(aPath, 1022, "%s\\%s.sys", aCurrentDirectory, theDriverName);
      //创建一个服务对象,并把它加入到相应的服务控制管理数据库中
      SC_HANDLE rh = CreateService(sh,
                                  theDriverName,
                                  theDriverName,
                                  SERVICE_ALL_ACCESS,
                                  SERVICE_KERNEL_DRIVER,  //dirver service
                                  SERVICE_DEMAND_START,
                                  /*
                                  SERVICE_AUTO_START(0x00000002):    在系统启动时由服务控制管理器自动启动
                                  SERVICE_BOOT_START(0x00000000):  由系统自动加载,只对驱动服务有效
                    SERVICE_DEMAND_START(0x00000003):在程序调用StartService时由服务管理器启动
                    SERVICE_DISABLED(0x00000004):    不能被启动
                    SERVICE_SYSTEM_START(0x00000001):由IoInitSystem函数启动,只对驱动服务有效
                                  */
                                  SERVICE_ERROR_NORMAL,
                                  aPath,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      if(!rh)
      {
            if (GetLastError() == ERROR_SERVICE_EXISTS)
            {
                  rh = OpenService(sh,
                                  theDriverName,
                                  SERVICE_ALL_ACCESS);
                  if(!rh)
                  {
                        CloseServiceHandle(sh);
                        return false;
                  }
            }
            else
            {
                  CloseServiceHandle(sh);
                  return false;
            }
      }
      if(rh)
      {
            if(0 == StartService(rh, 0, NULL))
            {
                  if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError())
                  {
                        // no real problem
                  }
                  else
                  {
                        CloseServiceHandle(sh);
                        CloseServiceHandle(rh);
                        return false;
                  }
            }
            CloseServiceHandle(sh);
            CloseServiceHandle(rh);
      }
      return true;
    }
   
    7. 注册为其它应用程序的扩展程序
    目前很多spyware和adware都是使用这种方法,包括一些search bar,他们都把自己加入到Web Browser的启动项中。
    (1) BHO
    全称是Browser Helper Object,浏览器辅助对象。BHO以COM组件的形式存在,IE或资源管理器在启动时检查注册表中所有的BHO
项,并使其启动。它们在注册表中的位置是:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects。如果希望BHO只在IE启动
时启动,不随资源管理器启动,则在该键中新建一个名为NoExplorer的Dword值,并将其值设置为1即可。
    (2) ExplorerRun Key
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun
    HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun
    8. 修改磁盘内核文件
    保存在磁盘上的内核文件是可以通过一些技术直接修改的,但是为了能够正常启动内核我们必须修改系统引导程序,以绕过它的
校验和完整性检验。如果我们能够成功这是非常有效的,一旦我们能够成功,那么内核将被永久改变,并且不需要注册任何驱动。
    9. 修改系统加载程序
    我们可以通过修改系统加载程序,在系统被加载之前先加载我们自己的内核程序,这样我们就不需要对内核做出任何修改,就可
以逃过对内核文件的完整性检查,但是对引导程序的修改也有可能被一些工具检测出来。