首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows上在用户空间“捕获”进程自己的系统调用

在Windows上在用户空间“捕获”进程自己的系统调用
EN

Stack Overflow用户
提问于 2015-05-11 18:43:17
回答 1查看 320关注 0票数 5

我正在Windows中开发一个运行时非本机二进制翻译程序,到目前为止,我已经能够“捕获”操作系统二进制文件的中断(即INT 0x99),我试图通过使用使用Windows SEH处理无效中断的丑陋黑客来模拟操作系统二进制文件;但这只是因为系统调用向量与Windows中的系统调用向量不同,允许我通过这样的操作捕获这些“软”异常:

代码语言:javascript
复制
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的非本地二进制文件,非本地二进制文件中的一些系统指令在执行时实际上是有效的NT内核调用,这意味着我的处理程序从未被调用,更糟的是,“主机”操作系统的状态也受到了损害。有什么办法在Windows中“诱捕”同意指令吗?我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 19:27:38

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

我认为你唯一的选择就是像VirtualBox一样,扫描无效的指令,用非法的操作码或类似的东西代替它们,这样你就可以捕捉并模仿它们。见10.4.软件虚拟化的详细信息

为了解决这些性能和安全问题,VirtualBox包含一个代码扫描和分析管理器(CSAM),用于反汇编来宾代码,以及PATM (PATM),它可以在运行时替换它。 在执行ring 0代码之前,CSAM递归地扫描它以发现有问题的指令。然后,PATM执行就地修补,即用跳转到虚拟机监控程序内存来替换指令,其中集成的代码生成器已经放置了更合适的实现。在现实中,这是一个非常复杂的任务,因为有许多奇怪的情况需要发现和正确处理。因此,鉴于PATM目前的复杂性,人们可能会认为PATM是一种先进的原位再编译器.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30175249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档