使用Python的安全框架类型

2024-06-09 13:43:50 发布

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

我正在编写一个Python脚本,它调用安全框架通过ctypes。在

我能够在Python中生成CFDictionaryRef和CFStringRef,并将字符串存储在字典中,但是现在我要添加安全框架查询对象(kSecClasskSecMatchLimitkSecReturnAttributeskSecReturnAttributes,…)我得到以下崩溃:

objc[28201]: Method cache corrupted. This may be a message to an invalid object, or a memory error somewhere else.
objc[28201]: receiver 0x7fff724fcdf8, SEL 0x7fff8d814fe5, isa 0x7fff724f5f90, cache 0x7fff724f5fa0, buckets 0x7fff8842ffe3, mask 0x5, occupied 0x0, wrap bucket 0x7fff8842ffe3
objc[28201]: receiver 0 bytes, buckets 0 bytes
objc[28201]: selector 'hash'
objc[28201]: isa '(null)'
objc[28201]: Method cache corrupted.
zsh: illegal hardware instruction  python kc.py

我尝试过用包含对象的ctypes数组调用CFDictionaryCreate(),同时还调用了CFMutableDictionaryCreate(),然后又调用了CFDictionarySetValue。见下文。在

^{pr2}$

我很乐意使用PyObjC而不是ctypes,如果这是一个更简单的解决方案;但是,我不太熟悉它,而且还不能导入安全框架. 在

OS X 10.9.2、Python 2.7.5(随OS X一起提供)。在


Tags: 对象脚本框架cachebytesosctypesmethod
1条回答
网友
1楼 · 发布于 2024-06-09 13:43:50

我正在调查案例2,因为它看起来更简单。在

CFDictionarySetValue缺少dict参数。修复后,security.kSecClass实际上返回了一个函数引用,这很糟糕。我认为你需要:

ctypes.c_void_p.in_dll(foundation, 'kSecClass')

从而将正确的值传递给函数(如lldb中所示)。在

不知何故,kCFTypeDictionaryKeyCallBacks结构仍然无法使用该机制,可能是因为符号实际上指向结构,而不是指向struct的指针。我无法找到任何方法让ctypes返回符号所表示的实际地址(这是您希望传递给CFDictionaryCreateMutable的地址)而不是该符号处的值(0,因为这是该结构的第一个成员的值)。在

您可以自己构造回调,这应该更容易,因为您可以在ctypes中定义结构类型,然后只获取所需的函数。在

相关问题 更多 >