我正在使用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说明?我该怎么做呢?
答案 0 :(得分:2)
据我所知,没有办法(从用户模式进程)到“禁用”SYSENTER
,因此执行它会产生异常。 (我假设您的程序不会尝试SYSEXIT
,因为只有Ring 0可以这样做。)
我认为你唯一的选择是像VirtualBox那样做,并扫描无效指令,用非法操作码或类似的东西替换它们,你可以捕获并模仿。请参阅10.4. Details about software virtualization。
为了解决这些性能和安全问题,VirtualBox包含一个代码扫描和分析管理器(CSAM),它可以反汇编访客代码,以及Patch Manager(PATM),它可以在运行时替换它。
在执行ring 0代码之前,CSAM会递归扫描它以发现有问题的指令。 PATM然后执行原位修补,即它将指令替换为管理程序存储器,其中集成代码生成器已经放置了更合适的实现。实际上,这是一项非常复杂的任务,因为有很多奇怪的情况需要被发现和正确处理。因此,由于目前的复杂性,人们可以说PATM是一种先进的原位重新编译器。