簡體   English   中英

十六進制加法的最終結果總是錯誤的嗎? C ++

[英]Hexadecimals addition end result is always wrong? C++

當我要計算函數的地址時,請執行以下操作:

HMODULE base = GetModuleHandle(L"program.exe"); // Module base addr

// Adding an offset to the base
std::cout << (base + 0x8F0A0) << std::endl; -> Wrong!

我不知道為什么結果是錯誤的。 我已經通過在線十六進制計算對其進行了測試,並且還具有調試器來檢查這兩個值。

能否將基數考慮為十進制而其他為十六進制,從而產生錯誤的結果?

如何獲得十六進制結果?

您的問題在於值GetModuleHandle(L"program.exe")返回: 00DE0000 您需要使用C十六進制語法,因此需要在十六進制數字00DE0000之前加上“ 0x”。

因此,您的基數應轉換為數字值: 0x00DE0000

0x00DE0000 is equal to 00DE0000

嘗試使用std::string to_string(int value); 將其轉換為字符串,然后將十六進制值(基數)轉換為C十六進制語法(在十六進制值的開頭添加“ 0x”)。 最后,將您的基本值轉換回數字值(例如,使用std :: stoi ),然后使用std :: hex執行加法。


在此處嘗試此代碼。

#include <iostream>

int main () {
    int hex1 = 0x8F0A0;
    int hex2 = 0x00DE0000; // Using int values

    std::cout << std::hex << hex1 + hex2 << std::endl;
}

如所解釋這里 ,根據是否STRICT定義, HMODULE基本上是或者是void*<unique type>* ,這之中的目的是為了使每個把手鍵入一個不同的C ++類型,這意味着編譯器錯誤時混合和匹配。 在前一種情況下,指針算法將無法編譯。 在后一種情況下,它將編譯,但您不能依賴任何情況,因為指針算術考慮了類型的大小,並且如果您保留指向對象/數組的指針算術,則未定義。

您應該將此指針視為沒有特別指向的對象,因此不要進行指針算術運算。 您必須將其reinterpret_cast轉換為您確定足夠大的整數類型( std::uintptr_t ),然后對該整數值進行算術運算。

在我的本地標頭中,此唯一類型包含一個int成員,因此加1實際上會將指針向前移動4個字節(您知道,除了未定義的行為和所有操作之外)。 恰好發生0x00DE0000 + 4 * 0x8F0A0是您的0x0101C280值。

正如克里斯所說,我遇到了同樣的情況,解決了以下問題:

int offset = 0x8F0A0;
std::uintptr_t base = reinterpret_cast<uintptr_t>(GetModuleHandle(L"program.exe"));

// Here added 4 bytes to the offset.

std::cout << std::hex << (base + (offset + 4096)) << std::endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM