Carmen Del Vecchio

62 papers B 3C 8Journal 26Unranked 25
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans Autom. Sci. Eng.
Hozefa Jesawada, Amol Yerudkar, Yang Liu, Navdeep M. Singh, Carmen Del Vecchio
2026 J jnl
Sci. China Inf. Sci.
Yingying Chai, Chunfeng Jiang, Jinwu Gao, Yuhu Wu, Carmen Del Vecchio
2026 J jnl
Sci. China Inf. Sci.
Shihua Fu, Jianjun Wang, Zhiru Wang, Carmen Del Vecchio, Jianli Zhao
2025 J jnl
CoRR
Hozefa Jesawada, Antonio Acernese, Giovanni Russo, Carmen Del Vecchio
2025 J jnl
IEEE Control. Syst. Lett.
Hozefa Jesawada, Antonio Acernese, Davide Del Vecchio, Giovanni Russo, Carmen Del Vecchio
2025 J jnl
Inf. Sci.
Chunfeng Jiang, Biao Wang, Carmen Del Vecchio, Jun-e Feng
2025 J jnl
Autom.
Émiland Garrabé, Hozefa Jesawada, Carmen Del Vecchio, Giovanni Russo
2025 C conf
ACC
Chunfeng Jiang, Shihua Fu, Yuhu Wu, Carmen Del Vecchio
2025 C conf
CoDIT
Chunfeng Jiang, Carmen Del Vecchio, Biao Wang
2024 J jnl
IEEE Trans. Autom. Control.
Sonam Kharade, Sarang Sutavani, Amol Yerudkar, Sushama Wagh, Yang Liu, Carmen Del Vecchio, Navdeep M. Singh
2024 J jnl
IEEE Trans. Autom. Control.
Yang Liu, Zejiao Liu, Amol Yerudkar, Carmen Del Vecchio
2023 J jnl
CoRR
Émiland Garrabé, Hozefa Jesawada, Carmen Del Vecchio, Giovanni Russo
2023 C conf
CoDIT
Esha Ranade, Fabio Fruggiero, Carmen Del Vecchio
2023 J jnl
CoRR
Émiland Garrabé, Hozefa Jesawada, Carmen Del Vecchio, Giovanni Russo
2023 conf
CDC
Émiland Garrabé, Hozefa Jesawada, Carmen Del Vecchio, Giovanni Russo
2023 J jnl
Inf. Sci.
Amol Yerudkar, Evangelos Chatzaroulas, Carmen Del Vecchio, Sotiris Moschoyiannis
2023 conf
MED
Kisan Sarda, Amol Yerudkar, Carmen Del Vecchio
2022 J jnl
CoRR
Hozefa Jesawada, Amol Yerudkar, Carmen Del Vecchio, Navdeep M. Singh
2022 conf
CDC
Hozefa Jesawada, Amol Yerudkar, Carmen Del Vecchio, Navdeep M. Singh
2022 C conf
ACC
Antonio Acernese, Amol Yerudkar, Carmen Del Vecchio
2022 J jnl
Eng. Appl. Artif. Intell.
Mirko Mazzoleni, Kisan Sarda, Antonio Acernese, Luigi Russo, Leonardo Manfredi, Luigi Glielmo, Carmen Del Vecchio
2022 J jnl
J. Frankl. Inst.
Pratik Bajaria, Amol Yerudkar, Luigi Glielmo, Carmen Del Vecchio, Yuhu Wu
2021 J jnl
IEEE Access
Kisan Sarda, Antonio Acernese, Vittorio Nolè, Leonardo Manfredi, Luca Greco, Luigi Glielmo, Carmen Del Vecchio
2021 conf
ECC
Pratik Bajaria, Amol Yerudkar, Carmen Del Vecchio
2021 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Shuting Le, Yuhu Wu, Yuqian Guo, Carmen Del Vecchio
2021 C conf
IECON
Kisan Sarda, Amol Yerudkar, Carmen Del Vecchio
2021 J jnl
IEEE Control. Syst. Lett.
Antonio Acernese, Amol Yerudkar, Luigi Glielmo, Carmen Del Vecchio
2021 C conf
ACC
Antonio Acernese, Amol Yerudkar, Luigi Glielmo, Carmen Del Vecchio
2021 B conf
SMC
Pratik Bajaria, Amol Yerudkar, Carmen Del Vecchio
2021 J jnl
IEEE Control. Syst. Lett.
Antonio Acernese, Amol Yerudkar, Luigi Glielmo, Carmen Del Vecchio
2021 conf
MED
Antonio Acernese, Kisan Sarda, Vittorio Nolè, Leonardo Manfredi, Luca Greco, Luigi Glielmo, Carmen Del Vecchio
2020 J jnl
IEEE Access
Antonio Acernese, Amol Yerudkar, Luigi Glielmo, Carmen Del Vecchio
2020 J jnl
Autom.
Amol Yerudkar, Carmen Del Vecchio, Luigi Glielmo
2020 J jnl
IEEE Control. Syst. Lett.
Amol Yerudkar, Carmen Del Vecchio, Luigi Glielmo
2019 conf
ECC
Antonio Acernese, Carmen Del Vecchio, Luigi Glielmo, Gianfranco Fenu, Felice Andrea Pellegrino
2019 conf
ICSRS
Antonio Acernese, Carmen Del Vecchio, Massimo Tipaldi, Luigi Glielmo
2019 conf
ECC
Amol Yerudkar, Carmen Del Vecchio, Luigi Glielmo
2019 B conf
SMC
Amol Yerudkar, Carmen Del Vecchio, Luigi Glielmo
2019 B conf
SMC
Amit Joshi, Amol Yerudkar, Carmen Del Vecchio, Luigi Glielmo
2019 conf
MED
Kisan Sarda, Amol Yerudkar, Carmen Del Vecchio, Luigi Glielmo, Navdeep M. Singh
2018 conf
ECC
Amol Yerudkar, Carmen Del Vecchio, Navdeep M. Singh, Luigi Glielmo
2018 J jnl
Int. J. Gen. Syst.
Carmen Del Vecchio, Francesca Verrilli, Luigi Glielmo
2017 J jnl
IEEE Trans Autom. Sci. Eng.
Francesca Verrilli, Seshadhri Srinivasan, Giovanni Gambino, Michele Canelli, Mikko Himanka, Carmen Del Vecchio, Maurizio Sasso, Luigi Glielmo
2016 C conf
ACC
Giovanni Gambino, Francesca Verrilli, Michele Canelli, Andrea Russo, Mikko Himanka, Maurizio Sasso, Seshadhri Srinivasan, Carmen Del Vecchio, Luigi Glielmo
2016 conf
ECC
Giovanni Gambino, Francesca Verrilli, Carmen Del Vecchio, Luigi Glielmo
2015 conf
MED
Francesca Verrilli, Carmen Del Vecchio, Luigi Glielmo, Martin Corless
2015 conf
ICIIS
Seshadhri Srinivasan, Daniel Grobmann, Carmen Del Vecchio, Valentina Emilia Balas, Luigi Glielmo
2015 conf
CDC
Francesca Verrilli, Hamed Kebriaei, Luigi Glielmo, Martin Corless, Carmen Del Vecchio
2015 conf
EMBC
Francesca Verrilli, Hamed Kebriaei, Luigi Glielmo, Martin Corless, Carmen Del Vecchio
2015 conf
ECC
Carmen Del Vecchio, Francesca Verrilli, Luigi Glielmo, Martin Corless
2014 conf
MED
Carmen Del Vecchio, Luigi Glielmo, Martin Corless
2012 conf
CDC
Carmen Del Vecchio, Luigi Glielmo, Martin Corless
2011 conf
CDC/ECC
Alessandra Parisio, Carmen Del Vecchio, G. Velotto
2009 J jnl
Autom.
Francesco Borrelli, Carmen Del Vecchio, Alessandra Parisio
2008 conf
CDC
Francesco Borrelli, Carmen Del Vecchio, Alessandra Parisio
2007 conf
CDC
Osvaldo Barbarisi, Carmen Del Vecchio, Alessandra Parisio
2006 J jnl
IEEE Trans. Autom. Control.
Carmen Del Vecchio, Ioannis Ch. Paschalidis
2006 C conf
ACC
Francesco Borrelli, Paolo Falcone, Carmen Del Vecchio
2005 conf
ISIC
Osvaldo Barbarisi, Carmen Del Vecchio
2004 conf
SMC (5)
Osvaldo Barbarisi, Carmen Del Vecchio, Luigi Glielmo, Francesco Vasca
2003 conf
ECC
Domenico Luca Capozzi, Carmen Del Vecchio, Luigi Glielmo
2003 conf
CDC
Carmen Del Vecchio, Ioannis Ch. Paschalidis
redb/extractors/decompiler/_archive/GhidraDecompilerScript-v2.java
← Index redb/extractors/decompiler/_archive/GhidraDecompilerScript-v2.java java
import ghidra.app.script.GhidraScript;
import ghidra.program.model.listing.*;
import ghidra.app.decompiler.*;
import ghidra.program.model.block.*;
import ghidra.program.model.symbol.*;
import ghidra.program.model.pcode.*;
import ghidra.program.model.address.*;
import org.json.JSONObject;
import org.json.JSONArray;
import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;

