【发布时间】:2015-07-22 09:42:58
【问题描述】:
我正在 Windows 中开发一个运行时非本机二进制转换器,到目前为止,我已经能够为我尝试使用丑陋的操作系统二进制文件“捕获”中断(即 INT 0x99)使用 Windows SEH 处理无效中断的 hack;但仅仅是因为系统调用向量与 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 指令在非-native 二进制文件在执行时实际上是有效的 NT 内核调用,这意味着我的处理程序永远不会被调用,更糟糕的是; “主机”操作系统的状态也受到影响。有没有办法在 Windows 中“捕获”系统输入指令?我该怎么做呢?
【问题讨论】:
-
这是在 64 位长模式下运行,还是在 32 位兼容 (WOW64) 模式下运行?
-
它使用 32 位比较模式,因为我模拟的二进制文件是 32 位的
-
我想这并不重要,因为 SYSENTER 在 32 位上仍然有效。我不确定是否有任何 32 位版本的 Windows 支持 SYSENTER,但显然(根据您的实验),它们确实支持。
标签: c windows interrupt system-calls interrupt-handling