Windows 10 x86环境下汇编语言访问违例异常的处理方法咨询
汇编访问违例问题解决方案
针对Windows 10 x86环境、不可修改源shellcode的限制,现有3种可行方案处理该访问违例问题:
- 方案1:注册向量化异常处理(VEH)
调用Windows APIAddVectoredExceptionHandler注册进程全局VEH handler,其优先级高于SEH,无需修改目标shellcode。handler内捕获EXCEPTION_ACCESS_VIOLATION异常后,先判断异常触发地址是否属于当前运行的shellcode区间:- 若为读取
0x400000或写入[EAX]的指令触发违例,直接修改上下文的EIP寄存器值,跳转到.start标签位置重试执行即可 - 如需更稳定,可额外校验EAX指向的内存是否已被释放,若已释放则先更新
0x400000存储的有效内存指针再跳转重试
- 若为读取
- 方案2:Hook
VirtualFree调用
对另一线程调用的VirtualFree做inline hook,钩子逻辑中先判断待释放的内存地址是否和0x400000存储的地址一致:如果一致,先暂停执行shellcode的线程,等VirtualFree执行完成、且0x400000更新为新的有效内存指针后,再恢复shellcode线程运行,从根源避免时序竞争 - 方案3:调试器附着处理
可将调试器附着到目标进程,捕获访问违例调试事件后,按照和VEH handler相同的逻辑调整EIP重试,无需修改目标进程的任何运行时代码
以上方案均不需要修改现有shellcode,优先选择VEH方案,性能开销最低,兼容性最好。
内容的提问来源于stack exchange,提问作者4zu
相关产品推荐
相关产品推荐

