Manuel A. Serrano

71 papers A 1B 1C 6Misc 2Journal 27Unranked 22
YearRankTypeTitle / Venue / Authors
2025 C conf
BDCAT
Joaquín Sierra-Granados, José L. Ruiz-Catalán, David Garcia Rosado, Manuel A. Serrano
2025 C conf
BDCAT
Carlos Mario Braga Ortuño, Manuel A. Serrano, Eduardo Fernández-Medina
2025 conf
IDEAL (2)
Carlos Mario Braga, Manuel A. Serrano, Eduardo Fernández-Medina
2025 J jnl
Comput. Stand. Interfaces
Luis Enrique Sánchez, Antonio Santos-Olmo, David Garcia Rosado, Carlos Blanco, Manuel A. Serrano, Haralambos Mouratidis, Eduardo Fernández-Medina
2025 conf
IQSOFT
Macario Polo Usaola, Manuel A. Serrano, Ignacio García Rodríguez de Guzmán
2025 J jnl
Sci. Comput. Program.
Fabiano Pecorelli, Vita Santa Barletta, Manuel A. Serrano
2025 J jnl
Expert Syst. Appl.
Carlos Mario Braga, Manuel A. Serrano, Eduardo Fernández-Medina
2025 J jnl
Internet Things
Carlos Mario Braga, Ángel Suarez-Bárcena, Manuel A. Serrano, Eduardo Fernández-Medina
2024 J jnl
J. Syst. Softw.
Elena Desdentado Fernández, Coral Calero, María Ángeles Moraga, Manuel A. Serrano, Félix García
2024 J jnl
Softw. Qual. J.
Manuel A. Serrano, Luis Enrique Sánchez, Antonio Santos-Olmo, David Garcia Rosado, Carlos Blanco, Vita Santa Barletta, Danilo Caivano, Eduardo Fernández-Medina
2024 J jnl
Frontiers Comput. Sci.
Antonio Santos-Olmo, Luis Enrique Sánchez, David Garcia Rosado, Manuel A. Serrano, Carlos Blanco, Haralambos Mouratidis, Eduardo Fernández-Medina
2023 J jnl
J. Inf. Sci. Eng.
Maria I. Ortega, Julio Moreno, Manuel A. Serrano, Eduardo Fernández-Medina
2023 ed.
QP4SE@SIGSOFT FSE
Vita Santa Barletta, Fabiano Pecorelli, Manuel A. Serrano
2023 J jnl
ACM Comput. Surv.
Manuel A. Serrano, José A. Cruz-Lemus, Ricardo Pérez-Castillo, Mario Piattini
2023 conf
IS-EUD Workshops
Manuel A. Serrano, Luis Enrique Sánchez Crespo, Antonio Santos-Olmo, David Garcia Rosado, Carlos Blanco, Eduardo Fernández-Medina
2023 J jnl
J. King Saud Univ. Comput. Inf. Sci.
David Eneko Ruiz de Gauna, Luis Enrique Sánchez, Almudena Ruiz-Iniesta, Claudia Villalonga, Manuel A. Serrano
2022 conf
QP4SE@ESEC/SIGSOFT FSE
Antonio García de la Barrera Amo, Manuel A. Serrano, Ignacio García Rodríguez de Guzmán, Macario Polo, Mario Piattini
2022 J jnl
Comput. Ind.
David Garcia Rosado, Antonio Santos-Olmo, Luis Enrique Sánchez, Manuel A. Serrano, Carlos Blanco, Haralambos Mouratidis, Eduardo Fernández-Medina
2022 ed.
QP4SE@ESEC/SIGSOFT FSE
Fabiano Pecorelli, Vita Santa Barletta, Manuel A. Serrano
2022 ch.
Quantum Software Engineering
Miguel Ángel Blanco, Manuel A. Serrano
2022 book
Manuel A. Serrano, Ricardo Pérez-Castillo, Mario Piattini
2022 ch.
Quantum Software Engineering
José A. Cruz-Lemus, Manuel A. Serrano
2021 J jnl
Comput. Secur.
David Garcia Rosado, Julio Moreno, Luis Enrique Sánchez, Antonio Santos-Olmo, Manuel A. Serrano, Eduardo Fernández-Medina
2021 J jnl
J. Univers. Comput. Sci.
Julio Moreno, David Garcia Rosado, Luis Enrique Sánchez, Manuel A. Serrano, Eduardo Fernández-Medina
2021 ed.
Q-SET@QCE
Ricardo Pérez-Castillo, Manuel A. Serrano, Mario Piattini
2021 J jnl
Adv. Eng. Softw.
Ricardo Pérez-Castillo, Manuel A. Serrano, Mario Piattini
2021 J jnl
IT Prof.
Mario Piattini, Manuel A. Serrano, Ricardo Pérez-Castillo, Guido Peterssen, Jose Luis Hevia
2020 J jnl
Softw. Pract. Exp.
Julio Moreno, Javier Gómez, Manuel A. Serrano, Eduardo B. Fernández, Eduardo Fernández-Medina
2020 ed.
QANSWER
Mario Piattini, Guido Peterssen, Ricardo Pérez-Castillo, Jose Luis Hevia, Manuel A. Serrano
2020 conf
SIIE
Ramón Hervás, Iván González-Díaz, Jesús Fontecha, Ana I. Molina, Manuel A. Serrano, Carmen Lacave, Tania Mondéjar
2020 conf
QANSWER
Mario Piattini, Guido Peterssen, Ricardo Pérez-Castillo, Jose Luis Hevia, Manuel A. Serrano, Guillermo Hernández, Ignacio García Rodríguez de Guzmán, Claudio Andrés Paradela, Macario Polo, Ezequiel Murina, Luis Jiménez, Juan Carlos Marqueño, Ramsés Gallego, Jordi Tura, Frank Phillipson, Juan Manuel Murillo, Alfonso Niño, Moisés Rodríguez
2019 Misc conf
EuroPLoP
Julio Moreno, Eduardo B. Fernández, Eduardo Fernández-Medina, Manuel A. Serrano
2019 J jnl
IEEE Access
Julio Moreno, Eduardo B. Fernández, Manuel A. Serrano, Eduardo Fernández-Medina
2018 Misc conf
EuroPLoP
Julio Moreno, Eduardo B. Fernández, Eduardo Fernández-Medina, Manuel A. Serrano
2018 conf
CIbSE
Julio Moreno, Manuel A. Serrano, Eduardo Fernández-Medina
2018 ch.
Encyclopedia of Database Systems (2nd ed.)
Rafael Romero, Jose-Norberto Mazón, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2018 C conf
DOLAP
Julio Moreno, Manuel A. Serrano, Eduardo Fernández-Medina, Eduardo B. Fernández
2017 J jnl
Comput. Stand. Interfaces
Bibiano Rivas, Jorge Merino, Ismael Caballero, Manuel A. Serrano, Mario Piattini
2016 J jnl
Future Gener. Comput. Syst.
Jorge Merino, Ismael Caballero, Bibiano Rivas, Manuel A. Serrano, Mario Piattini
2016 J jnl
Inf. Softw. Technol.
Alejandro Maté, Juan Trujillo, Félix García, Manuel A. Serrano, Mario Piattini
2016 conf
FiCloud Workshops
Jesús Morán, Bibiano Rivas, Claudio de la Riva, Javier Tuya, Ismael Caballero, Manuel A. Serrano
2016 J jnl
Future Internet
Julio Moreno, Manuel A. Serrano, Eduardo Fernández-Medina
2016 conf
ICIQ
Julio Moreno, Manuel A. Serrano, Eduardo Fernández-Medina
2015 conf
ER Workshops
Bibiano Rivas, Jorge Merino, Manuel A. Serrano, Ismael Caballero, Mario Piattini
2015 J jnl
IET Softw.
Félix García, María Ángeles Moraga, Manuel A. Serrano, Mario Piattini
2014 conf
ER Workshops
Ismael Caballero, Manuel A. Serrano, Mario Piattini
2009 ch.
Encyclopedia of Database Systems
Rafael Romero, Jose-Norberto Mazón, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2009 conf
DASFAA Workshops
Ismael Caballero, Eugenio Verbo, Manuel A. Serrano, Coral Calero, Mario Piattini
2008 J jnl
Softw. Qual. J.
Manuel A. Serrano, Coral Calero, Houari A. Sahraoui, Mario Piattini
2007 C conf
SEKE
Manuel A. Serrano, Rafael Romero, Jose-Norberto Mazón, Juan Trujillo, Mario Piattini
2007 J jnl
Inf. Sci.
Félix García, Manuel A. Serrano, José A. Cruz-Lemus, Francisco Ruiz, Mario Piattini
2007 J jnl
Inf. Softw. Technol.
Manuel A. Serrano, Juan Trujillo, Coral Calero, Mario Piattini
2007 conf
JISBD
Manuel A. Serrano, Rafael Romero, Jose-Norberto Mazón, Juan Trujillo, Mario Piattini
2006 conf
ODBIS
Jose-Norberto Mazón, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2005 B conf
DaWaK
Gemma Berenguer, Rafael Romero, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2005 J jnl
Int. J. Data Warehous. Min.
Manuel A. Serrano, Coral Calero, Mario Piattini
2005 C conf
DOLAP
Jose-Norberto Mazón, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2005 conf
JISBD
Jose-Norberto Mazón, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2005 conf
JISBD
Jose-Norberto Mazón, Juan Trujillo, Manuel A. Serrano, Mario Piattini
2005 ch.
Encyclopedia of Information Science and Technology (IV)
Manuel A. Serrano, Coral Calero, Mario Piattini
2004 C conf
SEKE
Coral Calero, Manuel A. Serrano, Mario Piattini
2004 A conf
CAiSE
Manuel A. Serrano, Coral Calero, Juan Trujillo, Sergio Luján-Mora, Mario Piattini
2004 ed.
Software Audit and Metrics
Mario Piattini, Manuel A. Serrano
2004 conf
Software Audit and Metrics
Manuel A. Serrano, Coral Calero, Juan Trujillo, Sergio Luján-Mora, Mario Piattini
2003 conf
HICSS
Manuel A. Serrano, Coral Calero, Mario Piattini
2003 ch.
Effective Databases for Text & Document Management
Manuel A. Serrano, Coral Calero, Mario Piattini
2003 conf
JISBD
Manuel A. Serrano, Coral Calero, Juan Trujillo, Sergio Luján-Mora, Mario Piattini
2002 J jnl
IEE Proc. Softw.
Manuel A. Serrano, Coral Calero, Mario Piattini
2001 conf
JISBD
Manuel A. Serrano, Carolina Pascual, Coral Calero, Mario Piattini
2001 conf
DMDW
Coral Calero, Mario Piattini, Carolina Pascual, Manuel A. Serrano
2000 conf
ICEIS
Marcela Genero, Mario Piattini, Coral Calero, Manuel A. Serrano
redb/extractors/decompiler/_archive/GhidraDecompilerScript-latest.java
← Index redb/extractors/decompiler/_archive/GhidraDecompilerScript-latest.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 {
        // 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];

        // 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);
        }

        // 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) {
        Address entry = function.getEntryPoint();
        String functionName = function.getName();
        String functionAddress = entry.toString();

        // Process decompiled code
        processDecompiledCode(function, output.getJSONArray("decompiled"), 
                            functionName, functionAddress);

        // Process disassembled code
        processDisassembledCode(function, output.getJSONArray("disassembled"), 
                              functionName, functionAddress);

        // Process CFG
        processCFG(function, output.getJSONArray("cfg"), functionAddress);
    }

    private void processDecompiledCode(Function function, JSONArray decompArray, 
                                     String functionName, String functionAddress) {
        DecompileResults results = decompInterface.decompileFunction(function, 30, monitor);
        if (results.decompileCompleted()) {
            String decompiledCode = results.getDecompiledFunction().getC();
            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);
        }
    }

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

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

            while (instructions.hasNext()) {
                try {
                    Instruction instr = instructions.next();
                    String disasmLine = instr.toString();
                    disassembly.append(disasmLine).append("\n");
                    normalized.append(normalizeInstruction(disasmLine)).append("\n");
                    instructionCount++;
                } catch (Exception e) {
                    System.err.println("Error processing instruction in " + functionName + ": " + e.getMessage());
                }
            }

            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);

            // Set similarity-related fields to null for now
            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);
        } catch (Exception e) {
            System.err.println("Error processing disassembly for " + functionName + ": " + e.getMessage());
        }
    }

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

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

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

                // Get successor blocks
                CodeBlockReferenceIterator successors = block.getDestinations(monitor);
                JSONArray successorAddresses = new JSONArray();
                while (successors.hasNext()) {
                    CodeBlockReference ref = successors.next();
                    successorAddresses.put(ref.getDestinationAddress().toString());
                }
                blockObj.put("successor_blocks", successorAddresses);

                cfgArray.put(blockObj);
            }
        } catch (Exception e) {
            System.err.println("{\"error\": \"Error processing CFG: " + 
                             e.getMessage().replace("\"", "'") + "\"}");
        }
    }

    private String normalizeInstruction(String instruction) {
        return instruction.replaceAll("0x[0-9a-fA-F]+", "IMM")
                        .replaceAll("\\b\\d+\\b", "NUM");
    }

    private String getBlockInstructions(CodeBlock block) {
        StringBuilder instructions = new StringBuilder();
        AddressIterator addresses = block.getAddresses(true);
        while (addresses.hasNext()) {
            Address addr = addresses.next();
            Instruction instr = currentProgram.getListing().getInstructionAt(addr);
            if (instr != null) {
                instructions.append(instr.toString()).append("\n");
            }
        }
        return instructions.toString();
    }

    private String calculateHash(String content) {
        try {
            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("{\"error\": \"Error calculating hash\"}");
            return "";
        }
    }
}