我正在编写一个Python脚本,通过ctypes从OS X上的Security.framework调用函数。
我能够在Python中创建CFDictionaryRef和CFStringRef,并将字符串存储在字典中,但现在我正在添加Security.framework查询对象(kSecClass
,kSecMatchLimit
,{{ 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附带)。
答案 0 :(得分:1)
我正在研究案例#2,因为它似乎更简单。
您的CFDictionarySetValue缺少dict参数。修复之后,security.kSecClass
实际上正在返回函数引用,这很糟糕。我想你需要:
ctypes.c_void_p.in_dll(foundation, 'kSecClass')
这会导致将正确的值传递给函数(如lldb中所示)。
不知何故,kCFTypeDictionaryKeyCallBacks结构仍然无法使用该机制,可能是因为符号实际指向 struct ,而不是指向结构的指针。我无法找出任何方法让ctypes返回符号所代表的实际地址(这是你要传递给CFDictionaryCreateMutable的那个)而不是那个符号的值(因为那个&#39 ; s该结构的第一个成员的值)。
您可以自己构建回调,这应该更容易,因为您可以在ctypes中定义结构类型,然后只需获取所需的函数。