"俘获"一个过程'在Windows上的用户空间中拥有自己的sysenter调用

时间:2015-05-11 18:43:17

标签: c windows interrupt system-calls interrupt-handling

我正在使用Windows中的运行时非本机二进制翻译器,到目前为止,我已经能够“陷阱”#34;操作系统二进制文件的中断(即INT 0x99)我试图通过使用一个使用Windows SEH处理无效中断的丑陋黑客进行模拟;但只是因为系统调用向量与Windows中的不同,允许我抓住这些" soft"通过做这样的事情来例外:

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中的sysenter说明?我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

据我所知,没有办法(从用户模式进程)到“禁用”SYSENTER,因此执行它会产生异常。 (我假设您的程序不会尝试SYSEXIT,因为只有Ring 0可以这样做。)

我认为你唯一的选择是像VirtualBox那样做,并扫描无效指令,用非法操作码或类似的东西替换它们,你可以捕获并模仿。请参阅10.4. Details about software virtualization

  

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

     

在执行ring 0代码之前,CSAM会递归扫描它以发现有问题的指令。 PATM然后执行原位修补,即它将指令替换为管理程序存储器,其中集成代码生成器已经放置了更合适的实现。实际上,这是一项非常复杂的任务,因为有很多奇怪的情况需要被发现和正确处理。因此,由于目前的复杂性,人们可以说PATM是一种先进的原位重新编译器。