ejschwartz's picture
update
5e217e1
raw
history blame
2.28 kB
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()