我只是有一个简单的问题,关于它是否会起作用。
void __declspec(naked) HookProcessEventProxy() {
__asm {
mov CallObjectPointer, ecx
push edx
mov edx, dword ptr[esp + 0x8]
mov UFunctionPointer, edx
mov edx, dword ptr[esp + 0xC]
mov ParamsPointer, edx
pop edx
pushfd
pushad
}
ProcessEventProxy();
__asm {
popad
popfd
jmp[Pointers::OldProcessEvent] // This is the line in question.
}
}
Pointers命名空间是否定义为转到Pointers::OldProcessEvent
,还是转到我ProcessEvent
内的DLLMain
?
HookProcessEventProxy
位于DLLMain
内。
答案 0 :(得分:1)
从代码中特定于供应商的扩展,似乎您在MSVC上编译它。如果是这样,那么这不是问题。内联汇编程序了解C ++作用域规则和标识符。
您可以通过分析编译器生成的目标代码轻松地自行验证。使用dumpbin /disasm
反汇编二进制文件,或者在运行编译器时抛出/FA
开关以获得单独的列表。您将看到的是编译器以非常直接的方式发出内联汇编:
?HookProcessEventProxy@@YAXXZ PROC ; HookProcessEventProxy, COMDAT
mov DWORD PTR ?CallObjectPointer@@3HA, ecx ; CallObjectPointer
push edx
mov edx, DWORD PTR [esp+8]
mov DWORD PTR ?UFunctionPointer@@3HA, edx ; UFunctionPointer
mov edx, DWORD PTR [esp+12]
mov DWORD PTR ?ParamsPointer@@3HA, edx ; ParamsPointer
pop edx
pushfd
pushad
call ?ProcessEventProxy@@YAXXZ ; ProcessEventProxy
popad
popfd
jmp ?OldProcessEvent@Pointers@@YAXXZ ; Pointers::OldProcessEvent
?HookProcessEventProxy@@YAXXZ ENDP ; HookProcessEventProxy
以上列表来自编译器在使用/FA
开关时生成的文件。右边的注释表示相应的C ++对象。
请注意,您不需要分支目标周围的括号。虽然内联汇编程序忽略了它们,但包含它们会令人困惑。只需写下:
jmp Pointers::OldProcessEvent