[这个贴子最后由千與千尋在 2005/06/17 04:23am 第 1 次编辑]
其实这不能算是原创,只是收集整理一些前人的东西,总结出来,方便比我还菜的朋友学习,这是初学者的入门文章,这篇文章的目的是让大家学会如何实现程序自启动,今天我们主要了解的是通过注册表Run注册键来实现程序自启动。
我们先来了解Run注册键:
Run是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。虽然是很老的方法,但是很多黑客都在利用它,通过在Run、RunOnce、RunOnceEx、RunServices、RunServicesOnce中添加键值,可以比较容易地实现程序的加载,黑客尤其方便在带”Once”的主键中作手脚,因此带“Once”的主键中的键值,在程序运行后将被删除,因此当用户使用注册表修改程序查看时,不会发现异样。另外,还有这样的程序:在启动时删除Run中的键值,而在退出时又添加键值,达到隐蔽自己的目的。想了解的更详细请用google帮你吧。
当然还有一些别的注册键,具体请参看:《自启动程序之十大藏身之所》这篇文章。地址:http://www.enet.com.cn/A20040624319558_2.html
我们如果想在Run键值中添加自己的程序,首先我们需要了解注册表相关的API函数。
所谓 API(Application Programing Interface) 是 Windows 提供的一个32位环境下的应用程序编程接口,其中包括了众多的函数,提供了相当丰富的功能。我们在编制应用程序时,可以调用其中的注册表函数来对注册表进行操作以实现我们需要的功能。Windows API 中可用于注册表的函数一共有二十多个,根据其功能不同可以分为如下几类:
键管理类: RegCloseKey() RegCreateKey() RegCreateKeyEx() RegDeleteKey() RegDeleteKeyEx() RegOpenKey() RegOpenKeyEx()
值管理类: RegDeleteValue() RegQueryValue() RegQueryValueEx() RegSetValue()
RegSetValueEx()
查询计数类:RegQueryInfoKey() RegEnumKey() RegEnumKeyEx() RegEnumValue()
备份/恢复类:RegLoadKey() RegReplaceKey() RegRestoreKey() RegSaveKey()
实用类:RegConnectRegistry() RegNotifyChangeKeyValue() RegUnloadKey()
安全类(仅适用于NT):RegGetKeySecurity() RegSetKeySecurity()
关于这方面的内容大家想了解更多可以自己找一些相关资料来学习,在这我们只要学会两个函数RegOpenKey() 和 RegSetValueEx() 就可以了。。当然这只是简单的思路,如果你想做更优秀的程序这显然是不够的。
首先我们来了解RegOpenKey() 函数,我们在向注册表添加数据前,首先要创建和打开一个键,RegOpenKey()的功能就是打开一个现有的注册表项(或键);RegOpenKey() 函数原形如下:
--------------------------------------------------------------------------------
LONG RegOpenKey(
HKEY hKey, // 要打开键的句柄
LPCTSTR lpSubKey, // 要打开子键的名字的地址
PHKEY phkResult // 要打开键的句柄的地址
);
参数:
hKey
当前打开键的句柄或下列已确定的保留句柄值:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Windows NT: HKEY_PERFORMANCE_DATA
Windows 95和Windows 98: HKEY_DYN_DATA
被RegOpenKey函数打开地键是能被hKey识别的子键.
lpSubKey
指向包含了要打开键的名字的以空字符结束的字符串。这个键必须是能被hKey参数识别的子键。如果这个参数为NULL或指向一个空字符串,函数返回与被传递相同的句柄。
phkResult
指向一个接收被打开键句柄的变量。当你不再需要返回句柄时,调用RegCloseKey函数关闭它。
返回值:
如果调用成功,返回ERROR_SUCCESS。否则返回一个非零错误码(定义在WINERROR.H)。
--------------------------------------------------------------------------------
下面我们来了解RegSetValueEx()函数,简单的说也就是已经知道一个键句柄了,对这个键的数据进行新建或改写。就好象已经知道一个文件夹,然后对其中的文件改动。呵呵,很棒吧 :)
其函数原形如下:
--------------------------------------------------------------------------------
LONG RegSetValueEx(
HKEY hKey, // 已打开的键的句柄
LPCTSTR lpValueName, // 要查询值的名称,就是你要设置的数据项的名字。
DWORD Reserved, // 保留必须是0
DWORD dwType, // 变量的类型
CONST BYTE *lpData, // 变量数据的地址
DWORD cbData /* 变量的长度 你要设置的数据的长度,如果是字符串型的, 则是strlen+1。如果是整数就是4.*/
);
--------------------------------------------------------------------------------
接下来我们在HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run下创建一个thysea键值,请看代码,很容易理解- char regname[]="\\Software\\Microsoft\\Windows\\CurrentVersion\\Run";
- HEKY hkResult;
- int ret=RegOpenKey(HEKY_LOCAL_MACHINE,regname,&hkResult);
- ret=RegSetValueEx(hkResult,"thysea",0,REG_EXPAND_SZ,(unsigned char *)"%systemroot%\\thysea.exe",25);
- if(ret==0) //如果%systemroot%下有thysea.exe,系统启动将自动运行
- {
- cout<<"success"<<endl;
- RegClosekey(hkResule);
- }
- else
- {
- cout<<"failed"<<endl;
- return 0;
- }
复制代码 如果要想让系统启动时自动运行我们的程序,这显然是不够的,我们还要把程序复制到%systemroot%中,并且程序的名字要一致,在这就是thysea.exe.我们要想把程序复制到系统根目录下就需要用到Copyfile()函数,我们来简单的看一下Copyfile函数:
格式:result := CopyFile(sourceFile, destinationFile, FailIfExists)
说明:该函数的用途是拷贝文件。参数sourceFile是源文件名,destinationFile是目标文件名,均应包括路径,否则使用当前路径,参数FailIfExists指定若目标文件已经存在时的处理方式,当该参数为False时将覆盖已经存在的目标文件。返回值若为0表示出错,若为1表示未出错。如果参数为1表示如果目标文件存在,就不覆盖目标文件,如果参数为0表示强制覆盖。
下面我们来看是如何实现的- char modlepath[256];
- char syspath[256];
- GetModuleFileName(0,modlepath,256); //取指定模块的带路径完整文件名
- GetSystemDirectory(syspath,256); //获取系统根目录
- ret=CopyFile(modlepath,strcat(syspath,"\\thysea.exe"),1);
复制代码 Windows包含的API函数有很多,我们在编程的时侯如果不知道用什么函数,可以用MSDN来帮我们查找 :)
|