[英]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);
}
我想知道什么。
谢谢你。
我想知道什么。
- 这个函数会产生什么?
这是有趣的部分,从你展示的内容来看,没有人知道!
- 这个函数会产生什么数据类型?
我猜答案是“什么都没有”, 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)
只是以param1
和param2
作为参数的函数的实际调用。 请注意,在任何类方法调用中,都有一个隐式this
指针作为第一个参数传递。
从所有这些中可以公平地推断出Babu
类具有一组虚拟方法,并且在偏移量 0x38 处有一个将bool
作为其一个非隐式参数。 这之后会发生什么是任何人的猜测。 冒着被轻视的风险,如果它完好无损地返回您的机器,我会认为这有点神奇。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.