Add files via upload
This commit is contained in:
parent
6977ae91ee
commit
a8d5df031a
1999
квс/asm21_.py
Normal file
1999
квс/asm21_.py
Normal file
File diff suppressed because it is too large
Load diff
2011
квс/asm22.py
Normal file
2011
квс/asm22.py
Normal file
File diff suppressed because it is too large
Load diff
2010
квс/asm23.py
Normal file
2010
квс/asm23.py
Normal file
File diff suppressed because it is too large
Load diff
110
квс/disassembler_skip_zero.py
Normal file
110
квс/disassembler_skip_zero.py
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
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()
|
||||||
19
квс/test1.asm
Normal file
19
квс/test1.asm
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
; Простые случаи с разными базовыми регистрами
|
||||||
|
push qword [rax]
|
||||||
|
pop qword [rax]
|
||||||
|
|
||||||
|
push qword [rbx]
|
||||||
|
pop qword [rbx]
|
||||||
|
|
||||||
|
push qword [rsp]
|
||||||
|
pop qword [rsp]
|
||||||
|
|
||||||
|
push qword [rbp]
|
||||||
|
pop qword [rbp]
|
||||||
|
|
||||||
|
;mov rax, 60
|
||||||
|
;mov rdi, 0
|
||||||
|
;syscall
|
||||||
9
квс/test2.asm
Normal file
9
квс/test2.asm
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
push qword [r8]
|
||||||
|
pop qword [r8]
|
||||||
|
push qword [r9]
|
||||||
|
pop qword [r9]
|
||||||
|
push qword [r10]
|
||||||
|
pop qword [r10]
|
||||||
7
квс/test3.asm
Normal file
7
квс/test3.asm
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
push qword [r12]
|
||||||
|
pop qword [r12]
|
||||||
|
push qword [r13]
|
||||||
|
pop qword [r13]
|
||||||
18
квс/привет.квс
Normal file
18
квс/привет.квс
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
.текст
|
||||||
|
.глобал _start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
; Системный вызов write(1, msg, len)
|
||||||
|
переместить_имм раикс, 1 ; номер syscall write = 1
|
||||||
|
переместить_имм рдиай, 1 ; stdout = 1
|
||||||
|
переместить_имм рсиай, msg ; указатель на строку
|
||||||
|
переместить_имм рдикс, 21 ; длина строки
|
||||||
|
вызов_системы
|
||||||
|
|
||||||
|
; Системный вызов exit(0)
|
||||||
|
переместить_имм раикс, 60 ; номер syscall exit = 60
|
||||||
|
переместить_имм рдиай, 0 ; код возврата
|
||||||
|
вызов_системы
|
||||||
|
|
||||||
|
.данные
|
||||||
|
msg: .строка "Привет мир!\n"
|
||||||
153
квс/тест.квс
Normal file
153
квс/тест.квс
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
.текст
|
||||||
|
.глобал _start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
; ========== БАЗОВЫЕ ИНСТРУКЦИИ ==========
|
||||||
|
переместить раикс, рбикс
|
||||||
|
переместить рсипи, рдиай
|
||||||
|
переместить р8, р9
|
||||||
|
|
||||||
|
переместить_имм раикс, 0x12345678
|
||||||
|
переместить_имм еаикс, 0x1234
|
||||||
|
переместить_имм аикс, 0x12
|
||||||
|
переместить_имм ал, 0x42
|
||||||
|
|
||||||
|
прибавить раикс, рбикс
|
||||||
|
вычесть рсипи, рдиай
|
||||||
|
|
||||||
|
вызвать some_function
|
||||||
|
вернуться
|
||||||
|
|
||||||
|
вызов_системы
|
||||||
|
|
||||||
|
; ========== СРАВНЕНИЯ И ПЕРЕХОДЫ ==========
|
||||||
|
сравнить раикс, рбикс
|
||||||
|
сравнить32 еаикс, ебикс
|
||||||
|
сравнить_байт ал, бл
|
||||||
|
|
||||||
|
переход loop
|
||||||
|
переход_если_равно loop
|
||||||
|
переход_если_неравно loop
|
||||||
|
переход_если_ноль loop
|
||||||
|
переход_если_не_ноль loop
|
||||||
|
переход_если_перенос loop
|
||||||
|
переход_если_нет_переноса loop
|
||||||
|
переход_если_меньше loop
|
||||||
|
переход_если_больше loop
|
||||||
|
переход_если_меньше_или_равно loop
|
||||||
|
переход_если_больше_или_равно loop
|
||||||
|
;короткий_переход loop
|
||||||
|
|
||||||
|
; ========== АРИФМЕТИКА ==========
|
||||||
|
прибавить_непосредственно раикс, 100
|
||||||
|
вычесть_непосредственно рбикс, 50
|
||||||
|
|
||||||
|
увеличить раикс
|
||||||
|
уменьшить рбикс
|
||||||
|
увеличить ал
|
||||||
|
уменьшить бл
|
||||||
|
|
||||||
|
умножить раикс
|
||||||
|
умножить_знаковое рбикс
|
||||||
|
разделить рсикс
|
||||||
|
разделить_знаковое рдикс
|
||||||
|
|
||||||
|
отрицать раикс
|
||||||
|
инвертировать рбикс
|
||||||
|
|
||||||
|
; ========== ЛОГИЧЕСКИЕ ОПЕРАЦИИ ==========
|
||||||
|
и раикс, рбикс
|
||||||
|
или рсипи, рдиай
|
||||||
|
исключающее_или р8, р9
|
||||||
|
|
||||||
|
проверить раикс, рбикс
|
||||||
|
очистить раикс
|
||||||
|
|
||||||
|
; ========== СДВИГИ И ВРАЩЕНИЯ ==========
|
||||||
|
;сдвиг_влево раикс, 4
|
||||||
|
;сдвиг_вправо рбикс, 2
|
||||||
|
;сдвиг_арифметический_влево рсикс, 1
|
||||||
|
;сдвиг_арифметический_вправо рдикс, 3
|
||||||
|
;вращать_влево р8, 5
|
||||||
|
;вращать_вправо р9, 6
|
||||||
|
|
||||||
|
; ========== СТЕК И ПАМЯТЬ ==========
|
||||||
|
втолкнуть раикс
|
||||||
|
втолкнуть рбикс
|
||||||
|
втолкнуть_из_памяти [рсипи]
|
||||||
|
|
||||||
|
вытолкнуть рдиай
|
||||||
|
вытолкнуть_в_память [рбипи]
|
||||||
|
|
||||||
|
загрузить раикс, [рсипи]
|
||||||
|
сохранить [рдиай], рбикс
|
||||||
|
|
||||||
|
загрузить_адрес раикс, some_data
|
||||||
|
|
||||||
|
; ========== 8-БИТНЫЕ ОПЕРАЦИИ ==========
|
||||||
|
переместить_имм ал, 0xAA
|
||||||
|
прибавить_байт ал, бл
|
||||||
|
вычесть_байт бл, кл
|
||||||
|
сравнить_байт дл, бл
|
||||||
|
сохранить_байт [раикс], ал
|
||||||
|
сохранить_в_адрес [рбикс], ал
|
||||||
|
|
||||||
|
; ========== РАСШИРЕНИЕ РЕГИСТРОВ ==========
|
||||||
|
переместить_с_нулями раикс, ал
|
||||||
|
переместить_со_знаком рбикс, бл
|
||||||
|
|
||||||
|
; ========== ОБМЕН ==========
|
||||||
|
обменять раикс, рбикс
|
||||||
|
;обменять_с_памятью [рсипи], рдиай
|
||||||
|
|
||||||
|
; ========== ФЛАГИ ==========
|
||||||
|
установить_перенос
|
||||||
|
сбросить_перенос
|
||||||
|
установить_направление
|
||||||
|
сбросить_направление
|
||||||
|
втолкнуть_флаги
|
||||||
|
вытолкнуть_флаги
|
||||||
|
|
||||||
|
; ========== СТРОКОВЫЕ ОПЕРАЦИИ ==========
|
||||||
|
переместить_байт
|
||||||
|
переместить_слово
|
||||||
|
сравнить_байты
|
||||||
|
сканировать_байт
|
||||||
|
|
||||||
|
; ========== СПЕЦИАЛЬНЫЕ КОМАНДЫ ==========
|
||||||
|
идентифицировать_процессор
|
||||||
|
прочитать_счетчик
|
||||||
|
получить_управление
|
||||||
|
отладка
|
||||||
|
прервать 0x80
|
||||||
|
|
||||||
|
; ========== ВВОД-ВЫВОД ==========
|
||||||
|
ввод_байта 0x60
|
||||||
|
вывод_байта 0x61
|
||||||
|
|
||||||
|
; ========== ЦИКЛЫ ==========
|
||||||
|
цикл loop
|
||||||
|
|
||||||
|
; ========== .БАЙТ ДИРЕКТИВА ==========
|
||||||
|
.байт 0x90 0x90 0x90 ; NOP-ы для выравнивания
|
||||||
|
|
||||||
|
loop:
|
||||||
|
; Метка для переходов
|
||||||
|
нет_операции
|
||||||
|
остановить
|
||||||
|
|
||||||
|
some_function:
|
||||||
|
вернуться
|
||||||
|
|
||||||
|
.данные
|
||||||
|
some_data: .строка "Test data"
|
||||||
|
;constant_value: .константа 0xDEADBEEF
|
||||||
|
|
||||||
|
; ========== РАЗНЫЕ ТИПЫ ДАННЫХ ==========
|
||||||
|
byte_array: .байт 0x01 0x02 0x03 0x04
|
||||||
|
string_data: .строка_нуль "Null terminated"
|
||||||
|
wide_string: .строка "Wide string test"
|
||||||
|
|
||||||
|
; Глобальная константа
|
||||||
|
;.глобал global_var
|
||||||
|
;global_var: .константа 42
|
||||||
19
квс/тест1.квс
Normal file
19
квс/тест1.квс
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
.текст
|
||||||
|
_старт:
|
||||||
|
; Простые случаи с разными базовыми регистрами
|
||||||
|
втолкнуть_из_памяти [раикс]
|
||||||
|
вытолкнуть_в_память [раикс]
|
||||||
|
|
||||||
|
втолкнуть_из_памяти [рбикс]
|
||||||
|
вытолкнуть_в_память [рбикс]
|
||||||
|
|
||||||
|
втолкнуть_из_памяти [рсипи]
|
||||||
|
вытолкнуть_в_память [рсипи]
|
||||||
|
|
||||||
|
втолкнуть_из_памяти [рбипи]
|
||||||
|
вытолкнуть_в_память [рбипи]
|
||||||
|
|
||||||
|
; Завершение программы
|
||||||
|
;переместить раикс, 60
|
||||||
|
;переместить рсикс, 0
|
||||||
|
;вызов_системы
|
||||||
11
квс/тест2.квс
Normal file
11
квс/тест2.квс
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
.текст
|
||||||
|
_старт:
|
||||||
|
; Расширенные регистры R8-R15
|
||||||
|
втолкнуть_из_памяти [р8]
|
||||||
|
вытолкнуть_в_память [р8]
|
||||||
|
|
||||||
|
втолкнуть_из_памяти [р9]
|
||||||
|
вытолкнуть_в_память [р9]
|
||||||
|
|
||||||
|
втолкнуть_из_памяти [р10]
|
||||||
|
вытолкнуть_в_память [р10]
|
||||||
8
квс/тест3.квс
Normal file
8
квс/тест3.квс
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
.текст
|
||||||
|
_старт:
|
||||||
|
; R12 и R13 требуют особой обработки как RSP/RBP
|
||||||
|
втолкнуть_из_памяти [р12]
|
||||||
|
вытолкнуть_в_память [р12]
|
||||||
|
|
||||||
|
втолкнуть_из_памяти [р13]
|
||||||
|
вытолкнуть_в_память [р13]
|
||||||
Loading…
Reference in a new issue