Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;诱捕;a进程';在Windows上的用户空间中拥有syscenter调用_C_Windows_Interrupt_System Calls_Interrupt Handling - Fatal编程技术网

&引用;诱捕;a进程';在Windows上的用户空间中拥有syscenter调用

&引用;诱捕;a进程';在Windows上的用户空间中拥有syscenter调用,c,windows,interrupt,system-calls,interrupt-handling,C,Windows,Interrupt,System Calls,Interrupt Handling,我正在Windows中开发一个运行时非本机二进制转换器,到目前为止,我已经能够通过使用一个使用Windows SEH处理无效中断的丑陋的黑客程序,为我试图模拟的OS二进制文件“捕获”中断(即INT 0x99);但这只是因为系统调用向量不同于Windows中的调用向量,允许我通过如下操作捕获这些“软”异常: static int __stdcall handler_cb(EXCEPTION_POINTERS* pes, ...) { if (pes->ExceptionRecord

我正在Windows中开发一个运行时非本机二进制转换器,到目前为止,我已经能够通过使用一个使用Windows SEH处理无效中断的丑陋的黑客程序,为我试图模拟的OS二进制文件“捕获”中断(即INT 0x99);但这只是因为系统调用向量不同于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首先尝试处理指令/中断,对于使用syscenter/sysexit而不是int 0x99的非本机二进制文件,非本机二进制文件中的某些syscenter指令在执行时实际上是有效的NT内核调用,这意味着我的处理者从未被呼叫过,更糟的是;“主机”操作系统的状态也受到影响。有没有办法在Windows中“捕获”sysenter指令?我将如何执行此操作?

据我所知,无法(从用户模式进程)“禁用”
syscenter
,因此执行它将生成异常。(我假设您的程序不尝试退出系统,因为只有环0可以这样做)

我认为您唯一的选择是像VirtualBox一样,扫描无效指令,用非法操作码或类似的东西替换它们,您可以捕获并模拟这些指令。看

为了解决这些性能和安全问题,VirtualBox包含一个代码扫描和分析管理器(CSAM),用于反汇编来宾代码,以及一个补丁管理器(PATM),可以在运行时替换它

在执行环0代码之前,CSAM递归地扫描它以发现有问题的指令。PATM然后执行原位修补,即,它用跳转到虚拟机监控程序内存来替换指令,集成代码生成器在其中放置了更合适的实现。实际上,这是一项非常复杂的任务,因为有许多奇怪的情况需要发现并正确处理。因此,鉴于其目前的复杂性,有人可能会认为PATM是一种先进的原位重新编译程序


这是在64位长模式下运行,还是在32位兼容(WOW64)模式下运行?它使用32位可比模式,因为我正在模拟的二进制文件是32位的,我想这并不重要,因为SYSENTER无论如何在32位上都是有效的。我不确定是否有任何32位版本的Windows支持SysCenter,但显然(从您的实验来看),它们支持SysCenter。