Spaces:
Sleeping
Sleeping
from hexdump2 import hexdump | |
import gradio as gr | |
import shlex | |
import subprocess | |
import tempfile | |
description = """This is a space testing a method for evaluating the quality of decompilation. | |
Currently unhandled features: | |
* Global references | |
* Function calls | |
""" | |
def compile(compiler, flags, source): | |
# Create a temporary file for the C source code | |
with tempfile.NamedTemporaryFile(suffix=".c", delete=False) as temp_c_file: | |
temp_c_file.write(source.encode()) | |
temp_c_file_name = temp_c_file.name | |
# Create a temporary file for the object file | |
with tempfile.NamedTemporaryFile(suffix=".o", delete=False) as temp_o_file: | |
temp_o_file_name = temp_o_file.name | |
# Compile the C file to an object file | |
subprocess.run( | |
[compiler, "-c", temp_c_file_name] | |
+ shlex.split(flags) | |
+ ["-o", temp_o_file_name], | |
check=True, | |
) | |
# Create a temporary file for the raw bytes | |
with tempfile.NamedTemporaryFile(suffix=".raw", delete=True) as raw_bytes_file: | |
subprocess.run( | |
[ | |
"objcopy", | |
"--only-section", | |
".text", | |
"-O", | |
"binary", | |
temp_o_file_name, | |
raw_bytes_file.name, | |
] | |
) | |
compiled_bytes = raw_bytes_file.read() | |
print(compiled_bytes) | |
return compiled_bytes | |
def predict(target, source, compiler, flags): | |
target = bytes.fromhex(target) | |
bytes = compile(compiler, flags, source) | |
return hexdump(bytes, result="return"), hexdump(target, result="return"), 1.0 | |
def run(): | |
demo = gr.Interface( | |
fn=predict, | |
description=description, | |
inputs=[ | |
gr.Textbox(lines=10, label="Bytes of Target Function (in hex)", value="61 62 63"), | |
gr.Textbox(lines=10, label="Decompiled C Source Code", value="int foo() { return 42; }"), | |
gr.Textbox(label="Compiler", value="gcc"), | |
gr.Textbox(label="Compiler Flags", value="-O2"), | |
], | |
outputs=[ | |
gr.Textbox(label="Compiled bytes"), | |
gr.Textbox(label="Target bytes"), | |
gr.Number(label="Accuracy (TBD)"), | |
], | |
) | |
demo.launch(server_name="0.0.0.0", server_port=7860) | |
run() | |