[英]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.