gpt4 book ai didi

delphi - 设置未处理异常过滤器 : Continue execution 1 opcode further

转载 作者:行者123 更新时间:2023-12-03 15:13:22 25 4
gpt4 key购买 nike

我正在 Delphi 中开发 Xbox1 模拟器,因为我在本地 CPU 上运行游戏,所以我必须为游戏代码中可能出现的ring0指令创建故障保护。

为了能够捕获这些指令,我了解到 SetUnhandledExceptionFilter 可以注册一个将在非 Delphi 异常上调用的函数(假设我将 JITEnable 设置为大于 0 的值)。注册回调函数的签名如下:

function ExceptionFilter(E: LPEXCEPTION_POINTERS): Integer; stdcall;

在该函数内,我可以测试如下非法指令:

// STATUS_PRIVILEGED_INSTRUCTION = $C0000096
if E.ExceptionRecord.ExceptionCode = STATUS_PRIVILEGED_INSTRUCTION then

其中一个有问题的指令是 WVINDB ($0F,$09),我可以这样检测:

 // See if the instruction pointer is a WBINVD opcode :
if (PAnsiChar(E.ExceptionRecord.ExceptionAddress)[0] = #$0F)
and (PAnsiChar(E.ExceptionRecord.ExceptionAddress)[1] = #$09) then

这一切都有效(假设我在调试器外部运行此代码),但我无法让代码在失败的指令之外执行 - 我尝试了这样的操作:

  begin
// Skip the WBINVD instruction, and continue execution :
Inc(DWORD(E.ExceptionRecord.ExceptionAddress), 2);
Result := EXCEPTION_CONTINUE_EXECUTION;
Exit;
end;

唉,这行不通。实际上,我会使用真正的指令指针(E.ContextRecord.Eip),但不知何故,整个 ContextRecord 似乎没有填充。

我该怎么做才能使其按预期工作?

PS:当使用调试器运行时,我希望这段代码最终出现在我的 ExceptionFilter 例程中,但事实并非如此——它只能在没有调试器的情况下工作;这是为什么?

DebugHook := 0; // Act as if there's no debugger
// Trigger a privileged instruction exception via this ring0 instruction :
asm
WBINVD
end;
// Prove that my exception-filter worked :
ShowMessage('WBINVD succesfully ignored!');

最佳答案

SetUnhandledExceptionFilter 似乎是某种 Delphi 包装器,如果直接执行可能会更幸运?

您可以使用 AddVectoredExceptionHandler 注册您自己的异常处理程序,这将调用 callback函数给你 EXCEPTION_POINTERS结构。该结构的 Context 成员返回您可以修改的 ao EIP。

如果在回调中返回 EXCEPTION_CONTINUE_EXECUTION,则继续在给定的 EIP 处执行。

关于delphi - 设置未处理异常过滤器 : Continue execution 1 opcode further,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com