繁体   English   中英

如何阅读这个 C++ 函数

[英]How to read this C++ function

也许这里有人可以帮助我更多地了解 C++

在阅读有关虚幻引擎 4 的信息时,我遇到了这个函数,它被用作以下内容

class ClassSample1
{
public:
    Babu* pBabu; //0x022C
};

void SetFuncton(Babu* param1, bool param2)
{
    (*(int(__fastcall**)(Babu*, bool))(*(DWORD64*)param1 + 0x38))(param1, param2);
}

我想知道什么。

  1. 这个函数会产生什么?
  2. 这个函数会产生什么数据类型?

谢谢你。

我想知道什么。

  1. 这个函数会产生什么?

这是有趣的部分,从你展示的内容来看,没有人知道!

  1. 这个函数会产生什么数据类型?

我猜答案是“什么都没有”, SetFunction()返回 void,但这似乎是在调用某种类参数设置器,所以它可能会产生副作用。

让我们分解一下:

(int(__fastcall**)(Babu*, bool))

这声明了一个指向函数指针的指针,其中函数返回int并具有两个参数,一个是指向Babu的指针类型,另一个是bool类型。 此函数还应使用__fastcall调用约定。

*(DWORD64*)param1 + 0x38

这是一个复合语句,它将param1转换为指向DWORD64的指针,然后读取该地址处的DWORD64值并将 0x38 添加到它。 请注意,在 MSVC ABI 中,vtable 指针是类的第一个元素,因此如果param1是指向Babu实例的指针,则此语句正在读取Babu的 vtable 指针,并向其添加 0x38。

把这些放在一起:

*(int(__fastcall**)(Babu*, bool))(*(DWORD64*)param1 + 0x38)

这表示:获取存储在内存地址param1 (可能是 vtable 指针)的任何内容,向其中添加 0x38,将其转换为指向函数指针的指针,读取此结果地址以生成指向函数的指针上述类型。 正如评论中提到的@HolyBlackCat,这很可能是对Babu类的虚拟方法查找。

最后一点: (param1, param2)只是以param1param2作为参数的函数的实际调用。 请注意,在任何类方法调用中,都有一个隐式this指针作为第一个参数传递。

从所有这些中可以公平地推断出Babu类具有一组虚拟方法,并且在偏移量 0x38 处有一个将bool作为其一个非隐式参数。 这之后会发生什么是任何人的猜测。 冒着被轻视的风险,如果它完好无损地返回您的机器,我会认为这有点神奇。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM