簡體   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