помогите пожалуйста реализовать xor плагин для ида который отображает в окне резульатат шифрования.
проблема заключается в том что когда окно переоткрывается резульатат пустой, и я хочу сделать как это реализованно в калькуляторе в ида чтобы окно переоткрылось с резульатом
del все сделал
может комуто пригодится
Python |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
| from PyQt5 import QtWidgets
import idaapi
class XorEncryptPlugin(idaapi.plugin_t):
flags = idaapi.PLUGIN_UNL # Плагин может быть выгружен
comment = "XOR Encryption Plugin"
help = "A plugin to XOR encrypt a string with a byte."
wanted_name = "XOR Encrypt"
wanted_hotkey = "Ctrl-Shift-X"
def init(self):
self.last_encrypted_str = "" # Храним последний зашифрованный результат
self.encrypted_hex = "" # Храним шестнадцатеричное представление результата
self.encrypted_hex_string = "" # Храним строковое представление без пробелов
return idaapi.PLUGIN_OK
def term(self):
pass
def run(self, arg):
# Класс формы для ввода данных и выполнения шифрования
class XorForm(QtWidgets.QDialog):
def __init__(self, parent=None):
super(XorForm, self).__init__(parent)
self.setWindowTitle("XOR Encryption")
# Устанавливаем минимальные размеры окна в два раза больше, чем ранее
self.setMinimumWidth(1600) # Увеличиваем ширину окна
self.setMinimumHeight(1000) # Увеличиваем высоту окна
# Создание элементов интерфейса
self.input_string_label = QtWidgets.QLabel("String to encrypt:")
self.input_string = QtWidgets.QLineEdit()
self.xor_byte_label = QtWidgets.QLabel("XOR Byte (in hex):")
self.xor_byte = QtWidgets.QLineEdit()
self.result_label = QtWidgets.QLabel("Encrypted Result:")
self.result_output = QtWidgets.QTextEdit()
self.result_output.setReadOnly(True)
self.encrypt_button = QtWidgets.QPushButton("Encrypt")
self.cancel_button = QtWidgets.QPushButton("Cancel")
# Установка раскладки
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.input_string_label)
layout.addWidget(self.input_string)
layout.addWidget(self.xor_byte_label)
layout.addWidget(self.xor_byte)
layout.addWidget(self.result_label)
layout.addWidget(self.result_output)
layout.addWidget(self.encrypt_button)
layout.addWidget(self.cancel_button)
self.setLayout(layout)
# Связывание кнопок с действиями
self.encrypt_button.clicked.connect(self.encrypt_string)
self.cancel_button.clicked.connect(self.reject)
self.parent = None # Ссылка на родительский объект
def encrypt_string(self):
# Получение данных с формы
input_str = self.input_string.text()
xor_byte_str = self.xor_byte.text()
# Проверка на пустую строку
if not input_str:
idaapi.msg("Invalid input: The string is empty.\n")
return
try:
# Проверка на корректный ввод байта
xor_byte = int(xor_byte_str, 16) & 0xFF
except ValueError:
idaapi.msg("Invalid input: XOR byte is not valid.\n")
return
# Шифрование XOR
encrypted_bytes = bytes(c ^ xor_byte for c in input_str.encode('utf-8'))
encrypted_str = encrypted_bytes.decode('latin-1') # Используем 'latin-1' для получения правильного отображения байтов
self.parent.last_encrypted_str = encrypted_str
# Формируем шестнадцатеричное представление
self.parent.encrypted_hex = ' '.join(f'{b:02X}' for b in encrypted_bytes)
# Формируем строку без пробелов
self.parent.encrypted_hex_string = ''.join(f'{b:02X}' for b in encrypted_bytes)
# Обновляем поле вывода
self.result_output.setPlainText(
f"Encrypted String: {self.parent.last_encrypted_str}\n"
f"Encrypted Hex: {self.parent.encrypted_hex}\n"
f"Encrypted Hex String: {self.parent.encrypted_hex_string}"
)
# Сообщаем о результате
idaapi.msg("Encryption completed successfully.\n")
# Проверяем наличие существующего приложения
app = QtWidgets.QApplication.instance()
if not app:
app = QtWidgets.QApplication([])
form = XorForm()
form.parent = self # Устанавливаем родительскую ссылку
# Запуск формы и выполнение шифрования
if form.exec_() == QtWidgets.QDialog.Accepted:
# Проверка на результат шифрования
if self.last_encrypted_str:
idaapi.msg("Encryption completed successfully.\n")
idaapi.msg(f"Encrypted Result: {repr(self.last_encrypted_str)}\n")
idaapi.msg(f"Encrypted Hex: {self.encrypted_hex}\n")
idaapi.msg(f"Encrypted Hex String: {self.encrypted_hex_string}\n")
else:
idaapi.msg("Encryption failed: Result is empty.\n")
else:
idaapi.msg("Encryption cancelled.\n")
def PLUGIN_ENTRY():
return XorEncryptPlugin() |
|