【问题标题】:Arbitrary pointer to unknown class function - invalid type conversion指向未知类函数的任意指针 - 无效的类型转换
【发布时间】:2010-09-05 02:11:23
【问题描述】:

我有一个黑客程序;它向目标进程注入一些函数来控制它。该程序是用 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
}
}

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

【问题讨论】:

  • 你可能不会在这里找到太多帮助来让你的游戏作弊代码发挥作用。
  • 作弊有什么问题?就个人而言,我在 ZX-80 游戏中学习了很多汇编学习作弊。
  • msw,但是我的 hack 可以工作并且没有这个东西也可以工作。我只想编译器生成智能汇编代码,而不是我自己。因为我组装了很多函数,img268.imageshack.us/img268/3432/hackzv.jpg p.s hamster3null,再次感谢你,我也学会了用作弊的组装,我可以使用很多调试器来破解应用程序和挂钩directx。

标签: c++ pointers function-pointers casting


【解决方案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
};

【讨论】:

    【解决方案2】:

    我有点惊讶你不会那样投。

    你可以尝试做类似的事情

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

    如果还是不行,试试

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

    【讨论】:

    • 感谢您的回答。首先是给出这个错误。错误:无效的类型转换:“int”到“PPLYDATA (DLPL::*)(int, int)” 1> GetNearblyMob=reinterpret_cast(0x4A8010);第二个是表达式是不可编辑的,当我删除 & 关键字时,它给出了无效的类型转换:“PPLYDATA (DLPL::*)(int, int)”到“int”,但它适用于非类函数指针...... int (__stdcall* GetCurrentZone)()=(int (__stdcall *)())0x49B070;
    • 附注我想点击答案是有用的按钮,但它还不能在我的帐户上工作:)
    • 第二个选项在 gcc 中对我有用。 “表达式不可编辑”?这是一个奇怪的错误。确切的措辞是什么?也许函数指针被声明为 const?
    • 哇,对不起,是的。我被尝试过 (int)(&GetNearblyMob) = 0x4A8010;我忘了 * 运算符 :D *(int*)(&GetNearblyMob) = 0x4A8010;非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2012-01-17
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多