C++/CPP 读取添加的十六进制地址

标签 c++ winapi readprocessmemory

我对 CPP 还是比较陌生,但我找不到任何有我问题的来源。我的 IDE 是 MSVC 2017 Preview,我想要的结果是将两个十六进制地址加在一起,然后读取地址的值。我不确定为什么,但它不能很好地添加十六进制数字。我会给你我现在的例子:

int number;
ReadProcessMemory(pHandle, (void*)(0x37c90000 + 0xE29FE8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x37c90000 + 0xE29FE8) << std::endl;

ReadProcessMemory(pHandle, (void*)(0x38ab9fe8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x38ab9fe8) << std::endl;

std::cout << "a = " << (0x37c90000 + 0xE29FE8) << std::endl;
std::cout << "b = " << (0x38ab9fe8) << std::endl;

我对这段代码的预测结果是,两个 ReadProcessMemory 应该获得完全相同的值,但只有第二个 ReadProcessMemory(具有已添加的十六进制值)正确返回。

此外,计算 A 和 B 报告了完全相同的地址。如果是这样,为什么 ReadProcessMemory 会发脾气并在第一个 ReadProcessMemory 上报告负数?

这是我使用上面的代码得到的结果:

-331287296 for 38ab9fe8
ec40f500 for 38ab9fe8
a = 38ab9fe8
b = 38ab9fe8

抱歉,但我真的无法弄清楚为什么它们有任何不同。

最佳答案

不,这似乎是正确的。 0xec40f500 是十进制有符号值 -331287296 的无符号十六进制表示。请了解two's complement负数的表示。

问题是,我相信,std::hex manipulator ,这是粘性。如果您在第二种情况下使用 std::dec,则两个数字都将显示为十进制:

// Second output
std::cout << std::dec << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
//           ^^^^^^^^
// Display *all* following numbers as decimal

或者在第一个输出中使用std::hex:

// First output
std::cout << std::hex << number << " for " << (0x37c90000 + 0xE29FE8) << std::endl;
//           ^^^^^^^^
// Display *all* following numbers as hexadecimal

当然,如果您希望number 是无符号的,您需要在定义变量时明确说明。也许您更容易看出 0xec40f500无符号十进制值 3963680000 之间的联系?

关于C++/CPP 读取添加的十六进制地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49684501/

相关文章:

c++ - 在 VS 2010 Build 中创建 ATL DCOM 对象失败

c# - Windows 窗体 Appbar 桌面调整大小

delphi - TriticalSection TryEnter 方法始终返回 True

winapi - 什么是事件句柄?

c++ - 为什么我不能将 LDBL_EPSILON 添加到 1

c++ - 我无法使用两个 scanf 函数来输入字母

c# - C# 程序员在 C++ 中读取 ProcessMemory,始终失败

linux - 你如何在 Unix(或至少 Linux)中安全地读取内存?

C++ ReadProcessMemory 收到 998/3E6 错误

c++ - 分小部分读取大型二进制文件