формируется лог .xlsx

main
serr 2025-03-17 19:29:25 +03:00
parent c530f629e7
commit 16b1bddf05
1 changed files with 111 additions and 4 deletions

115
comp.py
View File

@ -1,7 +1,14 @@
import subprocess
import os, time
# Для работы с IDA
from exetoi64 import make_i64
#
# Для работы с excel
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
#
def main():
@ -13,24 +20,124 @@ def main():
# Создание .i64 из .exe файлов
exe_list = find_exe_in_dir(exe_dir)
for path in exe_list:
make_i64(ida_path, path, path+'.i64')
for exe_path in exe_list:
make_i64(ida_path, exe_path, exe_path + '.i64')
#
# Создание файлов экспорта, сравнение
# Создание файлов экспорта, получение файлов сравнений
start = time.perf_counter()
create_exports(bindiff_path, exe_dir, exe_dir)
compare_exports(bindiff_path, exe_dir)
#
# Получение имени файла с результатом сравнения
exe_1_name = os.path.basename(exe_list[0])
exe_2_name = os.path.basename(exe_list[1])
result_file_name = fr'{exe_dir}\{exe_1_name}_vs_{exe_2_name}.results'
#
# Формирую список с инфой о сравнении функций
compare_functions_info = parse_bindiff_log(result_file_name)
#
# Подсчет времени
elapsed = time.perf_counter() - start
print(f"Elapsed: {elapsed}")
#
# Выгрузка
output_path = "output.xlsx"
create_excel_from_bindiff_log(compare_functions_info,
output_path,
exe_1_name,
exe_2_name,
elapsed)
#
def create_excel_from_bindiff_log(compare_functions_info,
output_file,
exe_1_name,
exe_2_name,
elapsed):
wb = Workbook()
ws = wb.active
ws.title = "BinDiff Results"
# Заголовки столбцов
headers = [
f'Address in {exe_1_name}',
f'Address in {exe_2_name}',
'Match Type',
'Similarity',
'Confidence',
'Basic Block Similarity',
'Flags',
'Additional Flags',
'Matching Algorithm',
f'{exe_1_name}',
f'{exe_2_name}',
f'Matches: {len(compare_functions_info)}',
f'Elapsed: {elapsed:.2f} sec',
' '
]
ws.append(headers)
bold_font = Font(bold=True) # Стиль с жирным шрифтом
for cell in ws[1]: # ws[1] обращается к первой строке (заголовкам)
cell.font = bold_font # Применяет стиль к каждой ячейке
# Окраска ячеек с общей информацией
green_fill = PatternFill(start_color="90EE00", end_color="90EE00", fill_type="solid")
light_green_fill = PatternFill(start_color="90EE90", end_color="90EE90", fill_type="solid")
ws['L1'].fill = green_fill
ws['M1'].fill = light_green_fill
# Добавляю данные
for result in compare_functions_info:
row = [
result['addr1'],
result['addr2'],
result['match_type'],
result['similarity'],
result['confidence'],
result['bb_similarity'],
result['flags'],
result['additional_flags'],
result['matching_algorithm'],
result['name1'],
result['name2'],
' '
]
ws.append(row)
wb.save(output_file)
def parse_bindiff_log(log_file):
results = []
with open(log_file, 'r') as f:
for line in f:
fields = line.strip().split('\t')
# в логе который создает bindiff по каждой функции 11 полей
if len(fields) == 11:
result = {
'addr1': fields[0], # адрес функции в первом бинаре
'addr2': fields[1], # адрес во втором
'match_type': fields[2], # тип совпадения
'similarity': fields[3], # сходство
'confidence': fields[4], # уверенность (на сколько bindiff уверен в правильности сопоставления)
'bb_similarity': fields[5], # сходство базовых блоков (показывает, насколько похожи базовые блоки внутри функции)
'flags': fields[6], # дополнительная информация
'additional_flags': fields[7], # дополнительная информация
'matching_algorithm': fields[8].replace("function: ", ""), # описание метода, который был использован для сопоставления функций
'name1': fields[9].strip('"'), # имя функции в первом бинаре
'name2': fields[10].strip('"') # имя во втором бинаре
}
results.append(result)
return results
def find_exe_in_dir(directory):
exe_files = []
for root, dirs, files in os.walk(directory):
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".exe"):
exe_files.append(os.path.join(root, file))