From 16b1bddf056cea413e629eb8ad1818a0ab2bc0ea Mon Sep 17 00:00:00 2001 From: serr Date: Mon, 17 Mar 2025 19:29:25 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D0=BB=D0=BE=D0=B3=20.xlsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- comp.py | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 4 deletions(-) diff --git a/comp.py b/comp.py index 60f2d7c..f61bb1b 100644 --- a/comp.py +++ b/comp.py @@ -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))