public class GhidraDecompilerScript extends GhidraScript {
    private DecompInterface decompInterface;
    private BasicBlockModel basicBlockModel;

    @Override
    public void run() throws Exception {
        System.err.println("{\"debug\": \"Script starting\"}");

        // Get binary hash and filepath from arguments
        String[] args = getScriptArgs();
        if (args.length < 2) {
            System.err.println("{\"error\": \"Both SHA256 and filepath arguments are required\"}");
            return;
        }
        String sha256 = args[0];
        String filepath = args[1];

        // Add debug output after setup
        System.err.println("{\"debug\": \"Processing file: " + args[1] + "\"}");

        // Initialize analysis components
        setupDecompiler();
        basicBlockModel = new BasicBlockModel(currentProgram);

        // Create the main JSON object for output
        JSONObject output = new JSONObject();
        output.put("sha256", sha256);
        output.put("decompiled", new JSONArray());
        output.put("disassembled", new JSONArray());
        output.put("cfg", new JSONArray());

        // Process all functions
        FunctionIterator functions = currentProgram.getFunctionManager().getFunctions(true);
        for (Function function : functions) {
            processFunction(function, output);
        }

        System.err.println("{\"debug\": \"Preparing final output\"}");
        // Output the final JSON to stdout
        System.out.println(output.toString());
    }

