|
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): |
|
|
|
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 |
|
|
|
|
|
with tempfile.NamedTemporaryFile(suffix=".o", delete=False) as temp_o_file: |
|
temp_o_file_name = temp_o_file.name |
|
|
|
|
|
subprocess.run( |
|
[compiler, "-c", temp_c_file_name] |
|
+ shlex.split(flags) |
|
+ ["-o", temp_o_file_name], |
|
check=True, |
|
) |
|
|
|
|
|
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() |
|
|