【问题标题】:can we concate (byte *) to (int) in c++?我们可以在 C++ 中将 (byte *) 连接到 (int) 吗?
【发布时间】:2021-11-24 13:19:13
【问题描述】:

我在 ghidra 中反编译了一个 .so 文件,发现了一行代码:

puVar24 = (ulong *)(pbVar12 + 0x10);

pbVar12 类型:字节 *

0x10 类型:int

那么如果我们可以在 python 中将 byte* 与 int 连接起来呢?

【问题讨论】:

  • “连接”是什么意思;你的意思是添加? (数字也不能在 Python 中“连接”;Python 也没有 byte* 类型..)
  • 我的意思是代码中的 '+' (puVar24 = (ulong *)(pbVar12 + 0x10);)
  • 地址算术。它说“从 pbVar12 获取地址 16 个字节并将其存储在 puVar24 中”。由于 Python 没有指针,因此无法将其转换为 Python 代码。
  • @TimRoberts 哦,谢谢!所以我们不能在 python 中实现这个?
  • 您无法执行该指令。一般来说,将 C 转换为 Python 是很棘手的,因为 C 应用程序倾向于使用原始内存和操作指针,而这在 Python 中是不存在的。您需要弄清楚代码的作用,而不是查看每个语句。

标签: python c++ reverse-engineering ghidra


【解决方案1】:

这并不是一个真正的 C++ 问题,而是一个非常实际的 C 特性:指针运算。 pbVar12 不是 bytechar 或任何东西。 * 非常表明它是指向byte指针。有时,指针真的令人困惑:

  1. pbVar12是内存中的地址:如果你把内存想象成一条长街,那么内存中的每个单元格对应一个房子,每个房子都有门牌号。而pbVar12 存储了这个号码。
  2. 指针允许在 C 中出现一些意想不到的情况:您可以向它们添加数字。因此,如果pbVar120x1337 并且您添加0x10,则结果将是0x1347。在比喻中:你从门牌号0x1337 开始,进步0x10 房子“在街上”,最后是房子0x1347
  3. 我没有在前一点说谎,但我遗漏了一个仅在更一般情况下才重要的细节:当您将数字x 添加到指针p 时,结果不仅仅是p加上xp 加上x 乘以引用的数据类型的大小。而这里引用的数据类型是byte,大小为1,所以这个细节无所谓。如果pbVar12 不是指向byte 的指针,而是指向float,则结果将是0x1377,因为float 的大小为4 (0x1337 + 0x10 * 4 = 0x1377)。我想现在稍微扩展一下比喻,但你可以想象在这种一般情况下,指针指向的不是单栋房屋的街道,而是建筑群的街道,每个建筑群都很大,它有多个门牌号(4在这种情况下)。而“进步一所”实际上意味着跳过 4 个门牌号。

现在我们已经了解了底层细节,我将在逆向上下文中提供更多上下文和解释:C 在处理数组时在内部使用这些类型的指针算术。符号a[i] 实际上只是*(a + i) 的语法糖(读作“将i 添加到指针a 并取消引用结果)。

因此,如果我不得不猜测,我会假设 pbVar12 实际上是 unsinged long 的数组,而 + 0x10 实际上意味着在位置 4 (0x10 = 16 = 4 * 4) 处对其进行索引。或者用简短的 C-snipped 来表达:

unsigned long *puVar24;
unsigned long pbVar12[123];
puVar24 = &pbVar12[4];

您还提到了 Python,因此我将对此多说几句:我假设您正在尝试用 Python 重新实现您在 Ghidra 中看到的一些代码,可能是因为您想模拟某些行为。现在的困惑是,您实际上并没有直接使用数据和数字,而是使用对内存地址的引用。所以你实际上需要了解,稍后如何使用puVar24,并且需要读取位于pbVar12 + 4(或pbVar12 + 16,如果pbVar12真的是byte数组)的相应4字节内存与float 数组相对)。

【讨论】:

  • 这肯定是一个结构。所以这一切unsigned long *puVar24; 是完全错误的
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2022-06-15
  • 2020-08-18
  • 2013-08-16
相关资源
最近更新 更多