十六进制加法最终结果总是错误的? 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所述,根据是否定义了STRICT
,HMODULE
本质上是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;
当我想计算一个函数的地址时,我会执行以下操作:
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所述,根据是否定义了STRICT
,HMODULE
本质上是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;