跳转至

编写蹦床函数

使用清单 8-11 中的函数,你可以复制图 8-1 显示的钩子,但首先你必须创建蹦床函数,如下所示:

DWORD restoreJumpHook = 0;
void __declspec(naked) myTrampoline()
{
    __asm {
        PUSHFD
        PUSHAD
        CALL jumpHookCallback
        POPAD
        POPFD
        POP EAX
        MOV AL, 1
        POP EDI
        POP ESI
        JMP [restoreJumpHook]
    }
}

与图 8-1 旁边描述的蹦床一样,这个蹦床存储所有当前标志①和寄存器值②,调用回调函数③,恢复寄存器④,恢复标志⑤,在⑥和⑦处执行被钩子替换的代码,最后跳回跳转和 NOP 正下方的原始代码⑧。

 为确保编译器不在蹦床内自动生成任何额外代码,始终用 __declspec(naked) 约定声明蹦床。