• [转]VC 开机自动启动程序代码


    很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表Software\\Microsoft\\Windows\\CurrentVersion\\Run 。

    参考程序可以见下:(查找程序目录的执行文件,存在则进行添加注册表操作)  

    //实用代码一

    int C***Dlg::CreateRun(void)
    {

    //添加以下代码
    HKEY   RegKey;  
    CString   sPath;  
    GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);  
    sPath.ReleaseBuffer();  
    int   nPos;  
    nPos=sPath.ReverseFind(‘\\’);  
    sPath=sPath.Left(nPos);  
    CString   lpszFile=sPath+”\\getip.exe”;//这里加上你要查找的执行文件名称  
    CFileFind   fFind;  
    BOOL   bSuccess;  
    bSuccess=fFind.FindFile(lpszFile);  
    fFind.Close();  
    if(bSuccess)  
    {  
       CString   fullName;  
       fullName=lpszFile;  
       RegKey=NULL;  
       RegOpenKey(HKEY_LOCAL_MACHINE,”Software\\Microsoft\\Windows\\CurrentVersion\\Run”,&RegKey);  
       RegSetValueEx(RegKey,”getip”,0,REG_SZ,(const   unsigned   char*)(LPCTSTR)fullName,fullName.GetLength());//这里加上你需要在注册表中注册的内容  
       this->UpdateData(FALSE);  
    }  
    else  
    {  
       //theApp.SetMainSkin();  
       ::AfxMessageBox(“没找到执行程序,自动运行失败”);  
       exit(0);  
    }  
    return 0;
    }

    //把上面的getip(共2处)替换成自己想启动程序的名字。

     

    ================================================

    实用代码二:

    //写入注册表,开机自启动
    HKEY hKey;
    //找到系统的启动项
    LPCTSTR lpRun = “Software\\Microsoft\\Windows\\CurrentVersion\\Run”;
    //打开启动项Key
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    if(lRet == ERROR_SUCCESS)
    {
        char pFileName[MAX_PATH] = {0};
        //得到程序自身的全路径
        DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
        //添加一个子Key,并设置值 // 下面的“getip”是应用程序名字(不加后缀.exe)
        lRet = RegSetValueEx(hKey, “getip”, 0, REG_SZ, (BYTE *)pFileName, dwRet);

        //关闭注册表
        RegCloseKey(hKey);
        if(lRet != ERROR_SUCCESS)
        {
            AfxMessageBox(“系统参数错误,不能随系统启动”);
        }
    }

    一、当前用户专有的启动文件夹

         这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动文件夹一般在:\Documents and Settings\<用户名字>\「开始」菜单\程序\启动,其中“<用户名字>”是当前登录的用户帐户名称。

         二、对所有用户有效的启动文件夹

         这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,放入该文件夹的快捷方式总是自动启动——这是它与用户专有的启动文件夹的区别所在。该文件夹一般在:\Documents and Settings\All Users\「开始」菜单\程序\启动。

         三、Load注册键

         介绍该注册键的资料不多,实际上它也能够自动启动程序。位置:HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load。

         四、Userinit注册键

         位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit。这里也能够使系统启动时自动初始化程序。通常该注册键下面有一个userinit.exe,如图,但这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号)。

         五、Explorer\Run注册键

         和load、Userinit不同,Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具体位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run。

         六、RunServicesOnce注册键

         RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序。RunServicesOnce注册键的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce。

         七、RunServices注册键

         RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。RunServices的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices。

         八、RunOnce\Setup注册键

         RunOnce\Setup指定了用户登录之后运行的程序,它的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup。

         九、RunOnce注册键

         安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce和HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机在其他Run键指定的程序之前。HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。如果是XP,你还需要检查一下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx。

         十、Run注册键

         Run是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。HKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。

    有时候人们往往会为了一个程序的启动而头痛,因为一些用户往往不知道那些文件是如何启动的。所以经常会有些没用的东西挂在系统上占用资源。有时候也会有人因为不知道如何启动某个文件而头痛。更有些特洛依木马的作者因为不清楚系统的自启动方式而使自己的木马轻松被别人发现……   

      Windows的自启动方式其实有许多方式。除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动文件的方式。本文总结如下,虽然不是全部,但我想应该会对大家有所帮助。文章全部以系统默认的状态为准,以供研究。

      其中(English)代表英文操作系统,(Chinese)代表中文操作系统。本文没加说明指的全为中文Windows98操作系统。   

      警告: 文中提及的一些操作可能会涉及到系统的稳定性。例如如果不正确地使用注册表编辑器可以导致可能重新安装系统这样严重的问题。微软也不能保证因不正常使用注册表编辑器而造成的结果可以被解决。笔者不对使用后果负责,请根据自己的情况使用。   

      Windows的自启动方式:

      一.自启动目录:   

      1.第一自启动目录:

      默认路径位于:

      C:windowsstart menuprogramsstartup(English)

      C:windowsstart menuprograms启动(Chinese)

      这是最基本、最常用的Windows启动方式,主要用于启动一些应用软件的自启动项目,如Office的快捷菜单。一般用户希望启动时所要启动的文件也可以通过这里启动,只需把所需文件或其快捷方式放入文件夹中即可。

    对应的注册表位置:

      [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders]

      Startup=\”%Directory%\”

      [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders]

      Startup=\”%Directory%\”

      其中“%Directory%”为启动文件夹位置。

      

      英文默认为:   C:windowsstart menuprogramsstartup

      中文默认为:   C:windowsstart menuprograms启动   

      在开始菜单的“启动”文件夹是可更改的,如果用户更改了启动文件夹,则以上注册表的键值均会改变为相应的名称。  

      值得注意的是:开始菜单的“启动”文件夹中的内容虽然在默认的状态下可以被用户看得一清二楚。但通过改动还是可以达到相当隐蔽地启动的目的的:   

      首先,“启动”文件夹中的快捷方式或其他文件的属性可以改变为“隐藏”。这样可以达到系统不启动被隐藏的文件,等到需要启动的时候又可以通过更改回文件属性而恢复启动的作用。

    其次,其实“启动”文件夹只是一个普通的文件夹,但是由于系统监视了这个文件夹,所以变得有些特殊,但文件夹有的功能该文件夹也是有的。譬如“启动”文件夹的名称是可以更改的,并且“启动”文件夹也可以设置属性。如果把属性设置为“隐藏”,则在系统中的【开始】?【程序】菜单中是看不到“启动”文件夹的(即使在“文件夹选项”中已经设定了“显示所有文件”)。而系统还会启动这个被隐藏的文件夹中的非隐藏文件。

      敏感的人们也许已经发现问题。举一个例子:   

      如果我想启动A木马的server端服务器,我可以把原来的“启动”菜单的名称更改为“StartUp”(这里是随便改的,注册表相应的键值也会自动更改。)之后再创建一个名为“启动”的文件夹,把“StartUp”菜单中的文件全部复制(这里用复制,可以骗过用户的检查)到“启动”菜单中,然后把A木马的server程序放入“StartUp”文件夹中,最后把“StartUp”文件夹隐藏。大功告成!

      

      从外表看来,用户的【开始】?【启动】目录还在,而且要启动的文件也在。但系统此时启动的文件不是名为“启动”的文件夹中的文件,而是名为“StartUp”的文件夹中的文件。如果木马做的好的话,完全可以在每次启动的时候把“StartUp”中的文件复制到“启动”目录中来达到实时更新启动目录的目的。由于“StartUp”文件夹被隐藏,从【开始】?【程序】中是无法看到真正的启动菜单“StartUp”的,所以达到了隐蔽启动的目的!

      这个启动方式虽然比较隐蔽,但通过msconfig依旧可以在“启动”页中看出来。  

      2.第二自启动目录:

      是的,其实,Windows还有另外一个自启动目录,而且很明显但却经常被人们忽略的一个。

      该路径位于:

      C:WINDOWSAll UsersStart MenuProgramsStartUp(English)

      C:WINDOWSAll UsersStart MenuPrograms启动(Chinese)

      这个目录的使用方法和第一自启动目录是完全一样的。只要找到该目录,将所需要启动的文件拖放进去就可以达到启动的目的。

      [HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionexplorerUser Shell Folders]

      \”Common Startup\”=\”%Directory%\”

      [HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionexplorerShell Folders]

      \”Common Startup\”=\”%Directory%\”

      

      值得注意的是:该目录在开始菜单的“启动”目录中是完全不能被看见的。而伴随着每次启动,该目录下的非隐藏文件也会随之启动! 另外,在Msconfig中可以看到在这个目录下要启动的文件。

    二.系统配置文件启动:   

      由于系统的配置文件对于大多数的用户来说都是相当陌生的;这就造成了这些启动方法相对来说都是相当隐蔽的,所以这里提到的一些方法常常会被用于做一些破坏性的操作,请读者注意。   

      1.WIN.INI启动:

      启动位置(file.exe为要启动的文件名称):

      [windows]

      load=file.exe

      run=file.exe

      注意:load=与run=的区别在于:通过load=运行文件,文件会在后台运行(最小化);而通过run=来运行,则文件是在默认状态下被运行的。   

      2.SYSTEM.INI启动:

      启动位置(file.exe为要启动的文件名称):

      默认为:

      [boot]

      Shell=Explorer.exe

      可启动文件后为:

      [boot]

      Shell=Explorer.exe file.exe

      说明:

      笔者记得在诺顿先生(就是开发出Norton系列软件的人)写的一本书里面曾经说过,1、2这两个文件的有无对系统没有什么影响,但由于时间的关系,笔者没有来得及试验,有兴趣者可以试一试。   

      不过有一点是可以肯定的,这样的启动方式往往会被木马或一些恶作剧程序(如,妖之吻)利用而导致系统的不正常。由于一般用户很少会对这两个文件关心,甚至有的人不知道这些文件是做什么用的,所以隐蔽性很好。但由于其使用的越来越频繁,这种启动方式也被渐渐的察觉了。用户可以使用msconfig这个命令实现检查是否有什么程序被加载。具体的是在看是菜单中的“运行”中输入msconfig回车,之后按照文字说明即可。   

      注意:

      1.  和WIN.INI文件不同的是,SYSTEM.INI的启动只能启动一个指定文件,不要把Shell=Explorer.exe file.exe换为Shell=file.exe,这样会使Windows瘫痪!

      2.  这种启动方式提前于注册表启动,所以,如果想限制注册表中的文件的启动,可是使用这种方法。

      3.WININIT.INI启动:

      Wininit.ini这个文件也许很多人不知道,一般的操作中用户也很少能直接和这个文件接触。但如果你编写过卸载程序的话,也许你会知道这个文件。

      WinInit即为Windows Setup Initialization Utility。翻译成中文就是Windows安装初始化工具。这么说也许不明白,如果看到如下提示信息:

      Please wait while Setup updates your configuration files.

      This may take a few minutes…

      大家也许就都知道了!这个就是Wininit.ini在起作用!   

      由于在Windows下,许多的可执行文件和驱动文件是被执行到内存中受到系统保护的。所以在Windows的正常状态下更改这些文件就成了问题,因此出现了Wininit.ini这个文件来帮助系统做这件事情。它会在系统装载Windows之前让系统执行一些命令,包括复制,删除,重命名等,以完成更新文件的目的。Wininit.ini文件存在于Windows目录下,但在一般时候我们在C:Windows目录下找不到这个文件,只能找到它的exe程序Wininit.exe。原因就是Wininit.ini在每次被系统执行完它其中的命令时就会被系统自动删除,直到再次出现新的Wininit.ini文件……之后再被删除。

    文件格式:

      [rename]

      file1=file2

      file1=file2的意思是把file2文件复制为文件名为file1的文件,相当于覆盖file1文件。

      这样启动时,Windows就实现了用file2更新file1的目的;如果file1不存在,实际结果是将file2复制并改名为file1;如果要删除文件,则可使用如下命令:

      [rename]

      nul=file2 

      这也就是说把file2变为空,即删除的意思。

      以上文件名都必须包含完整路径。

      注意:

      1.由于Wininit.ini文件处理的文件是在Windows启动以前处理的,所以不支持长文件名。

      2.以上的文件复制、删除、重命名等均是不提示用户的情况下执行的。有些病毒也会利用这个文件对系统进行破坏,所以用户如果发现系统无故出现:

      Please wait while Setup updates your configuration files.

      This may take a few minutes…

      那么也许系统就有问题了。

      3. 在Windows 95 Resource Kit中提到过Wininit.ini文件有三个可能的段,但只叙述了[rename]段的用法。

      4.WINSTART.BAT启动:

      这是一个系统自启动的批处理文件,主要作用是处理一些需要复制、删除的任务。譬如有些软件会在安装或卸载完之后要求重新启动,就可以利用这个复制和删除一些文件来达到完成任务的目的。如:

      “@if exist C:WINDOWSTEMPPROC.BAT call C:WINDOWSTEMPPROC.BAT”

      这里是执行PROC.BAT文件的命令;

      “call filename.exe > nul”

      这里是去除任何在屏幕上的输出。

      值得注意的是WinStart.BAT文件在某种意义上有和AUTOEXEC.BAT一样的作用。如果巧妙安排完全可以达到修改系统的目的!

      5.AUTOEXEC.BAT启动: 这个就没的说了,应该是用户再熟悉不过的系统文件之一了。每次重新启动系统时在DOS下启动。恶意的程序往往会利用这个文件做一些辅助的措施。  

      不过,在AUTOEXEC.BAT文件中会包含有恶意代码。如format c: /y等;由于BAT恶意程序的存在,这个机会大大地增加了。譬如最近很流行的SirCam蠕虫也利用了Autoexec.bat文件。

      说明: 4、5这两个文件都是批处理文件,其作用往往不能完全写出来,因为批处理的用处在DOS时代的应用太广泛,它的功能相对来说也是比较强大。想利用这两个文件,需要对DOS有一定的了解。

    VC 如何创建自身快捷方式

    //测试通过
    
    #include <shobjidl.h>
    #include <shlguid.h>
    #include <shlobj.h>
    
    void main()
    {
     HRESULT hr = CoInitialize(NULL);
    
     if (SUCCEEDED(hr))
     {
      IShellLink *pisl;
    
      hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (void**)&pisl);
    
      if (SUCCEEDED(hr))
      {
       IPersistFile* pIPF;
    
       char path[MAX_PATH];
    
       GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
       pisl->SetPath(path);
       hr = pisl->QueryInterface(IID_IPersistFile, (void**)&pIPF);
    
       if (SUCCEEDED(hr))
       {
        char lnk[MAX_PATH];
    
        SHGetSpecialFolderPath(0, lnk, CSIDL_DESKTOPDIRECTORY, 0);
        strcat(lnk, TEXT("\\"));
    
        WCHAR wpath[MAX_PATH] = { 0 };
    
        strcat(lnk, strtok(strrchr(path, '\\'), "\\"));
        strcat(lnk, ".lnk");
        MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lnk, -1, wpath, MAX_PATH);
        pIPF->Save(wpath, FALSE);
        pIPF->Release();
       }
       pisl->Release();
      }
      CoUninitialize();
     }
     
    作者:feiskyer 发表于2011-12-28 13:54:28 原文链接
    阅读:20 评论:0 查看评论
  • 相关阅读:
    python循环删除list中的元素
    Mysql主从同步原理简介
    python 3新式类的多继承
    面向对象之多态、多态性
    python的collections模块和functools模块
    Python(os和sys)使用
    javascript中的数据类型
    语法、关键保留字及变量
    使用JavaScript
    javascript的概述
  • 原文地址:https://www.cnblogs.com/feisky/p/2310359.html
Copyright © 2020-2023  润新知