繁体   English   中英

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

[英]Porting C++ __fastcall Hook from x86 to x64

我有这个钩子 function 可以在 x86 上正常工作。 感谢博佩尔松。

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 function 加载过程的 x86 版本。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM