2011-11-10 2 views
0

Имея проблему с получением функции fuzzy_compare для возврата правильного значения сравнения. Оно должно быть возвращение 0 ~ 100, но всегда возвращает 0.ssdeep's fuzzy_compare всегда возвращает 0, загруженный из ctypes python

from ctypes import * 
fuzzy = CDLL('fuzzy.dll') 
out1 = create_string_buffer('\x00'*512) 
out2 = create_string_buffer('\x00'*512) 
print fuzzy.fuzzy_hash_buf('hashme', len('hashme'), out1) 
print fuzzy.fuzzy_hash_buf('hashme2', len('hashme2'), out2) 
print out1.value 
print out2.value 
print fuzzy.fuzzy_compare(out1, out2) 
# output 
# 0 
# 0 
# 3:cA:x <-- correct hash 
# 3:cy:R <-- correct hash 
# 0  <-- fuzzy_compare returning 0... 

Я попытался назвать нечеткое сравнение с out1.value, литье в c_char_p() и create_string_buffer(), но он всегда возвращает 0. Я смотрел на нем в отладчике (установите bp на функцию fuzzy_compare и правильно передайте значения, я просто не знаю, почему он всегда возвращает 0. Я неправильно использую функцию?

ответ

0

Я скомпилировал включенный sample.c, и он что он работает с очень большим входным буфером (0x50000) и только изменяет 16 байтов, что дает близкое соответствие 99.

import ctypes 
from random import randrange, seed 

seed(42) 

SPAMSUM_LENGTH = 64 
FUZZY_MAX_RESULT = SPAMSUM_LENGTH + SPAMSUM_LENGTH // 2 + 20 
SIZE = 0x50000 

fuzzy = ctypes.CDLL('fuzzy.dll') 

fuzzy_hash_buf = fuzzy.fuzzy_hash_buf 
fuzzy_hash_buf.restype = ctypes.c_int 
fuzzy_hash_buf.argtypes = [ 
    ctypes.c_char_p, #buf 
    ctypes.c_uint32, #buf_len 
    ctypes.c_char_p, #result 
] 
fuzzy_compare = fuzzy.fuzzy_compare 
fuzzy_compare.restype = ctypes.c_int 
fuzzy_compare.argtypes = [ 
    ctypes.c_char_p, #sig1 
    ctypes.c_char_p, #sig2 
] 

out1 = ctypes.create_string_buffer('\x00' * FUZZY_MAX_RESULT) 
out2 = ctypes.create_string_buffer('\x00' * FUZZY_MAX_RESULT) 

in1 = ''.join(chr(randrange(256)) for x in xrange(SIZE)) 
in2 = ''.join(c if (i < 0x100 or i >= 0x110) else '\x25' 
       for i, c in enumerate(in1)) 

print fuzzy_hash_buf(in1, len(in1), out1) 
print fuzzy_hash_buf(in2, len(in2), out2) 
print out1.value 
print out2.value 
print fuzzy_compare(out1, out2) 

Выход:

0 
0 
6144:rR1yoHH0XI3VFNdCRXmg0BqMFKDLA6sPaVujZAQhO5HQXNHtQyr4zgytywlfj:qYFF5CRXmg9IK4ouqQAHu+y8zgS7 
6144:LR1yoHH0XI3VFNdCRXmg0BqMFKDLA6sPaVujZAQhO5HQXNHtQyr4zgytywlfj:KYFF5CRXmg9IK4ouqQAHu+y8zgS7 
99 
+0

ты мой герой. работает, как прелесть, думаю, я должен изучить, как черты ctypes работает! – omgpants

Смежные вопросы