2024-05-12 20:50:48 发布
网友
我在ghidra中反编译了一个.so文件,发现了一行代码:
puVar24 = (ulong *)(pbVar12 + 0x10);
pbVar12类型:字节*
0x10类型:int
那么,如果我们可以用int表示byte*,那么在python中是如何实现的呢
byte
char
*
pbVar12
0x1337
0x10
0x1347
x
p
1
float
0x1377
4
0x1337 + 0x10 * 4 = 0x1377
现在我们已经了解了底层细节,我将在反向上下文中给出更多的上下文和解释:C在处理数组时在内部使用这些类型的指针算法。符号a[i]实际上只是*(a + i)的语法糖(读作“将i添加到指针a并取消引用结果)
a[i]
*(a + i)
i
a
因此,如果我不得不猜测,我会假设pbVar12实际上是一个unsinged long数组,+ 0x10实际上意味着在位置4(0x10 = 16 = 4 * 4)对它进行索引。或者用一个简短的C-sniped来表达:
unsinged long
+ 0x10
0x10 = 16 = 4 * 4
unsigned long *puVar24; unsigned long pbVar12[123]; puVar24 = &pbVar12[4];
您还提到了Python,所以我想再多说几句:我假设您正在尝试在Python中重新实现Ghidra中看到的一些代码,可能是因为您想模拟一些行为。现在的困惑是,您实际上并没有直接处理数据和数字,而是使用内存地址的引用。因此您实际上需要d为了理解puVar24以后是如何使用的,并且需要读取位于pbVar12 + 4(或者pbVar12 + 16,如果pbVar12实际上是byte数组而不是float数组)的相应4字节内存
puVar24
pbVar12 + 4
pbVar12 + 16
byte
或char
或*
以外的任何东西,它是指向byte
的指针。有时,指针确实会让人困惑,但在这种情况下,它实际上相当简单:pbVar12
是内存中的一个地址:如果你把内存想象成一条长长的街道,那么内存中的每个单元都对应一所房子,每个房子都有门牌号。并且pbVar12
存储这个数字李>pbVar12
是,比如说0x1337
,然后添加0x10
,结果将是0x1347
。在这个比喻中:你从门牌号0x1337
开始,然后是“沿街”的0x10
家,最后是0x1347
家李>x
添加到一个指针p
,结果不仅仅是p
加上p
加上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-sniped来表达:您还提到了Python,所以我想再多说几句:我假设您正在尝试在Python中重新实现Ghidra中看到的一些代码,可能是因为您想模拟一些行为。现在的困惑是,您实际上并没有直接处理数据和数字,而是使用内存地址的引用。因此您实际上需要d为了理解
puVar24
以后是如何使用的,并且需要读取位于pbVar12 + 4
(或者pbVar12 + 16
,如果pbVar12
实际上是byte
数组而不是float
数组)的相应4字节内存相关问题 更多 >
编程相关推荐