我们能在C++中(字节)到(int)吗?

2024-05-12 20:50:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

pbVar12类型:字节*

0x10类型:int

那么,如果我们可以用int表示byte*,那么在python中是如何实现的呢


Tags: 文件代码类型字节sobyteint反编译
1条回答
网友
1楼 · 发布于 2024-05-12 20:50:48
<>这不是一个C++问题,而是一个非常实际的C特征:指针算术。{}不是bytechar*以外的任何东西,它是指向byte指针。有时,指针确实会让人困惑,但在这种情况下,它实际上相当简单:

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

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

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

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

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

相关问题 更多 >