使用Python中的Security.framework类型

时间:2014-05-13 21:38:29

标签: python macos cocoa ctypes

我正在编写一个Python脚本,通过ctypes从OS X上的Security.framework调用函数。

我能够在Python中创建CFDictionaryRef和CFStringRef,并将字符串存储在字典中,但现在我正在添加Security.framework查询对象(kSecClasskSecMatchLimit,{{ 1}},...)我得到了以下崩溃:

kSecReturnAttributes

我尝试使用包含对象的ctypes数组调用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 ,然后调用CFDictionaryCreate()然后调用CFMutableDictionaryCreate()。见下文。

CFDictionarySetValue

如果这是一个更简单的解决方案,我很乐意使用PyObjC而不是ctypes;但是,我不熟悉它,并且无法导入Security.framework。

OS X 10.9.2,Python 2.7.5(OS X附带)。

1 个答案:

答案 0 :(得分:1)

我正在研究案例#2,因为它似乎更简单。

您的CFDictionarySetValue缺少dict参数。修复之后,security.kSecClass实际上正在返回函数引用,这很糟糕。我想你需要:

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

这会导致将正确的值传递给函数(如lldb中所示)。

不知何故,kCFTypeDictionaryKeyCallBacks结构仍然无法使用该机制,可能是因为符号实际指向 struct ,而不是指向结构的指针。我无法找出任何方法让ctypes返回符号所代表的实际地址(这是你要传递给CFDictionaryCreateMutable的那个)而不是那个符号的值(因为那个&#39 ; s该结构的第一个成员的值)。

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