0

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

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

pbVar12 类型:字节 *

0x10 类型:整数

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

4

1 回答 1

1

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

  1. pbVar12是内存中的地址:如果你把内存想象成一条长长的街道,那么内存中的每个单元格对应一个房子,每个房子都有门牌号。并pbVar12存储此号码。
  2. 指针在 C 中允许一些意想不到的东西:您可以向它们添加数字。所以如果pbVar12是,比如说0x1337,你加0x10,结果将是0x1347。在隐喻中:您从门牌号开始,而“沿街”的0x1337进度房屋则以 house 结尾。0x100x1347
  3. 我没有说谎,但我遗漏了一个仅在更一般情况下才重要的细节:当您将数字添加x到指针p时,结果不仅是p加号,x而且是乘以所引用数据类型的大小. 而这里引用的数据类型是,大小为,所以这个细节无关紧要。如果不是指向而是指向的指针,例如,结果将是因为大小为(pxbyte1pbVar12bytefloat0x1377float40x1337 + 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数组而不是float数组)的相应4字节内存。

于 2021-10-20T19:42:14.680 回答