|
|
from bitstring import BitArray |
|
|
import os |
|
|
|
|
|
def compare_bits(file1, file2, max_diff_display=20): |
|
|
""" |
|
|
比较两个文件的bit级差异 |
|
|
:param file1: 第一个文件路径 |
|
|
:param file2: 第二个文件路径 |
|
|
:param max_diff_display: 最大差异位置显示数量 |
|
|
:return: 差异统计字典 |
|
|
""" |
|
|
|
|
|
bits1 = BitArray(filename=file1) |
|
|
bits2 = BitArray(filename=file2) |
|
|
|
|
|
|
|
|
len1, len2 = len(bits1), len(bits2) |
|
|
min_len = min(len1, len2) |
|
|
|
|
|
|
|
|
diff_stats = { |
|
|
'total_bits_file1': len1, |
|
|
'total_bits_file2': len2, |
|
|
'differing_bits': 0, |
|
|
'diff_positions': [], |
|
|
'bit_length_mismatch': len1 != len2 |
|
|
} |
|
|
|
|
|
|
|
|
for i in range(min_len): |
|
|
if bits1[i] != bits2[i]: |
|
|
diff_stats['differing_bits'] += 1 |
|
|
if len(diff_stats['diff_positions']) < max_diff_display: |
|
|
diff_stats['diff_positions'].append(i) |
|
|
|
|
|
|
|
|
if len1 != len2: |
|
|
diff_stats['extra_bits'] = abs(len1 - len2) |
|
|
else: |
|
|
diff_stats['extra_bits'] = 0 |
|
|
|
|
|
return diff_stats |
|
|
|
|
|
def print_diff_report(diff_stats): |
|
|
"""打印差异报告""" |
|
|
print(f"Bit长度比较:") |
|
|
print(f" File1: {diff_stats['total_bits_file1']} bits") |
|
|
print(f" File2: {diff_stats['total_bits_file2']} bits") |
|
|
|
|
|
if diff_stats['bit_length_mismatch']: |
|
|
print(f"\n! 文件长度不一致,相差 {diff_stats['extra_bits']} bits") |
|
|
|
|
|
print(f"\n差异bit总数: {diff_stats['differing_bits']}") |
|
|
|
|
|
if diff_stats['differing_bits'] > 0: |
|
|
print(f"\n前 {len(diff_stats['diff_positions'])} 个差异位置 (0-based):") |
|
|
for pos in diff_stats['diff_positions']: |
|
|
print(f" Bit位置 {pos}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
file1 = "../malwares/generated_malware" |
|
|
file2 = "../malwares/generated_malware_extracted" |
|
|
|
|
|
|
|
|
diff_stats = compare_bits(file1, file2) |
|
|
|
|
|
|
|
|
print_diff_report(diff_stats) |
|
|
|
|
|
|
|
|
print("\n高级访问:") |
|
|
print(f"总差异bit数: {diff_stats['differing_bits']}") |
|
|
if diff_stats['differing_bits'] > 0: |
|
|
print(f"第一个差异位置: {diff_stats['diff_positions'][0]}") |