我在 ghidra 中反编译了一个 .so 文件,发现了一行代码:
puVar24 = (ulong *)(pbVar12 + 0x10);
pbVar12 类型:字节 *
0x10 类型:整数
那么如果我们可以在 python 中将 byte* 与 int 连接起来呢?
我在 ghidra 中反编译了一个 .so 文件,发现了一行代码:
puVar24 = (ulong *)(pbVar12 + 0x10);
pbVar12 类型:字节 *
0x10 类型:整数
那么如果我们可以在 python 中将 byte* 与 int 连接起来呢?
这不是一个真正的 C++ 问题,而是一个非常实际的 C 特性:指针运算。pbVar12
不是一个byte
或char
或任何东西。非常多*
表示它是一个指向. byte
有时,指针确实令人困惑:
pbVar12
是内存中的地址:如果你把内存想象成一条长长的街道,那么内存中的每个单元格对应一个房子,每个房子都有门牌号。并pbVar12
存储此号码。pbVar12
是,比如说0x1337
,你加0x10
,结果将是0x1347
。在隐喻中:您从门牌号开始,而“沿街”的0x1337
进度房屋则以 house 结尾。0x10
0x1347
x
到指针p
时,结果不仅是p
加号,x
而且是乘以所引用数据类型的大小. 而这里引用的数据类型是,大小为,所以这个细节无关紧要。如果不是指向而是指向的指针,例如,结果将是因为大小为(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-snipped 来表达这一点:
unsigned long *puVar24;
unsigned long pbVar12[123];
puVar24 = &pbVar12[4];
您还提到了 Python,因此我将对此多说几句:我假设您正在尝试用 Python 重新实现您在 Ghidra 中看到的一些代码,可能是因为您想模拟某些行为。现在的困惑是,您实际上并没有直接使用数据和数字,而是使用对内存地址的引用。所以你实际上需要了解,puVar24
稍后如何使用并且需要读取位于pbVar12 + 4
(或者pbVar12 + 16
如果pbVar12
真的是一个byte
数组而不是float
数组)的相应4字节内存。