我正在尝试从内存中删除密码字符串,就像这里建议的那样。
我写了那个小片段:
import ctypes, sys
def zerome(string):
location = id(string) + 20
size = sys.getsizeof(string) - 20
#memset = ctypes.cdll.msvcrt.memset
# For Linux, use the following. Change the 6 to whatever it is on your computer.
print ctypes.string_at(location, size)
memset = ctypes.CDLL("libc.so.6").memset
memset(location, 0, size)
print "Clearing 0x%08x size %i bytes" % (location, size)
print ctypes.string_at(location, size)
a = "asdasd"
zerome(a)
奇怪的是,这段代码在 IPython 上运行良好,
[7] oz123@yenitiny:~ $ ipython a.py
Clearing 0x02275b84 size 23 bytes
但与 Python 崩溃:
[8] oz123@yenitiny:~ $ python a.py
Segmentation fault
[9] oz123@yenitiny:~ $
任何想法为什么?
我使用 Python 2.7.3 在 Debian Wheezy 上进行了测试。
小更新...
该代码适用于 CentOS 6.2 和 Python 2.6.6。代码在使用 Python 2.6.8 的 Debian 上崩溃。我试着思考为什么它可以在 CentOS 上运行,而不是在 Debian 上运行。唯一不同的原因是我的 Debian 是多架构的,而 CentOS 运行在我的带有 i686 CPU 的旧笔记本电脑上。
因此,我重新启动了我的 CentOS 笔记本电脑并在其上加载了 Debian Wheezy。该代码适用于非多架构的 Debian Wheezy。因此,我怀疑我在 Debian 上的配置有些问题......