windows黑客编程系列(四):修改注册表键值对之自启动

自启动技术

对于一个病毒木马来说,重要的不是如何进行破坏,还有如何执行。病毒木马只有加载到内存中开始运行,才能够真正体现破坏力。否则,它就只是一个普通的磁盘文件,对于计算机用户的数据,隐私构不成丝毫的威胁。

自启动技术主要包括四种:

  • 注册表
  • 快速启动目录
  • 计划任务
  • 系统服务

本文中主要介绍注册表技术

注册表

实现自启动的途径和方式有很多,其中修改注册表方式应用的最为广泛。注册表相当是操作系统的数据库,记录着系统中方方面面的数据,其中也不乏直接或间接导致开机自启动的数据。

WINAPI介绍

RegOpenKeyEx函数

打开一个指定的注册表

LONG WINAPI RegOpenKey(
HKEY, hKey,
LPCTSTR lpSubkey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult)
参数说明
  • hKey:主键类型,预定义以下键:
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
    • HEEY_CURRENT_CONFIG
  • lpSubkey:指向一个非中断字符串将要打开的键的名称,如果设置为NULL或者指向一个空字符串,则将打开一个新句柄。
  • ulOptions:保留,设为0
  • samDesired:访问权限,如下表
  • phkResult:指向一个变量的指针,该变量保存打开注册表的句柄,如果该句柄不再使用则使用RegCloseKey关闭。
含义
KEY_CREATE_LINK 准许生成符号键
KEY_CREATE_SUB_KEY 准许生成子键
KEY_ENUMERATE_SUB_KEYS 准许生成枚举子键
KEY_EXECUTE 准许进行读操作
KEY_NOTIFY 准许更换通告
KEY_QUERY_VALUE 准许查询子键
KEY_ALL_ACCESS 提供完全访问
KEY_READ KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY的组合
KEY_SET_VALUE 准许设置子键
KEY_WRITE KEY_SET_VALUE、KEY_CREATE_SUB_KEY的组合
KEY_WOW64_32KEY 表示64位系统中的应用程序应该在32位注册表视图上运行,32位系统会忽略该标志
KEY_WOW64_64KEY 表示64位系统中的应用程序应该在64位注册表视图上运行,32位系统会忽略该标志
返回值
  • 调用成功返回零(ERROR_SUCCESS)
  • 否则返回非零的错误代码

当指定键不存在,则该函数不创建新键

RegSetValueEx

在注册表项下设置指定值的数据和类型

LONG WINAPI RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE *lpData,
DWORD cbData)
参数说明
  • hKey:指定一个以打开项的句柄
  • lpValueName:指向一个字符串的指针,包含预设置值的名称
  • Reserved:保留值,0
  • dwType:指定将存储的数据类型
  • *lpData:指向一个缓冲区,包含了位指定键名称的存储数据
  • cbData:指定lpData参数的数据大小,单位是字节
返回值
  • 调用成功返回0
  • 否则返回一个非零的错误代码

编码

自启动表项的键值通常为以下两个路径:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

现在我们使用regedit找到该路径:

我们进行Windows编程主要是要为Run添加可执行文件的键值对,现在简单写个demo,把计算器添加到Run表项中,实现开机自启。

同时需要注意:HKEY_LOCAL_MACHINE修改该注册表项需要管理员权限,而HKEY_CURRENT_USER修改该表象只需要用户默认权限就可以了。

编码如下:

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <windows.h>
#include <stdio.h>
#include "resource.h"
#include "ConsoleApplication1.h"
#include <tchar.h>
#include <cstring>

BOOL Reg_CurrentUser(LPCTSTR lpszFilename, LPCTSTR lpszValueName)
{
	HKEY hKey;
	LPCTSTR lpSubkey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	if (RegOpenKeyEx(HKEY_CURRENT_USER, lpSubkey, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
	{
		printf("open error!\n");
		return FALSE;
	}
	
	if (RegSetValueEx(hKey, lpszFilename, 0, REG_SZ, (BYTE *)lpszValueName, (1 + 2*lstrlen(lpszValueName))) != ERROR_SUCCESS)
	{
		printf("write error!\n");
		return FALSE;
	}
	RegCloseKey(hKey);
	return TRUE;
}

int main()
{
	LPCTSTR lpszFilename = L"calc";
	LPCTSTR lpszValueName = L"\"C:\\Windows\\System32\\calc.exe\"";
	BOOL flag = Reg_CurrentUser(lpszFilename, lpszValueName);
	if (flag == TRUE)
	{
		printf("success!\n");
	}
	return 0;
}

unicode编码为宽字节,所以长度需要乘2,否则注册表只会写一半。
而如果不使用unicode编码,使用char *的话,会出现乱码情况。

运行效果

现在我们使用regedit再找到该路径,发现多了一个键值对,就是计算器的可执行文件。

发布了300 篇原创文章 · 获赞 162 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/AcSuccess/article/details/105590356
今日推荐