jos*_*max 5 c windows interrupt system-calls interrupt-handling
我正在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;
}
Run Code Online (Sandbox Code Playgroud)
哪个工作得相当好(但很慢),问题是Windows首先尝试处理指令/中断,对于使用sysenter/sysexit而不是int 0x99的非本机二进制文件,非本机二进制文件中的一些systenter指令实际上是有效的NT内核调用,这意味着我的处理程序永远不会被调用,更糟糕的是; "主机"操作系统的状态也受到了损害.有没有办法在Windows中"捕获"sysenter指令?我该怎么做呢?
据我所知,没有办法(从用户模式进程)“禁用” SYSENTER,因此执行它会生成异常。(我假设你的程序不会尝试这样做SYSEXIT,因为只有 Ring 0 可以做到这一点)。
我认为你唯一的选择就是像 VirtualBox 那样,扫描无效指令,用非法操作码或类似的东西替换它们,你可以捕获并模拟它们。见10.4。有关软件虚拟化的详细信息。
为了解决这些性能和安全问题,VirtualBox 包含一个代码扫描和分析管理器 (CSAM),用于反汇编来宾代码,以及补丁管理器 (PATM),可以在运行时替换它。
在执行环 0 代码之前,CSAM 会递归扫描它以发现有问题的指令。然后,PATM 执行原位修补,即,它将指令替换为跳转到管理程序内存,其中集成代码生成器已放置更合适的实现。事实上,这是一项非常复杂的任务,因为有很多奇怪的情况需要发现和正确处理。因此,鉴于 PATM 目前的复杂性,人们可能会说 PATM 是一种先进的原位重新编译器。
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |