首页
社区
课程
招聘
[原创]请注意python指针的浅拷贝
2024-4-29 10:50 2239

[原创]请注意python指针的浅拷贝

2024-4-29 10:50
2239

在写代码时发现了一个现象,请先看以下代码。这段代码是py3dbg的遍历模块的原始代码。代码很好理解,就不多赘述了。

电脑屏幕的截图 描述已自动生成

在此基础上,简单修改以下代码。在append列表之前,我们把模块名称、module.modBaseAddr对象、模块基址打印出来。随后在循环遍历结束后将列表内的数据打印出来,使用aaaaa和bbbbb来区分打印结果。

屏幕的截图 描述已自动生成

这是append之前打印的结果。

电脑屏幕的照片上有文字 描述已自动生成

这是列表内的数据。

电脑屏幕的照片上有文字 描述已自动生成

我们可以发现一个问题,两次打印的模块基址是不同的。并且第二次打印出来的模块基址都是同一个值。

在探明原因之前,我们先看一下MODULEENTRY32的结构。其中要注意的是,modBaseAddr是一个指针。

文本 描述已自动生成

再次回顾一下两次的打印结果。我们可以看到在append之前和之后,module.modBaseAddr对象所保存的地址是一致的。也就是说第二次打印的基址出现变化,是因为python只进行指针的浅拷贝。

我们通过一个更直观的代码来说名。

文本 描述已自动生成

我们创建了一个整数变量 `a`,并将其引用赋值给了变量 `b`。然后,我们修改了 `b` 的值,实际上也修改了 `a` 的值。这是因为 `a` 和 `b` 引用的是同一个 `ctypes.c_int` 对象。

回到最开始那个代码中,我们append的只是module.modBaseAdd的地址,而在每次循环执行Module32Next函数时,会将指针指向的内容进行修改。所以在涉及到指针编程的时候,一定要注意浅拷贝的问题,


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 19759
活跃值: (29377)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-5-1 22:13
2
1
感谢分享
雪    币: 255
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
傾城素顔 2024-5-2 17:26
3
0
学习到了。
游客
登录 | 注册 方可回帖
返回