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

读取EXE解密后内存执行时WaitForSingleObject触发访问违规问题求助

问题排查

你遇到的访问违规不是WaitForSingleObject本身触发的,是你启动的线程执行非法内存触发异常后,异常抛到了WaitForSingleObject调用处,核心错误有以下几点:

  • 第一,sizeof(decipheredBuffer)使用错误:decipheredBuffer是指针类型,32位进程下它的大小永远是4字节、64位进程下永远是8字节,根本不是解密后EXE的实际大小exeSize。你现在只拷贝了最多8字节的内容到可执行内存,剩下的内存都是未知数据,执行肯定会崩溃。
  • 第二,CreateThread参数传错:第二个参数是线程栈的大小,传0代表使用默认栈大小即可,你传sizeof(decipheredBuffer)完全不符合参数要求,也是导致异常的原因之一。
  • 第三,PE文件不能直接当shellcode执行:普通EXE是PE格式文件,包含PE头、节表、重定位表、导入表等结构,你直接把整个PE文件读进内存就执行入口点是跑不起来的,必须要手动做PE加载的完整流程:解析PE头找实际入口点、做节区内存对齐、处理重定位、修复导入表、调整内存权限后才能执行。只有解密结果是独立的shellcode才可以直接执行,正常EXE绝对不行。
  • 第四,冗余的VirtualProtect调用:你VirtualAlloc的时候已经申请了PAGE_EXECUTE_READWRITE权限,后续再调用一次VirtualProtect设成同样的权限完全没有必要,属于无效代码。

修复步骤

  1. 把所有用到sizeof(decipheredBuffer)的地方全部替换成实际的EXE大小exeSize。
  2. 修改CreateThread调用的第二个参数为0,使用默认线程栈大小。
  3. 如果你要加载的是普通PE文件,补充完整PE加载逻辑:
    • 解析解密后的PE缓冲区的IMAGE_DOS_HEADER、IMAGE_NT_HEADERS结构
    • 按照PE的节区信息分配对应大小的内存,把各个节区拷贝到对应偏移
    • 处理重定位表,修正基地址不符的地址偏移
    • 解析导入表,加载依赖的DLL,修复IAT表的函数地址
    • 最后跳转到PE的AddressOfEntryPoint指向的入口地址执行
  4. 线程句柄用完要记得调用CloseHandle释放资源,避免句柄泄漏。

修正后的核心代码示例

unsigned char key[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
AES aes(128);
unsigned char* decipheredBuffer = aes.DecryptECB((unsigned char*)buffer, exeSize, key);

void* executable_area = VirtualAlloc(0, exeSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (executable_area == nullptr) {
    return 0;
}
// 拷贝全量exe内容
memcpy(executable_area, decipheredBuffer, exeSize);

// 如果是shellcode的情况下可以直接执行,PE文件需要先做加载处理再取入口点
LPTHREAD_START_ROUTINE entry_point = (LPTHREAD_START_ROUTINE)executable_area;
// 如果是PE文件的话,入口点应该是 executable_area + ntHeader->OptionalHeader.AddressOfEntryPoint

HANDLE hThread = CreateThread(NULL, 0, entry_point, NULL, 0, NULL);
if (hThread != nullptr) {
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread); // 释放线程句柄
}

VirtualFree(executable_area, 0, MEM_RELEASE);

内容的提问来源于stack exchange,提问作者solideCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:54:04