在Windows上的“用户空间”中“捕获”进程自己的sysenter调用
我正在
Windows中运行一个运行时非本机二进制转换器,到目前为止,我已经能够通过使用一个使用丑陋的hack来“捕获”操作系统二进制文件的中断(即INT 0x99) Windows SEH处理无效中断;但只是因为系统调用向量与Windows中的不同,允许我通过执行以下操作来捕获这些“软”异常:
static int __stdcall handler_cb(EXCEPTION_POINTERS* pes,...) { if (pes->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) return EXCEPTION_CONTINUE_SEARCH; char* instruct = (char*) pes->ContextRecord->Eip; if (!instruct) handle_invalid_instruction(instruct); switch (instruct[0]) { case 0xcd: // INT { if (instruct[1] != 0x99) // INT 0x99 handle_invalid_instruction(instruct); handle_syscall_translation(); ... } ... default: halt_and_catch_fire(); } return EXCEPTION_SUCCESS; } 哪个工作得相当好(但很慢),问题是Windows首先尝试处理指令/中断,对于使用sysenter / sysexit而不是int 0x99的非本机二进制文件,非本机二进制文件中的一些systenter指令实际上是有效的NT内核调用,这意味着我的处理程序永远不会被调用,更糟糕的是; “主机”操作系统的状态也受到了损害.有没有办法在Windows中“捕获”sysenter指令?我该怎么做呢? 解决方法
据我所知,没有办法(从用户模式进程)“禁用”SYSENTER,因此执行它会产生异常. (我假设您的程序不尝试SYSEXIT,因为只有Ring 0才能这样做).
我认为你唯一的选择是像VirtualBox那样做,并扫描无效指令,用非法操作码或类似的东西替换它们,你可以捕获并模拟.见10.4. Details about software virtualization.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- jar 在windows 启动服务,卸载服务,停止端口
- 如何使用Action委托参数方法将win32 app中的c方法的地址传递
- windows – PATH_NOT_FOUND和NAME_NOT_FOUND之间的区别是什
- Microsoft Azure认知服务手写检测边界框参数
- windows-store-apps – 集成bing map的windows store app在
- 安装.net framework仍不能执行aspx解决办法
- 如何使用Windows批处理脚本将空ASCII码(nul)写入文件?
- Windows – 更大的文件服务器或SAN?
- 在窗户上安装聚合物
- 在Windows 7 sp1和server 2008上部署Powershell 4.0的最佳方
- windows – 使用TortoiseSVN时,从提交中排除Ecli
- windows-8 – Windows 8 app:如何在GoBack()上传
- 可以使用Windows中的快捷方式为应用程序设置环境
- 从Windows PowerShell运行bash脚本
- 如何在Windows上的MySQL上运行innodb_force_reco
- Windows Workflow Foundation在哪里使用?
- 用于Windows 7的spyder中的strptime的Python Imp
- 在Windows上的Visual Studio代码中调试C#代码
- XP / Vista上的数字签名时间戳“不可用”,导致验
- .net – 什么是User32.dll以及如何在WPF中使用它