我有一个黑客程序;它将一些函数注入目标进程来控制它。该程序是用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 ++中合法地使用”。
答案 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
};