110 lines
4 KiB
Python
110 lines
4 KiB
Python
import tkinter as tk
|
||
from tkinter import filedialog, messagebox
|
||
import os
|
||
import subprocess
|
||
|
||
def binary_to_disasm(input_file, output_file=None):
|
||
"""Конвертирует бинарный файл в дизассемблированный код с помощью ndisasm, исключая строки с 'add [rax],al'."""
|
||
try:
|
||
# Если выходной файл не указан, создаём рядом с оригиналом
|
||
if not output_file:
|
||
base_name = os.path.splitext(input_file)[0]
|
||
output_file = f"{base_name}_disasm.txt"
|
||
|
||
# Вызываем ndisasm для дизассемблирования
|
||
result = subprocess.run(
|
||
['ndisasm', '-b64', input_file],
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
text=True
|
||
)
|
||
|
||
# Проверяем наличие ошибок от ndisasm
|
||
if result.returncode != 0:
|
||
error_msg = result.stderr.strip()
|
||
return False, f"Ошибка ndisasm: {error_msg}"
|
||
|
||
# Фильтруем строки: исключаем те, которые содержат 'add [rax],al'
|
||
# Разбиваем вывод на строки
|
||
lines = result.stdout.splitlines()
|
||
# Фильтруем, исключая строки с 'add [rax],al'
|
||
# Используем strip(), чтобы убрать лишние пробелы/переводы строк, если нужно
|
||
filtered_lines = [line for line in lines if 'add [rax],al' not in line]
|
||
|
||
# Записываем отфильтрованные строки в файл
|
||
with open(output_file, 'w', encoding='utf-8') as out_file:
|
||
for line in filtered_lines:
|
||
out_file.write(line + '\n') # Восстанавливаем перевод строки
|
||
|
||
return True, output_file
|
||
|
||
except FileNotFoundError:
|
||
return False, "ndisasm не найден. Убедитесь, что NASM установлен и доступен в PATH"
|
||
except Exception as e:
|
||
return False, str(e)
|
||
|
||
def select_and_convert():
|
||
"""Открывает диалог выбора файла и конвертирует"""
|
||
input_file = filedialog.askopenfilename(
|
||
title="Выберите бинарный файл",
|
||
filetypes=(("Бинарные файлы", "*.bin *.elf *.o"), ("Все файлы", "*.*")) # Расширим типы файлов
|
||
)
|
||
|
||
if not input_file:
|
||
return
|
||
|
||
success, result = binary_to_disasm(input_file)
|
||
|
||
if success:
|
||
messagebox.showinfo(
|
||
"Готово",
|
||
f"Файл успешно дизассемблирован!\nНули (add [rax],al) удалены.\nРезультат сохранён как:\n{result}"
|
||
)
|
||
else:
|
||
messagebox.showerror(
|
||
"Ошибка",
|
||
f"Не удалось дизассемблировать файл:\n{result}"
|
||
)
|
||
|
||
def main():
|
||
"""Создаём графический интерфейс"""
|
||
root = tk.Tk()
|
||
root.title("Дизассемблер бинарных файлов")
|
||
root.geometry("450x200")
|
||
|
||
# Центрируем окно
|
||
root.eval('tk::PlaceWindow . center')
|
||
|
||
# Создаём элементы интерфейса
|
||
label = tk.Label(
|
||
root,
|
||
text="Дизассемблер бинарных файлов (ndisasm)",
|
||
font=('Arial', 14),
|
||
pady=20
|
||
)
|
||
label.pack()
|
||
|
||
btn_convert = tk.Button(
|
||
root,
|
||
text="Выбрать файл и дизассемблировать",
|
||
command=select_and_convert,
|
||
font=('Arial', 12),
|
||
padx=20,
|
||
pady=10
|
||
)
|
||
btn_convert.pack()
|
||
|
||
btn_exit = tk.Button(
|
||
root,
|
||
text="Выход",
|
||
command=root.quit,
|
||
font=('Arial', 10),
|
||
padx=20,
|
||
pady=5
|
||
)
|
||
btn_exit.pack(pady=20)
|
||
|
||
root.mainloop()
|
||
|
||
if __name__ == "__main__":
|
||
main() |