在内联汇编代码中使用C ++名称空间

泰勒·萨瑟

我只是对此有一个快速的疑问。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章