【问题标题】:c++ typedef with parameters and fastcallc++ typedef带参数和fastcall
【发布时间】:2013-07-08 03:22:22
【问题描述】:

所以我正在查看一些源代码,这件事让我很困惑。我是 C++ 的新手,所以我很难理解这是为了什么。我真的不知道下面的 typedef 是做什么用的,以及它在下面的代码中是如何使用的。

typedef void (__fastcall *TSecType_long___SetData_t)(DWORD dwAddress, DWORD dwEDX, DWORD dwValue);

这些是用于使用此 typedef 的方法的一些值。

const TSecType_long___SetData_t TSecType_long___SetData = reinterpret_cast<TSecType_long___SetData_t>(0x00518430); // 56 8B ? 8B ? ? ? ? ? 41 [3rd Result]

const DWORD *const pdwUserLocal = reinterpret_cast<const DWORD *const>(0x016A1234); // 8B ? ? ? ? ? 85 C9 74 ? 83 B8 ? ? ? ? 00 74 ? 8B ? ? ? ? ? 85 C0 7E ? 8B
const DWORD dwTeleportToggleOffset = 0x00008A94; // 8D ? ? ? ? ? 8B ? 8B ? E8 ? ? ? ? 85 ? 0F 85 ? ? ? ? 39 ? ? ? ? ?
const DWORD dwTeleportYOffset = 0x00008AAC; // 8D ? ? ? ? ? ? 8B ? E8 ? ? ? ? 6A ? 8B ? E8 ? ? ? ? 6A 00 68 ? ? ? ?
const DWORD dwTeleportXOffset = dwTeleportYOffset + 0x0C;

对于方法本身:

bool Teleport(_In_ int nX, _In_ int nY)
{
__try
{
    {

        DWORD dwUserLocal = *pdwUserLocal;
        TSecType_long___SetData(dwUserLocal + dwTeleportToggleOffset, NULL, 0);
        TSecType_long___SetData(dwUserLocal + dwTeleportXOffset, NULL, nX);
        TSecType_long___SetData(dwUserLocal + dwTeleportYOffset, NULL, nY);
        TSecType_long___SetData(dwUserLocal + dwTeleportToggleOffset, NULL, 1);
    }
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
    return false;
}
return true;
}

【问题讨论】:

  • 你的问题到底是什么?
  • 那是什么代码?这可能来自一些 c++ 反编译器吗? (不知道有没有,但我无法想象人类编写这样的代码)。如果是,那么它的工作就不是很好。
  • @j_kubik,这是一个游戏的 hack(或者至少看起来像一个)。不过,不太确定所有使用保留标识符的长类型/名称的目的是什么。
  • 我的问题是:你从哪里得到这个代码? PS 正如克里斯所写:你的问题到底是什么?你不能指望任何人只是告诉你一段断章取义的代码在做什么。
  • 我的问题,*TSecType_long___SetData_t typedef 究竟是如何用于传送方法的?我也不理解 decleration,因为它有参数并使用了 __fastcall。

标签: c++ dword


【解决方案1】:

假设您知道typedef 是什么(它采用数据类型并为其赋予另一个名称),这就是一个函数typedef。换句话说,TSecType_long___SetData_t 是一个接受 3 个DWORD 参数并返回一个void 的函数。

在您的情况下,有人先验地知道地址 0x00518430 包含一个可以在给定TSecType_long___SetData_t API 的情况下调用的函数。为了使该地址可调用,该地址被重新解释为函数数据类型并分配给变量TSecType_long___SetData

【讨论】:

    【解决方案2】:

    就像@chris 说的TSecType_long___SetData_t 只是一个函数指针的声明,因此有参数。以及以下行:

    const TSecType_long___SetData_t TSecType_long___SetData = einterpret_cast<TSecType_long___SetData_t>(0x00518430);
    

    定义该类型的变量并为其分配一个值,在这种情况下,这似乎是一个硬编码的内存位置(我不知道它来自哪里)。所有其他事件都只是简单的函数调用。
    对函数指针进行一点谷歌搜索应该可以为您提供有关它们的任何信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多