有时候我们在安装某一程序的时候,它会询问是否让该程序随操作系统自动启动,病毒的自启动和一般的应用程序并没有差别,其实现的原理还要从Windows的注册表开始。
其实,Windows是按照两个文件夹及8个核心的注册表子键来自动加载程序的。Windows 2000/XP启动时会从以下10个地址搜索自启动程序。
1.“启动”文件夹——最常见的自启动程序文件夹。它位于系统分区的“Documents and Settings→User→「开始」菜单→程序”目录下。这里的“User”指的是你实际登录的用户名字,如果你是用管理员登录的,那么这里就应该是“Administrator”。
2.“All Users”中的自启动程序文件夹——这是另一个常见的自启动程序文件夹,一般位于系统盘所在的“Documents and Settings→All Users→「开始」菜单→程序”目录下。前面提到的“启动”文件夹运行的是登录用户的自启动程序,而“All Users”启动文件夹里的程序,则不管登录者是谁,都会自动加载。
上面的两个是一般用户可以轻松找到的加载自启动程序的地方,另外,在注册表中还有几个键值是用来加载自启动程序的。
3.“load”键值——一个埋藏得较深的注册表键值,位于[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\
Windows\load]。
4.“Userinit”键值——它在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Windows NT\CurrentVersion\Winlogon\Userinit],也是用于系统启动时加载程序的。一般情况下,其默认值为“userinit.exe”,由于该子键的值中可用使用逗号分隔开多个程序,因此,在键值的数值中可以加入其它程序。
5.“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]。
6.“RunServicesOnce”子键——它在用户登录前及其它注册表自启动子键加载各自的程序前加载服务程序。这个子键同时存在于[HKEY_CURRENT_USER\Softvvare\Mcrosoft
\Windows\CurrentVersion\RunServicesOnce]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Windows\CurrentVersion\RunServicesOnce]中。
7.“RunServices”子键——紧接在RunServicesOnce后,也是在用户登录前加载。分别位于[HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\RunServices]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
Windows\CurrentVersion\RunServices]中。
8.“RunOnce\Setup”子键——其默认值确定了用户登录后加载的程序。在[HKEY_CURRENT_USER]和[HKEY_LOCAL_MACHINE]两个根键下。位置分别为[HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\RunOnce\Setup]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
Windows\CurrentVersion\RunOnce\Setup]。
9.“RunOnce”子键——许多自启动程序主要利用RunOnce子键来自动加载。这个子键分别位于[HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\Windows\CurrentVersion\RunOnce]和[HEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\RunOnce]。位于[HKEY_LOCAL_MACHINE]根键下的“RunOnce”子键在用户登录后及其它注册表的Run键值加载程序前加载相关联的程序。位于[HKEY_CURRENT_USER]根键下的“RunOnce”子键在操作系统处理完其它注册表Run子键及自启动文件夹内的程序后再加载。如果你的系统为Windows XP,你可以在[HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\Windows\CurrentVersion\RunOnceEx]中找到这个子键。
10.“Run”键值——到目前为止,Run键值是自启动程序最常见的地方。它的位置在[HKEY_CURRENT_USER\Softvvare
\Microsoft\Windows\CurrentVersion\Run]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\Run]。其中[HKEY_CURRENT_USER]根键下的“Run”键值紧接着[HKEY_LOCAL_MACHINE]下的“Run”键值运行,但两个键值都在“启动”文件夹之前加载。
快速进入启动项
快速进入启动项的方法是在运行中输入 msconfig ,即可看到窗口下的启动项运行项目。
[编辑本段]从系统的启动项可以看到什么
俗话说“万事开头难”, 俗话也说“良好的开头是成功的一半”,那么XP系统“开头”也就是“启动”能告诉我们什么那。
1、msconfig
在"开始“-“运行”对话框中输入“msconfig”就打开“系统配置实用程序”。
msconfig是Windows系统中的“系统配置实用程序”,它可以自动执行诊断xp系统的配置问题时所用的常规解决步骤。它管的方面可够宽,包括:一般(常规)、system.ini、win.ini、BOOT.INI、服务、启动。它是 xp系统底层最先启动的程序,可见它的重要性了。这里面可是自启动程序非常喜欢呆的地方。
这里我们只介绍一下“启动”
系统配置实用程序中的“启动”选项和我们在下面讲的"启动"文件夹并不是同一个东西,在系统配置实用程序中的这个启动项目是Windows系统启动项目的集合地,几乎所有的启动项目部能在这里找到----当然,经过特殊编程处理的程序可以通过另外的方法不在这里显示。
打开“启动”标签,“启动项目”中罗列的是开机启动程序的名称,“命令”下是具体的程序附加命令,最后的"位置"就是该程序在注册表中的相应位置了,你可以对可疑的程序进行详细的路径、命令检查,一旦发现错误,就可以用下方的"禁用"来禁止该程序开机时候的加载。
一般来讲所有我们可见的程序的列表,你完全可以通过它来管理你的启动程序,换句话,这里可以全部是空的。
2、注册表中相应的启动加载项目
注册表的启动项目是病毒和木马程序的最爱,非常多的病毒木马的顽固性就是通过注册表来实现的,特别是在安装了新的软件程序,一定不要被程序漂亮的外表迷惑,一定要看清楚它的实质是不是木马的伪装外壳或者是捆绑程序,必要的时候可以根据备份来恢复注册表。
我们也可以通过手动的方法来检查注册表中相应的位置,注意同安全、清洁的系统注册表相应键进行比较,如果发现不一致的地方,一定要弄清楚它是什么东西!不要相信写在外面的 “system”、
“windows”、“programfiles”等名称,尤其是如果你仔细观察的话,有些字符是不一样的,比如0和o的区别,1和l的区别等,如果经过详细的比较,可以确定它是不明程序的话,不要手软,马上删除。
主要的启动加载键值有
“Explorer\Run”键值──在HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies \Explorer\Run〕下。
“RunServicesOnce”子键──在〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion \RunServicesOnce〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows \CurrentVersion\RunServicesOnce〕下。
“RunServices”子键──在〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion \RunServices〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows \CurrentVersion\RunServices〕下。
“RunOnce”子键──在〔HKEY_CURRENT_USER\Software \Microsoft\Windows\CurrentVersion\RunOnce〕和〔HKEY_LOCAL_MACHINE\Software \Microsoft\Windows\CurrentVersion\RunOnce〕下。
“Run”子键──在
〔HKEY_CURRENT_USER\Software\Microsoft \Windows\CurrentVersion\Run〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft \Windows\CurrentVersion\Run〕下。
3、“启动”项目
在windows的“开始”中有自带的启动文件夹,它是最常见的启动项目。如果在安装程序时设置成开机既启动,这个程序就装入到这个文件夹中,系统启动就会自动地加载相应程序。
具体的位置是“开始”菜单中的“所有程序”-“启动”选项。
在硬盘上的位置是:C:\Documents and Settings\你的用户名\「开始」菜单\程序\启动。
在注册表中的位置是:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run。
这里最好为空,而且用户要不时地检查一下这里有什么不明的东西。
4、boot.ini
当用户的电脑有ghost备份、dos工具或者是双系统时,在开机后就出现个让用户选择,如果不选择就以默认的启动的窗口,(屏幕底部是F8高级启动),boot.ini就控制这个地方。
里边的内容一般是
timeout=x (x一般在1-5就可以了)
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect…………
BOOT.INI是一个非常重要的系统文件,是系统启动时,需要查询的一个系统文件,它告诉启动程序本计算机有几个操作系统、各系统的位置在哪里等信息。没有它或者误删了,系统还能进行引导,但是一个是只能引导默认的系统,不在有你的备份系统的引导选择,在一个是每次开机重启时都显示两行字:“boot.ini文件是非法的,现在正从C:/Windows/下启动”,但是速度明显慢了。所以我们平时除了要对其作必要的备份之外,还要编辑它的方法。特别是在安装多系统时,如果没有按照从低到高(Windows 98、Windows 2000、Windows XP、Windows 2003)的安装顺序,该文件往往会被损坏。如果我们掌握修改和编辑它的办法,就不会到时候无计可施了。
通过上面可以看出,我们在写程序的时候,如果想让它自启动,那么就可以从上面10个方面入手,懂得了原理,实现起来也比较容易,下面有几个小程序,依然采用c来实现,源码供大家参考。
//CreateRun.cpp
#include<windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
int CreateRun(void)
{
HKEY hKey;
const char *pval ="hwhpapp.exe";
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0, KEY_WRITE, &hKey) !=ERROR_SUCCESS)
return -1;
if(RegSetValueEx(hKey, "hwhpapp", 0, REG_SZ, (const unsigned char *)pval, strlen(pval)+1)
!=ERROR_SUCCESS)
{
RegCloseKey(hKey);
return -1;
}
RegCloseKey(hKey);
return 0;
}
void main()
{
if(CreateRun()!=0)
printf("Can't Create Run !\n");
getch();
}
//实用代码一
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("系统参数错误,不能随系统启动");
}
}