指向未知类函数的任意指针 - 无效的类型转换

时间:2010-09-05 02:11:23

标签: c++ pointers function-pointers casting

我有一个黑客程序;它将一些函数注入目标进程来控制它。该程序是用C ++编写的,带有内联汇编。

class GameProcMain {
 // this just a class
};

GameProcMain* mainproc; // there is no problem I can do =(GameProcMain*)0xC1EA90

现在我想定义一个类函数(将ecx设置为类指针)而不是编写汇编。

PPLYDATA GetNearblyMob(__Vector3* cordinate) {
    __asm {
    mov ecx, 0xC1EA90
    enter code here
    push cordinate
    mov edi, 0x4A8010
    call edi
    }
}

我想定义它并称之为。

PPLYDATA (DLPL::*GetNearblyMob)(__Vector3* cordinate);

mainproc->GetNearblyMob(ADDR_CHRB->kordinat)

当我尝试GetNearblyMob=(PPLYDATA (DLPL::*)(__Vector3*)) 0x4A8010;

它说的是error: invalid type conversion: "int" to "PPLYDATA (DLPL::*)(int, int)"

但我可以这样设置指针:

void initializeHack() {
__asm {
LEA edi, GetNearblyMob
MOV eax, 0x4A8010
MOV [edi], eax
}
}

现在我想学习“如何在不使用汇编的情况下设置GetNearblyMob并在C ++中合法地使用”。

2 个答案:

答案 0 :(得分:1)

我有点意外,你不会那样投。

您可以尝试执行类似

的操作
GetNearblyMob=reinterpret_cast<PPLYDATA (DLPL::*)(__Vector3*)> (0x4A8010);

如果仍然无效,请尝试

*(int*)(&GetNearblyMob) = 0x4A8010;

答案 1 :(得分:1)

问题是成员函数会自动为this指针获取额外的参数。有时您可以在成员函数和非成员函数之间进行转换,但我认为不需要转换任何内容。

通常,对C函数进行反向工程比对C ++进行反向工程更容易。 C通常具有更直接的ABI,因此您可以在完成数据结构时保持数据结构的正确性。

所以,我建议

PPLYDATA (*GetNearblyMob)(DLPL *main_obj, __Vector3* cordinate) = 0x12345UL;

然后定义自己的函数

class DLPL {
    GetNearblyMob( __Vector3* cordinate ) {
        return ::GetNearblyMob( this, cordinate );
    }
    // ... other program functions
};