系统相关
首页 > 系统相关> > windows黑客编程系列(四):修改注册表键值对之自启动

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

作者:互联网

文章目录

自启动技术

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

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

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

注册表

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

WINAPI介绍

RegOpenKeyEx函数

打开一个指定的注册表

LONG WINAPI RegOpenKey(
HKEY, hKey,
LPCTSTR lpSubkey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult)
参数说明
含义
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位系统会忽略该标志
返回值

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

RegSetValueEx

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

LONG WINAPI RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE *lpData,
DWORD cbData)
参数说明
返回值

编码

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

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再找到该路径,发现多了一个键值对,就是计算器的可执行文件。

标签:HKEY,注册表,LPCTSTR,键值,KEY,hKey,自启动
来源: https://blog.csdn.net/AcSuccess/article/details/105590356