十六进制加法最终结果总是错误的? 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) and perform the addition using std::hex.


试试这个代码 here.

#include <iostream>

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

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

here所述,根据是否定义了STRICTHMODULE本质上是void*<unique type>*,目的使每个句柄类型成为不同的 C++ 类型,这意味着当您混合和匹配时会出现编译器错误。在前一种情况下,指针算法无法编译。在后一种情况下,它会编译,但你不能依赖任何发生的事情,因为指针算法考虑了类型的大小,并且因为如果你离开指向 object/array 指针算法是未定义的。

你应该把这个指针当作没有指向任何东西,因此不要做指针运算。您必须 reinterpret_cast 将其转换为您确定足够大的整数类型 (std::uintptr_t),然后对该整数值进行算术运算。

在我的本地header中,这个独特的类型包含一个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;