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再找到该路径,发现多了一个键值对,就是计算器的可执行文件。
标签:HKEY,注册表,LPCTSTR,键值,KEY,hKey,自启动 来源: https://blog.csdn.net/AcSuccess/article/details/105590356