import osimport subprocessfrom tqdm import tqdm,trange OPT = ["O0", "O1", "O2", "O3"]timeout_duration = 10 ghidra_path = "./ghidra_11.0.3_PUBLIC/support/analyzeHeadless"#path to the headless analyzer, change the path accordinglypostscript = "./decompile.py"#path to the decompiler helper function, change the path accordinglyproject_path = "."#path to temp folder for analysis, change the path accordinglyproject_name = "tmp_ghidra_proj"func_path = "../samples/sample.c"#path to c code for compiling and decompiling, change the path accordinglyfileName = "sample" with tempfile.TemporaryDirectory() as temp_dir: pid = os.getpid() asm_all = {} for opt in [OPT[0]]: executable_path = os.path.join(temp_dir, f"{pid}_{opt}.o") cmd = f'gcc -{opt} -o {executable_path} {func_path} -lm' subprocess.run( cmd.split(' '), check=True, stdout=subprocess.DEVNULL, # Suppress stdout stderr=subprocess.DEVNULL, # Suppress stderr timeout=timeout_duration, ) output_path = os.path.join(temp_dir, f"{pid}_{opt}.c") command = [ ghidra_path, temp_dir, project_name, "-import", executable_path, "-postScript", postscript, output_path, "-deleteProject", # WARNING: This will delete the project after analysis ] result = subprocess.run(command, text=True, capture_output=True, check=True) with open(output_path,'r') as f: c_decompile = f.read() c_func = [] flag = 0 for line in c_decompile.split('\n'): if "Function: func0" in line:#**Replace** func0 with the function name you want to decompile. flag = 1 c_func.append(line) continue if flag: if '// Function:' in line: if len(c_func) > 1: break c_func.append(line) if flag == 0: raise ValueError('bad case no function found') for idx_tmp in range(1,len(c_func)):##########remove the comments if 'func0' in c_func[idx_tmp]: break c_func = c_func[idx_tmp:] input_asm = '\n'.join(c_func).strip() before = f"# This is the assembly code:\n"#prompt after = "\n# What is the source code?\n"#prompt input_asm_prompt = before+input_asm.strip()+after with open(fileName +'_' + opt +'.pseudo','w',encoding='utf-8') as f: f.write(input_asm_prompt)