    private void setupDecompiler() {
        decompInterface = new DecompInterface();
        DecompileOptions options = new DecompileOptions();
        decompInterface.setOptions(options);
        decompInterface.openProgram(currentProgram);
    }

    private void processFunction(Function function, JSONObject output) {
        try {
            Address entry = function.getEntryPoint();
            String functionName = function.getName();
            String functionAddress = entry.toString();

            // Process each analysis type independently
            boolean hasAnyResults = false;

            try {
                if (processDecompiledCode(function, output.getJSONArray("decompiled"),
                                        functionName, functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"Decompilation failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            try {
                if (processDisassembledCode(function, output.getJSONArray("disassembled"),
                                        functionName, functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"Disassembly failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            try {
                if (processCFG(function, output.getJSONArray("cfg"), functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"CFG extraction failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            if (!hasAnyResults) {
                System.err.println(String.format(
                    "{\"warning\": \"No results obtained for function %s\"}",
                    functionName));
            }

        } catch (Exception e) {
            System.err.println(String.format(
                "{\"error\": \"Failed to process function: %s\"}",
                e.getMessage().replace("\"", "'")));
        }
    }

    private boolean processDecompiledCode(Function function, JSONArray decompArray,
                                        String functionName, String functionAddress) {
        try {
            DecompileResults results = decompInterface.decompileFunction(function, 30, monitor);
            if (results == null || !results.decompileCompleted()) {
                System.err.println(String.format(
                    "{\"warning\": \"Decompilation incomplete for function %s\"}",
                    functionName));
                return false;
            }

            String decompiledCode = results.getDecompiledFunction().getC();
            if (decompiledCode == null || decompiledCode.trim().isEmpty()) {
                System.err.println(String.format(
                    "{\"warning\": \"Empty decompilation result for function %s\"}",
                    functionName));
                return false;
            }

            String contentHash = calculateHash(decompiledCode);

            JSONObject functionObj = new JSONObject();
            functionObj.put("decompiled_content_hash", contentHash);
            functionObj.put("decompiled_function_name", functionName);
            functionObj.put("decompiled_function_address", functionAddress);
            functionObj.put("decompiled_function", decompiledCode);

            decompArray.put(functionObj);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("Decompilation error: " + e.getMessage(), e);
        }
    }

    private boolean processDisassembledCode(Function function, JSONArray disasmArray,
                                        String functionName, String functionAddress) {
        try {
            StringBuilder disassembly = new StringBuilder();
            StringBuilder normalized = new StringBuilder();
            int instructionCount = 0;
            boolean hasValidInstructions = false;

            Listing listing = currentProgram.getListing();
            AddressSetView functionBody = function.getBody();
            InstructionIterator instructions = listing.getInstructions(functionBody, true);

            while (instructions.hasNext()) {
                try {
                    Instruction instr = instructions.next();
                    if (instr != null) {
                        String disasmLine = instr.toString();
                        if (disasmLine != null && !disasmLine.trim().isEmpty()) {
                            disassembly.append(disasmLine).append("\n");
                            normalized.append(normalizeInstruction(disasmLine)).append("\n");
                            instructionCount++;
                            hasValidInstructions = true;
                        }
                    }
                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid instruction in %s: %s\"}",
                        functionName, e.getMessage().replace("\"", "'")));
                }
            }

            if (!hasValidInstructions) {
                System.err.println(String.format(
                    "{\"warning\": \"No valid instructions found in function %s\"}",
                    functionName));
                return false;
            }

            String disassembledCode = disassembly.toString();
            String contentHash = calculateHash(disassembledCode);

            JSONObject functionObj = new JSONObject();
            functionObj.put("disassembled_content_hash", contentHash);
            functionObj.put("disassembled_function_name", functionName);
            functionObj.put("disassembled_function_address", functionAddress);
            functionObj.put("disassembled_function", disassembledCode);
            functionObj.put("normalized_disassembly", normalized.toString());
            functionObj.put("instruction_count", instructionCount);

            // Initialize similarity fields as null
            functionObj.put("minhash_signature", JSONObject.NULL);
            functionObj.put("opcode_frequency_vector", JSONObject.NULL);
            functionObj.put("api_calls_vector", JSONObject.NULL);
            functionObj.put("instruction_embedding", JSONObject.NULL);

            disasmArray.put(functionObj);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("Disassembly error: " + e.getMessage(), e);
        }
    }

    private boolean processCFG(Function function, JSONArray cfgArray, String functionAddress) {
        try {
            CodeBlockIterator blocks = basicBlockModel.getCodeBlocksContaining(
                function.getBody(), monitor);

            boolean hasValidBlocks = false;

            while (blocks.hasNext()) {
                try {
                    CodeBlock block = blocks.next();
                    String blockInstructions = getBlockInstructions(block);

                    if (blockInstructions == null || blockInstructions.trim().isEmpty()) {
                        continue;
                    }

                    String blockId = calculateHash(blockInstructions);

                    JSONObject blockObj = new JSONObject();
                    blockObj.put("block_id", blockId);
                    blockObj.put("function_address", functionAddress);
                    blockObj.put("block_instructions", blockInstructions);

                    // Process successors with error handling
                    JSONArray successorAddresses = new JSONArray();
                    try {
                        CodeBlockReferenceIterator successors = block.getDestinations(monitor);
                        while (successors.hasNext()) {
                            try {
                                CodeBlockReference ref = successors.next();
                                if (ref != null && ref.getDestinationAddress() != null) {
                                    successorAddresses.put(ref.getDestinationAddress().toString());
                                }
                            } catch (Exception e) {
                                System.err.println(String.format(
                                    "{\"warning\": \"Skipped invalid successor in block %s: %s\"}",
                                    blockId, e.getMessage().replace("\"", "'")));
                            }
                        }
                    } catch (Exception e) {
                        System.err.println(String.format(
                            "{\"warning\": \"Error processing successors for block %s: %s\"}",
                            blockId, e.getMessage().replace("\"", "'")));
                    }

                    blockObj.put("successor_blocks", successorAddresses);
                    cfgArray.put(blockObj);
                    hasValidBlocks = true;

                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid block in function %s: %s\"}",
                        functionAddress, e.getMessage().replace("\"", "'")));
                }
            }

            return hasValidBlocks;

        } catch (Exception e) {
            throw new RuntimeException("CFG extraction error: " + e.getMessage(), e);
        }
    }

    private String getBlockInstructions(CodeBlock block) {
        StringBuilder instructions = new StringBuilder();
        try {
            AddressIterator addresses = block.getAddresses(true);
            while (addresses.hasNext()) {
                try {
                    Address addr = addresses.next();
                    if (addr != null) {
                        Instruction instr = currentProgram.getListing().getInstructionAt(addr);
                        if (instr != null) {
                            instructions.append(instr.toString()).append("\n");
                        }
                    }
                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid instruction at address %s: %s\"}",
                        addresses.next(), e.getMessage().replace("\"", "'")));
                }
            }
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"warning\": \"Error getting block instructions: %s\"}",
                e.getMessage().replace("\"", "'")));
        }
        return instructions.toString();
    }

    private String normalizeInstruction(String instruction) {
        try {
            if (instruction == null || instruction.trim().isEmpty()) {
                return "";
            }
            return instruction.replaceAll("0x[0-9a-fA-F]+", "IMM")
                            .replaceAll("\\b\\d+\\b", "NUM")
                            .replaceAll("[\\[\\]\\+\\-\\*/%&|^]+", "_OP_");
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"warning\": \"Error normalizing instruction: %s\"}",
                e.getMessage().replace("\"", "'")));
            return instruction;
        }
    }

    private String calculateHash(String content) {
        try {
            if (content == null || content.trim().isEmpty()) {
                return "";
            }
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(content.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                hexString.append(String.format("%02x", b));
            }
            return hexString.toString();
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"error\": \"Error calculating hash: %s\"}",
                e.getMessage().replace("\"", "'")));
            return "";
        }
    }
}