shellcode加载免杀
UUID为主的新型API加载技术
API组合
DDE函数写入内存
- DdeInitialize实例化一个DDE
- 使用DdeCreateDataHandle函数和DdeGetData可将shellcode写入内存
- 加载(回调函数)
CoTaskMenAlloc申请内存
申请内存为可读可写
VirtualProtect改为可读可执行
避免可读可写可执行敏感区域AllocADsMem和ReallocADsMem
MAC免杀
- VirtualAlloc分配一个内存
- RtlEthernetStringToAddressA将mac值转为二进制写入内存
-
IPV4/V6
RtlIpv4AddressToStringA
- RTlIpv6AddressToStringA
- inet_pton加载
-
注册表免杀
RegSeValueExA写入shellcode到注册表
- VirtualAlloc分配一个内存
- RegQueryValueExA读取注册表到内存
- 执行
RegDeleteValueA删除注册表中的shellcode
剪贴板+新型分离免杀
echo fcxxxx | clip
- OpenClipboard
- GetClipboardData(CF_TEXT)
- GlobalLock 读取出来的是字符串
- Hexdecode
- 写入内存并加载
技巧类加载
地狱之门(HellGate)加载
直接系统调用,从硬盘上读取ntdll
相似的思路,是Dinvoke框架[Csharp]
Go语言导入表隐藏API和减少体积
LoadLibrary->GetProcAddress->Syscall9
替换传统创建线程执行的shellcode执行流程
隐藏 API Name
使用API Hash -> 随机API Hash
bypass内存加载
VEH异常处理规避内存扫描
windows中主要的异常处理机制:VEH,SEH,C++EH
SEH:结构化异常处理,平时使用的try finally try except
VEH:向量异常处理。一般来说用AddVectoredExceptionHandler去添加一个异常处理函数,可以通过第一个参数决定是否将VEH函数插入到VEH链表头,插入到链表头的函数先执行,如果为1,则会优先执行
C++EH:是C++提供的异常处理方式,执行顺序将排到最后面
在用户模式下发生异常时,异常处理分发函数在内部会先调用遍历VEH记录链表的函数,如果没有找到可以处理异常的注册函数,再开始遍历SEH注册链表
- 终止当前程序的执行
- 调试器(进程必须被调试,向调试器发送EXCEPTION_DEBUG_EVENT消息)
- 执行VEH
- 执行SEH
- TopLevelEH(进程被调试时候不会被执行)
- 执行V E H
- 交给调试器(上面的异常都说处理不了,就再次交给调试器)
- 调用异常端口通知csrss.exe
V E H的执行顺序要优于SEH
当av扫描进程空间的时候,并不会将所有的内存空间都扫描一遍,否则资源消耗大,只会扫描敏感的内存区域
所谓的敏感区域无非是指可执行的区域,我们可以不断改变这一块内存属性,当应该执行命令或者某些操作的时候,执行的内存属性为可执行,当功能模块进入睡眠的时候则将内存属性改为不可执行
当执行的地址空间为不可执行时候,若强制执行则会返回0xc0000005异常,这个异常没有权限执行,所以通过V E H抓取这个异常,则可根据需求动态的改变内存属性,进而规避内存扫描
MSBuild执行shellcode
可以使用本机的二进制文件msbuild[系统白名单程序]来编译和执行存储在xml中的内嵌csharp代码
利用”小众”语言进行免杀
nim,Vlang,F#,Go
将来可能会出现zig
这一点还是可以持续的,主要是因为新的编程语言可以在不断的发明,而编程语言组成的二进制却一时间让杀软无法分析,只需要懂得新编程语言,windows A P I的调用方式,便可以过静态免杀
加密和混淆
powershell免杀
mimikatz免杀
基本需要从源代码方面进行改动,才能处理
或者国内杀软不注重内存,可以利用PE加载器
反弹shell免杀
重写一个反弹程序
https://github.com/trickster0/UDPlant rust.udp通道,隐蔽和免杀性较好
内存执行
https://github.com/TheWover/donut 可在内存中执行VBScript,JScript,EXE,DLL和DotNet程序 且内存加密