我只是对此有一个快速的疑问。
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::OldProcessEvent
还是要转到ProcessEvent
我自己内部拥有的DLLMain
?
该HookProcessEventProxy
是我的里面DLLMain
。
从代码中特定于供应商的扩展,似乎您正在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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句