c++ - 将 C++ __fastcall Hook 从 x86 移植到 x64

标签 c++ visual-studio visual-studio-2010 visual-c++ 64-bit

我有一个在 x86 上运行良好的钩子(Hook)函数。感谢 Bo Persson。

void __fastcall Hook(Class* ThisInECX, int UnknownEDX, OtherClass* P1, void* P2, void* P3)
{
    static void* OriginalFunctionPointer = GetProcAddress(GetModuleHandleA("Some.dll"), "[...]");
    static auto OriginalFunction = ((void(__fastcall*)(Class* ThisInECX, int UnknownEDX, OtherClass* P1, void* P2, void* P3))OriginalFunctionPointer);

    OriginalFunction(ThisInECX, UnknownEDX, P1, P2, P3);
}

现在我正在尝试将其移植到 x64。我从几个片段中发现和理解的是: 我在前面有另一个变量“int UnknownRDX”,但没有它至少正确地调用了 OriginalFunction。 我的真实变量(P1 等)似乎以某种方式被抵消了(或者我的问题有所不同)。 我实际上需要知道这个声明是否正确,以便我可以在更糟糕的位置寻找问题。

void Hook(Class* This, int Unknown0, int Unknown1, OtherClass* P1, void* P2, void* P3)
{
    static void* OriginalFunctionPointer = GetProcAddress(GetModuleHandleA("Some64.dll"), "[...]");
    static auto OriginalFunction = ((void(*)(Class* This, int Unknown0, int Unknown1, OtherClass* P1, void* P2, void* P3))OriginalFunctionPointer);

    // Using P1 here is fine on x86 but not on x64

    OriginalFunction(This, Unknown0, Unknown1, P1, P2, P3)
}

最佳答案

x64 上只有一个调用约定,因此您可以从签名中删除它。可能出错的地方是您试图从 x64 函数加载过程的 x86 版本。

编辑:哦等等,你之前发布过关于 x86/x64 Hook 的问题,对吧?我非常有信心这不是这里的问题。

我要说的是,以前,您的代码依赖于调用约定特定的 hack,但在 x64 上只有一个调用约定。

http://msdn.microsoft.com/en-us/library/ms235286.aspx

关于c++ - 将 C++ __fastcall Hook 从 x86 移植到 x64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6521127/

相关文章:

c# - 为什么visual studio中的extract method命令会创建静态方法?

c# - Visual Studio : How to show Overloads in IntelliSense?

c# - 更改程序集名称破坏了我的 XAML 设计器

visual-studio-2010 - 是否有用于 Visual Studio 2010 解决方案依赖项的工具?

c++ - 配对可变参数模板(命名元组)

c++ - 向注册表添加新 key 不起作用

c++ - 如何在运行时确定您的 C++ 应用程序何时附加了 visual studio 调试器?

c# - 如何在其他电脑上打包安装Windows 10应用

c++ - 为什么 Qt 不支持只 move QList?

c++ - 驱动函数到底是什么?