【问题标题】:C++/CPP Reading an added hex addressC++/CPP 读取添加的十六进制地址
【发布时间】:2018-04-06 02:49:52
【问题描述】:

我对 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

抱歉,但我真的不明白为什么它们有任何不同。

【问题讨论】:

  • 如果将十六进制转换为有符号整数,它们是相同的。虽然,我无法弄清楚差异的原因
  • 这就像在电话簿中查找 Alice 和 Bob,然后将他们的电话号码加在一起。你可以做到,但似乎不值得付出努力。
  • 最终目标是添加一个带偏移量的(基)地址以获得多级指针。除了添加地址和读取数据之外,有没有更好的解决方案?

标签: c++ winapi readprocessmemory


【解决方案1】:

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

我相信问题在于std::hexmanipulator,它是粘性。如果您在第二种情况下使用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 设为无符号,则需要在定义变量时明确说明。也许您更容易看到 0xec40f500unsigned 十进制值 3963680000 之间的联系?

【讨论】:

  • 太棒了,我不敢相信它飞过我的头顶。谢谢你的澄清。老实说,即使我知道这很简单,我也不敢相信它飞过我的头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2021-05-09
  • 2016-11-04
  • 2012-04-04
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多