#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
// 功能:当前可执行文件开机自启动设置
// 参数: 无
// 返回值: true ---- 设置成功, false ---- 设置失败
bool SetupStartupRun()
{
_TCHAR regName[]= TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
HKEY hkResult;
int ret=RegOpenKey(HKEY_LOCAL_MACHINE, regName, &hkResult);
_TCHAR FileName[MAX_PATH];
GetModuleFileName(NULL, FileName, sizeof(FileName));//取得程序名字
ret = RegSetValueEx(hkResult, TEXT("Donview_Server"), 0, REG_SZ, (BYTE *)FileName, sizeof(FileName));
if(ERROR_SUCCESS == ret)
{
RegCloseKey(hkResult);
}
else
{
return false;
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(SetupStartupRun())
{
cout << "设置开机启动成功.." << endl;
}
else
{
cout << "设置开机启动失败.." << endl;
}
return 0;
}
//
#include <stdio.h>
#include <windows.h>
int main(void)
{
char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
HKEY hkResult;
int ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&hkResult);
ret=RegSetValueEx(hkResult,"54rk"/* 注册表键名*/,0,REG_EXPAND_SZ,(unsigned char *)"%systemroot%\\54rk.exe",25);
if(ret==0){
printf("success to write run key\n");
RegCloseKey(hkResult);
}
else {
printf("failed to open regedit.%d\n",ret);
return 0;
}
char modlepath[256];
char syspath[256];
GetModuleFileName(0,modlepath,256);//取得程序名字
GetSystemDirectory(syspath,256);
ret=CopyFile(modlepath,strcat(syspath,"\\54rk.exe"),1);
if(ret)
{
printf("%s has been copyed to sys dir %s\n",modlepath,syspath);
}
else printf("%s is exisis",modlepath);
return 0;
}
注册表是启动程序藏身之处最多的地方,主要有以下几项:
1.Run键
Run键是病毒最青睐的自启动之所,该键位置是[HKEY_CURRENT_
USER\Software\Microsoft\Windows\CurrentVersion\Run]和[HKEY_
LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run],其下的所有程序在每次启动登录时都会按顺序自动执行。
还有一个不被注意的Run键,位于注册表[HKEY_CURRENT_
USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run]
和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Policies\Explorer\Run],也要仔细查看。
2.RunOnce键
RunOnce位于[HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\RunOnce]和[HKEY_LOCAL_MACHINE\Software\Microsoft\
Windows\CurrentVersion\RunOnce]键,与Run不同的是,RunOnce下的程序仅会被自动执行一次。
3.RunServicesOnce键
RunServicesOnce键位于[HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\RunServicesOnce]和[HKEY_LOCAL_MACHINE\
Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]下,其中的程序会在系统加载时自动启动执行一次。
4.RunServices键
RunServices继RunServicesOnce之后启动的程序,位于注册表[HKEY_CURRENT_USER\
Software\Microsoft\Windows\CurrentVersion\RunServices]和
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunServices]键。
5.RunOnceEx键
该键是Windows XP/2003特有的自启动注册表项,位于[HKEY_
CURRENT_USER\\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx]和
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunOnceEx]。
6.load键
[HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows]下的load键值的程序也可以自启动。
7.Winlogon键
该键位于位于注册表[HKEY_CURRENT_USER\SOFTWARE\
Microsoft\Windows NT\CurrentVersion\Winlogon]和[HKEY_LOCAL_MACHINE\
SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Winlogon],注意下面的Notify、Userinit、Shell键值也会有自启动的程序,而且其键值可以用逗号分隔,从而实现登录的时候启动多个程序。
8.其他注册表位置
还有一些其他键值,经常会有一些程序在这里自动运行,如:[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\Shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad]
[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]
[HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\System\Scripts]
小提示:
注册表的[HKEY_LOCAL_MACHINE]和[HKEY_CURRENT_USER]键的区别:前者对所有用户有效,后者只对当前用户有效。