将C ++ __fastcall挂钩从x86移植到x64

时间:2011-06-29 13:07:42

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

我有这个钩子函数在x86上运行正常。感谢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”但没有它在atleast上正确称为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)
}

1 个答案:

答案 0 :(得分:1)

x64上只有一个调用约定,所以你可以从签名中删除它。可能出现的问题是您尝试从x64函数加载x86版本的过程。

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

我要说的是,之前,您的代码依赖于调用约定特定的黑客攻击,但是在x64上只有一个调用约定。

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