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

visual studio - Porting C++ __fastcall Hook from x86 to x64

本文关键字:x86 x64 Hook studio- C++ fastcall visual      更新时间:2023-10-16

我有一个钩子函数,它在x86上运行良好。感谢Bo佩尔森。

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挂钩的问题,对吧?我很有信心这不是问题所在。

我想说的是,以前,你的代码依赖于调用约定特定的黑客,但在x64上只有一个调用约定。

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