Деобфускация кода Python
作成日: 2025年1月21日
作成日: 2025年1月21日
напиши мне хороший деобфускатор что бы я мог выбрать файл в директории деобфускатора и что бы он был полон и корректен =lambda :import('marshal').loads(import('gzip').decompress(import('lzma').decompress(import('zlib').decompress(import('base64').b64decode([::-1])))));exec((''))
Написание деобфускатора для анализа кода, который обфусцирован, например, с использованием многослойного сжатия и кодирования, возможно, но важно помнить, что использование таких инструментов может нарушать законы или условия использования в зависимости от того, как и где вы их применяете. Убедитесь, что у вас есть разрешение для работы с таким кодом.
Ниже приведен пример скрипта на Python, который выполняет деобфускацию кода, обфусцированного с использованием представленной вами цепочки (zlib, lzma, gzip, base64). Этот скрипт позволяет выбрать файл для анализа.
pythonimport os import base64 import zlib import lzma import gzip from tkinter import Tk, filedialog def deobfuscate(data): try: # Обратный порядок декодирования decoded = base64.b64decode(data[::-1]) # Base64 + реверс decompressed_zlib = zlib.decompress(decoded) # Zlib decompressed_lzma = lzma.decompress(decompressed_zlib) # LZMA decompressed_gzip = gzip.decompress(decompressed_lzma) # Gzip return decompressed_gzip.decode("utf-8") # Финальная строка except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Выбор файла:
Используется модуль Tkinter для предоставления графического интерфейса выбора файла.
Деобфускация:
base64, zlib, lzma, gzip.try...except.Результат:
_deobfuscated.py.Если потребуется дополнение или пояснение, дайте знать!
ты забыл маршал
Спасибо за напоминание! Включим обработку модуля marshal в процесс деобфускации. Вот обновленный код с учетом декодирования данных из marshal:
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def deobfuscate(data): try: # Обратный порядок декодирования decoded = base64.b64decode(data[::-1]) # Base64 + реверс decompressed_zlib = zlib.decompress(decoded) # Zlib decompressed_lzma = lzma.decompress(decompressed_zlib) # LZMA decompressed_gzip = gzip.decompress(decompressed_lzma) # Gzip # Декодирование с помощью marshal unmarshaled_code = marshal.loads(decompressed_gzip) return unmarshaled_code except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Обработка marshal:
После завершения распаковки через gzip, lzma, и т.д., добавлен шаг декодирования с использованием marshal.loads.
Тип результата:
Декодированный результат через marshal обычно является исполняемым Python-кодом, который можно сохранить и исполнить.
Сохранение результата:
Декодированный код сохраняется в файл с суффиксом _deobfuscated.py.
Использование marshal.loads подразумевает, что распакованный объект является корректным Python-кодом. Будьте осторожны, чтобы не запускать код без анализа, если источник кода вам неизвестен.
Если у вас есть дополнительные пожелания или вопросы, напишите!
вылезла ошибка Ошибка при деобфускации: Invalid base64-encoded string: number of data characters (4913) cannot be 1 more than a multiple of 4
Ошибка говорит о том, что строка не является корректной Base64-строкой из-за неправильной длины — она должна быть кратна 4. Это может произойти из-за нескольких причин:
=): Base64-строка должна иметь длину кратную 4. Если она не кратна, необходимо добавить символы = в конец строки.Добавим автоматическое исправление длины строки для Base64:
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def fix_base64(data): """Добавляет недостающие символы '=' для корректной длины Base64-строки.""" missing_padding = len(data) % 4 if missing_padding: data += "=" * (4 - missing_padding) return data def deobfuscate(data): try: # Исправляем длину Base64-строки fixed_data = fix_base64(data[::-1]) # Base64 + реверс с фиксом длины decoded = base64.b64decode(fixed_data) decompressed_zlib = zlib.decompress(decoded) # Zlib decompressed_lzma = lzma.decompress(decompressed_zlib) # LZMA decompressed_gzip = gzip.decompress(decompressed_lzma) # Gzip # Декодирование с помощью marshal unmarshaled_code = marshal.loads(decompressed_gzip) return unmarshaled_code except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Функция fix_base64:
Добавляет недостающие символы = в конец строки для корректной длины Base64.
Исправление перед декодированием:
Применяется функция fix_base64 к строке перед декодированием.
Если проблема сохраняется, проверьте входные данные. Возможно, они не полностью соответствуют указанной структуре (например, отсутствует одна из стадий сжатия). Если сможете предоставить пример строки или дополнительных данных, я смогу адаптировать код.
Ошибка при деобфускации: Invalid base64-encoded string: number of data characters (4913) cannot be 1 more than a multiple of 4 ошибка осталась но я понял походу почему, наверно там больше 400 оборотов базе64 или даже других
Если в обфусцированном коде используются многократные итерации Base64 или других методов сжатия, потребуется применить декодирование рекурсивно или в цикле до тех пор, пока строка не будет полностью расшифрована. Вот как можно это реализовать:
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def fix_base64(data): """Добавляет недостающие символы '=' для корректной длины Base64-строки.""" missing_padding = len(data) % 4 if missing_padding: data += "=" * (4 - missing_padding) return data def deobfuscate(data): try: while True: # Попытка декодировать Base64 try: fixed_data = fix_base64(data[::-1]) # Base64 + реверс с фиксом длины data = base64.b64decode(fixed_data).decode("utf-8") except Exception: break # Если больше не Base64, выходим из цикла # Распаковка zlib data = zlib.decompress(data.encode()) # Распаковка lzma data = lzma.decompress(data) # Распаковка gzip data = gzip.decompress(data) # Декодирование с помощью marshal unmarshaled_code = marshal.loads(data) return unmarshaled_code except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Цикл для многократного Base64-декодирования:
while True до тех пор, пока строка можно декодировать через base64.b64decode.Обработка всех уровней сжатия:
После Base64-декодирования выполняются декомпрессии zlib, lzma, и gzip в правильном порядке.
Ошибки в процессе: Если одна из стадий декомпрессии завершится с ошибкой (например, формат данных неверен), декодирование будет прервано.
Если у вас есть пример кода или данных, дайте знать — это поможет адаптировать скрипт более точно.
ошибка Ошибка при деобфускации: Error -3 while decompressing data: incorrect header check
Ошибка Error -3 while decompressing data: incorrect header check возникает, когда декомпрессор (например, zlib, lzma или gzip) пытается обработать данные, которые не соответствуют ожидаемому формату сжатия. Это может быть вызвано следующими причинами:
gzip, lzma, zlib) могли быть применены в другом порядке.Добавим автоматическое определение форматов сжатия и обработку данных в динамическом порядке:
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def fix_base64(data): """Добавляет недостающие символы '=' для корректной длины Base64-строки.""" missing_padding = len(data) % 4 if missing_padding: data += "=" * (4 - missing_padding) return data def try_decompress(data): """Пытается распаковать данные с использованием различных алгоритмов.""" for decompress_func in [gzip.decompress, lzma.decompress, zlib.decompress]: try: return decompress_func(data) except Exception: continue raise ValueError("Не удалось определить формат сжатия") def deobfuscate(data): try: # Многократное Base64-декодирование while True: try: fixed_data = fix_base64(data[::-1]) # Base64 + реверс с фиксом длины data = base64.b64decode(fixed_data) except Exception: break # Если больше не Base64, выходим из цикла # Распаковка данных while True: try: data = try_decompress(data) except ValueError: break # Если формат сжатия больше не определён, выходим из цикла # Декодирование с помощью marshal unmarshaled_code = marshal.loads(data) return unmarshaled_code except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Функция try_decompress:
gzip, lzma, и zlib.Декодирование в цикле:
Гибкость:
Если входные данные действительно повреждены или содержат дополнительные уровни шифрования (например, XOR, RC4 и т.д.), потребуется их дополнительный анализ. Если вы можете предоставить пример обфусцированного кода (с анонимизацией), это поможет более точно настроить скрипт.
ошибка Ошибка при деобфускации: a bytes-like object is required, not 'str'
Ошибка a bytes-like object is required, not 'str' указывает, что вы пытаетесь обработать строку (str), где ожидаются байты (bytes). Это может происходить, например, при передаче текстовых данных в функцию, которая работает с байтовыми объектами (например, gzip.decompress).
Вот исправленный код, который учитывает преобразование между строками и байтами:
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def fix_base64(data): """Добавляет недостающие символы '=' для корректной длины Base64-строки.""" missing_padding = len(data) % 4 if missing_padding: data += "=" * (4 - missing_padding) return data def try_decompress(data): """Пытается распаковать данные с использованием различных алгоритмов.""" for decompress_func in [gzip.decompress, lzma.decompress, zlib.decompress]: try: return decompress_func(data) except Exception: continue raise ValueError("Не удалось определить формат сжатия") def deobfuscate(data): try: # Если данные переданы как строка, преобразуем в байты if isinstance(data, str): data = data.encode("utf-8") # Многократное Base64-декодирование while True: try: fixed_data = fix_base64(data[::-1].decode("utf-8")) # Base64 + реверс data = base64.b64decode(fixed_data) except Exception: break # Если больше не Base64, выходим из цикла # Распаковка данных while True: try: data = try_decompress(data) except ValueError: break # Если формат сжатия больше не определён, выходим из цикла # Декодирование с помощью marshal unmarshaled_code = marshal.loads(data) return unmarshaled_code except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Проверка типа входных данных:
str), они преобразуются в байты с помощью data.encode("utf-8").Преобразование после Base64:
bytes).Работа с gzip, lzma, и zlib:
Обработка ошибок:
Попробуйте этот код с вашим файлом. Если ошибка сохраняется, сообщите дополнительные детали об входных данных (например, их структуру или пример строки).
Ошибка при деобфускации: bad marshal data (unknown type code)
Ошибка bad marshal data (unknown type code) возникает, если данные, переданные в marshal.loads, не являются корректными маршализованными данными Python. Это может происходить из-за следующих причин:
Чтобы диагностировать проблему и обработать данные корректно, можно использовать следующие шаги:
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def fix_base64(data): """Добавляет недостающие символы '=' для корректной длины Base64-строки.""" missing_padding = len(data) % 4 if missing_padding: data += "=" * (4 - missing_padding) return data def try_decompress(data): """Пытается распаковать данные с использованием различных алгоритмов.""" for decompress_func in [gzip.decompress, lzma.decompress, zlib.decompress]: try: return decompress_func(data) except Exception: continue raise ValueError("Не удалось определить формат сжатия") def deobfuscate(data): try: # Если данные переданы как строка, преобразуем в байты if isinstance(data, str): data = data.encode("utf-8") # Многократное Base64-декодирование while True: try: fixed_data = fix_base64(data[::-1].decode("utf-8")) # Base64 + реверс data = base64.b64decode(fixed_data) except Exception: break # Если больше не Base64, выходим из цикла # Распаковка данных while True: try: data = try_decompress(data) except ValueError: break # Если формат сжатия больше не определён, выходим из цикла # Диагностика: Сохранение промежуточных данных with open("intermediate_data.bin", "wb") as debug_file: debug_file.write(data) # Декодирование с помощью marshal unmarshaled_code = marshal.loads(data) return unmarshaled_code except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Диагностика промежуточных данных:
intermediate_data.bin. Это позволит вручную проверить, что именно передается в marshal.loads.Проверка структуры данных:
Проверьте содержимое intermediate_data.bin:
Откройте файл с помощью текстового редактора или бинарного анализатора, чтобы понять, что это за данные. Возможно, потребуется дополнительная обработка.
Дополнительные уровни обфускации: Если данные не распознаются, попробуйте декодировать их вручную или предоставьте пример входного файла, чтобы я мог предложить конкретные шаги.
Совместимость версии Python: Если маршализованные данные были созданы в другой версии Python, это может быть причиной ошибки. Попробуйте использовать ту же версию Python, которая использовалась для обфускации.
Если у вас будут результаты или дополнительные вопросы, дайте знать!
та же самая ошибка походу там декодируется маршал по другому
Если marshal декодируется другим способом, это может указывать на измененный или кастомный процесс маршализации. Возможно, данные дополнительно зашифрованы, модифицированы, или сам marshal был заменен на нестандартный формат.
Для решения проблемы давайте добавим этап диагностики содержимого перед использованием marshal.loads, чтобы понять, с какими данными мы работаем, и предложим альтернативный метод декодирования.
Мы будем выводить тип данных и некоторые их части для диагностики. Кроме того, попробуем обработать данные с учетом возможной модификации marshal.
pythonimport os import base64 import zlib import lzma import gzip import marshal from tkinter import Tk, filedialog def fix_base64(data): """Добавляет недостающие символы '=' для корректной длины Base64-строки.""" missing_padding = len(data) % 4 if missing_padding: data += "=" * (4 - missing_padding) return data def try_decompress(data): """Пытается распаковать данные с использованием различных алгоритмов.""" for decompress_func in [gzip.decompress, lzma.decompress, zlib.decompress]: try: return decompress_func(data) except Exception: continue raise ValueError("Не удалось определить формат сжатия") def deobfuscate(data): try: # Если данные переданы как строка, преобразуем в байты if isinstance(data, str): data = data.encode("utf-8") # Многократное Base64-декодирование while True: try: fixed_data = fix_base64(data[::-1].decode("utf-8")) # Base64 + реверс data = base64.b64decode(fixed_data) except Exception: break # Если больше не Base64, выходим из цикла # Распаковка данных while True: try: data = try_decompress(data) except ValueError: break # Если формат сжатия больше не определён, выходим из цикла # Диагностика: Проверяем данные перед marshal print("Тип данных перед marshal:", type(data)) print("Размер данных:", len(data)) print("Первые 100 байт данных:", data[:100]) # Попробуем декодировать с marshal try: unmarshaled_code = marshal.loads(data) return unmarshaled_code except Exception as e: print("Ошибка при декодировании marshal:", e) print("Возможно, требуется другой метод обработки.") return None except Exception as e: print(f"Ошибка при деобфускации: {e}") return None def main(): # Выбор файла через GUI Tk().withdraw() # Скрыть главное окно Tkinter file_path = filedialog.askopenfilename(title="Выберите файл для деобфускации") if not file_path: print("Файл не выбран.") return if not os.path.exists(file_path): print("Файл не найден.") return # Чтение содержимого файла with open(file_path, "r") as f: obfuscated_code = f.read() # Деобфускация deobfuscated_code = deobfuscate(obfuscated_code) if deobfuscated_code: print("Деобфусцированный код:") print(deobfuscated_code) # Сохранение результата в новый файл output_path = os.path.splitext(file_path)[0] + "_deobfuscated.py" with open(output_path, "w") as out_file: out_file.write(deobfuscated_code) print(f"Результат сохранён в: {output_path}") else: print("Не удалось деобфусцировать код.") if __name__ == "__main__": main()
Диагностика содержимого:
marshal.loads выводятся:
Обработка ошибок marshal:
marshal.loads не работает, выводится ошибка и предлагается дальнейшая обработка.Проанализируйте вывод:
str), но не маршализованы, возможно, они содержат кастомное шифрование.bytes), но формат отличается от стандартного marshal, потребуется понять, какой метод был использован для их создания.Промежуточный результат:
intermediate_data.bin и проанализировать их с помощью сторонних инструментов, чтобы понять структуру.Предоставьте пример:
Напишите, если увидите что-то интересное в диагностике, или если потребуется помощь в адаптации обработки.
import os, re
import zlib
NOTE = "# DECODED BY HYPER X SQUAD >>> TOP 1 \n# @decoded_softs\n\n"
EXEC_PATTERN = r"exec\(_$$b'(.+?)')"
COMMENTS_PATTERN = r"#(.*?)\n"
def zlib_decode(file_name: str, new_filename: str) -> bool:
"""Decoding files that have been encoded with zlib and write the result to a new file"""
try:
with open(file_name, 'r', encoding='utf-8') as f:
code = f.read()
textpattern = r"_\s*=\s*lambda\s*__\s*:\s*__import__$'zlib'$\.decompress$__$$::-1$$$;exec$\(_$$b'(.*?)'$\)" match = re.search(pattern, code) if not match: print("Обфускация не обнаружена.") return False def decode_layer(encoded_str: str) -> str: """Decoding 1 layer and return result""" decode_script = f"_ = lambda __ : __import__('zlib').decompress(__[::-1]);\nprint((_)(b'{encoded_str}').decode())" temp = 'temp_decode.py' with open(temp, 'w', encoding='utf-8') as f: f.write(decode_script) result = os.popen(f'python3 {temp}').read() return result.strip() while re.search(EXEC_PATTERN, code): print("-1") code = re.sub(EXEC_PATTERN, lambda m: decode_layer(m.group(1)), code).replace(f"_ = lambda __ : __import__('zlib').decompress(__[::-1]);", "") while re.search(COMMENTS_PATTERN, code): code = re.sub(COMMENTS_PATTERN, "", code) with open(new_filename, 'w', encoding='utf-8') as f: f.write(NOTE + code.strip()) return True except Exception as e: print(f"Ошибка! {e}") return False finally: """Удаление промежуточного файла, если он существует""" if os.path.exists('temp_decode.py'): os.remove('temp_decode.py')
def main() -> None:
while True:
file_name = input("Введите название файла: ").strip()
textif "." in file_name and not file_name.endswith("py"): print("Файл должен иметь расширение .py ") continue file_name = f"{file_name}" if file_name.endswith(".py") else f"{file_name}.py" if not os.path.exists(file_name): print(f"Файл {file_name} не найден.\n") else: break new_filename = file_name[:-3] + '_DecodedByHXSRE.py' if zlib_decode(file_name, new_filename): print(f"Успешно декодировано! Файл - {new_filename}") else: print("Деобфускация не удалась.")
if name == "main":
main() измени данный деобфускатор под marshal, gzip, lzma, zlib, base64
Изменим ваш деобфускатор так, чтобы он поддерживал обработку данных, которые могут быть обфусцированы с использованием marshal, gzip, lzma, zlib, и base64. Прежде чем выполнять замену, добавим логику для многослойного декодирования.
pythonimport os import re import base64 import zlib import lzma import gzip import marshal NOTE = "# DECODED BY HYPER X SQUAD >>> TOP 1 \n# @decoded_softs\n\n" EXEC_PATTERN = r"exec$\(_$$b'(.+?)'$\)" COMMENTS_PATTERN = r"#(.*?)\n" def decode_layer(encoded_str: str) -> str: """Декодирование одного слоя с поддержкой base64, gzip, lzma, zlib и marshal""" try: # Попытка base64-декодирования encoded_str = base64.b64decode(encoded_str[::-1]) # Обратный порядок и Base64 # Попытка декомпрессии с gzip, lzma, zlib for decompress_func in [gzip.decompress, lzma.decompress, zlib.decompress]: try: encoded_str = decompress_func(encoded_str) except Exception: continue # Попытка декодирования marshal try: decoded_code = marshal.loads(encoded_str) return decoded_code.decode() # Возвращаем как строку except Exception: return encoded_str.decode() # Если marshal не сработал, просто возвращаем как строку except Exception as e: print(f"Ошибка при декодировании: {e}") return encoded_str def process_file(file_name: str, new_filename: str) -> bool: """Обработка файлов с поддержкой многослойной декодировки""" try: with open(file_name, 'r', encoding='utf-8') as f: code = f.read() pattern = r"_\s*=\s*lambda\s*__\s*:\s*.+?;exec$\(_$$b'(.*?)'$\)" match = re.search(pattern, code) if not match: print("Обфускация не обнаружена.") return False while re.search(EXEC_PATTERN, code): code = re.sub(EXEC_PATTERN, lambda m: decode_layer(m.group(1)), code) code = code.replace(f"_ = lambda __ : __import__('zlib').decompress(__[::-1]);", "") # Удаление комментариев while re.search(COMMENTS_PATTERN, code): code = re.sub(COMMENTS_PATTERN, "", code) # Сохранение результата with open(new_filename, 'w', encoding='utf-8') as f: f.write(NOTE + code.strip()) return True except Exception as e: print(f"Ошибка! {e}") return False def main() -> None: while True: file_name = input("Введите название файла: ").strip() if "." in file_name and not file_name.endswith(".py"): print("Файл должен иметь расширение .py ") continue file_name = f"{file_name}" if file_name.endswith(".py") else f"{file_name}.py" if not os.path.exists(file_name): print(f"Файл {file_name} не найден.\n") else: break new_filename = file_name[:-3] + '_DecodedByHXSRE.py' if process_file(file_name, new_filename): print(f"Успешно декодировано! Файл - {new_filename}") else: print("Деобфускация не удалась.") if __name__ == "__main__": main()
Поддержка нескольких алгоритмов декодирования:
base64, gzip, lzma, zlib, и marshal.Рекурсивное декодирование:
Удаление комментариев:
Обработка ошибок:
Гибкость:
.py файл._DecodedByHXSRE.py.Попробуйте с вашим файлом и сообщите, если потребуется дополнительная настройка.