45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
from typing import List, Tuple
|
|
import io
|
|
import os
|
|
import subprocess
|
|
from contextlib import redirect_stdout, redirect_stderr
|
|
|
|
|
|
def run_pycdc(exe_path: str, pyc_file: str) -> str:
|
|
"""
|
|
Executes pycdc.exe with the given .pyc file using a command line string and captures the output.
|
|
|
|
Args:
|
|
exe_path (str): Path to the pycdc.exe executable.
|
|
pyc_file (str): Path to the .pyc file to decompile.
|
|
|
|
Returns:
|
|
str: Output from pycdc.exe.
|
|
"""
|
|
if not os.path.isfile(exe_path):
|
|
return "invalid"
|
|
|
|
command = f'"{exe_path}" "{pyc_file}"'
|
|
result = subprocess.run(
|
|
command, capture_output=True, text=True, shell=True, encoding="utf-8"
|
|
)
|
|
|
|
return result.stdout
|
|
|
|
|
|
def disassemble_pyc(file_path: str, pycdc_addr=None) -> str:
|
|
"""
|
|
Disassembles a .pyc file using uncompyle6.
|
|
|
|
Args:
|
|
file_path (str): The path to the .pyc file.
|
|
|
|
Returns:
|
|
str: The disassembled code as a string.
|
|
"""
|
|
output = io.StringIO()
|
|
if pycdc_addr is None:
|
|
return "none"
|
|
else:
|
|
return run_pycdc(pycdc_addr, file_path)
|