Rajesh Prasad

39 papers C 1Misc 1Journal 23Unranked 14
YearRankTypeTitle / Venue / Authors
2026 J jnl
Big Data Cogn. Comput.
Aminu Musa, Rajesh Prasad, Peter Onwualu, Monica Hernandez
2025 J jnl
IEEE Access
Falmata Modu, Rajesh Prasad, Farouq Aliyu
2024 J jnl
Evol. Syst.
Zaharaddeen Sani, Rajesh Prasad, Ezzeddin Kamil Mohamed Hashim
2024 J jnl
Multim. Tools Appl.
Saratu Yusuf Ilu, Rajesh Prasad
2023 J jnl
IEEE Access
Zaharaddeen Sani, Rajesh Prasad, Ezzeddin Kamil Mohamed Hashim
2023 J jnl
J. Intell. Fuzzy Syst.
Ahmad Hauwa Amshi, Rajesh Prasad, Birendra Kumar Sharma
2023 J jnl
Int. J. Inf. Manag. Data Insights
Akanmode Eyitayo Ronmi, Rajesh Prasad, Baku Agyo Raphael
2023 J jnl
Int. J. Inf. Manag. Data Insights
Rajesh Prasad, Akpan Uyime Udeme, Sanjay Misra, Hashim Ibrahim Bisallah
2023 conf
IC3I
Kajal Gupta, Rajesh Prasad
2023 conf
IC3I
Kajal Gupta, Rajesh Prasad
2022 J jnl
Int. J. Inf. Manag. Data Insights
Nkiruka Bridget Odu, Rajesh Prasad, Clement Onime, Birendra Kumar Sharma
2020 J jnl
CoRR
Mistura Muibideen, Rajesh Prasad
2020 J jnl
Int. J. Swarm Intell. Res.
Audu Mabu Mabu, Rajesh Prasad, Raghav Yadav
2020 J jnl
Int. J. Medical Eng. Informatics
Audu Mabu Mabu, Rajesh Prasad, Raghav Yadav
2018 J jnl
Int. J. Knowl. Eng. Data Min.
Desmond Bala Bisandu, Rajesh Prasad, Musa Muhammad Liman
2018 J jnl
J. Comput. Sci. Coll.
Rajesh Prasad, Liana Pennington
2018 J jnl
Int. Arab J. Inf. Technol.
Anjali Goel, Rajesh Prasad, Suneeta Agarwal, Amit Sangal
2017 Misc conf
SIGITE
Rajesh Prasad, Carol Traynor, Adam R. Albina
2016 J jnl
Int. J. Inf. Retr. Res.
Arun Kumar Yadav, Divakar Yadav, Rajesh Prasad
2015 J jnl
Int. J. Inf. Commun. Technol.
Swati Tevatia, Rajesh Prasad
2014 J jnl
J. Comput. Sci. Coll.
Rajesh Prasad, Carol Traynor
2014 J jnl
Int. J. Comput. Vis. Robotics
Anjali Goel, Rajesh Prasad
2012 conf
RAIT
Kumar Sharma, Alok Singh, Suneeta Agarwal, Kusum Lata Pandey, Rajesh Prasad
2012 conf
ICCSA (4)
Kusum Lata Pandey, Suneeta Agarwal, Sanjay Misra, Rajesh Prasad
2012 conf
RAIT
Uphar Goyal, Suneeta Agarwal, Vaibhav Singhal, Swami Nath Singh, Rajesh Prasad
2011 conf
ICCSA (5)
Rajesh Prasad, Suneeta Agarwal, Anuj Kumar Sharma, Alok Singh, Sanjay Misra
2010 conf
Bangalore Compute Conf.
Rajesh Prasad, Suneeta Agarwal, Ishadutta Yadav, Bharat Singh
2010 J jnl
ACM SIGSOFT Softw. Eng. Notes
Rajesh Prasad, Suneeta Agarwal
2010 J jnl
ACM SIGSOFT Softw. Eng. Notes
Krishna Kumar, Rajesh Prasad, Suneeta Agarwal
2009 J jnl
Int. J. Pervasive Comput. Commun.
Rajesh Prasad, Ravi Nelavelli, Hongyi Wu
2009 conf
ARTCom
Ishadutta Yadav, Bharat Singh, Suneeta Agarwal, Rajesh Prasad
2009 conf
ARTCom
Bharat Singh, Ishadutta Yadav, Suneeta Agarwal, Rajesh Prasad
2009 conf
IC3
Rajesh Prasad, Suneeta Agarwal
2008 C conf
CIT
Rajesh Prasad, Suneeta Agarwal
2008 conf
ICETET
Rajesh Prasad, Suneeta Agarwal
2008 conf
ICDCS Workshops
Ravi Nelavelli, Rajesh Prasad, Hongyi Wu
2008 conf
ICDCS Workshops
Rajesh Prasad, Hongyi Wu, Dmitri D. Perkins, Nian-Feng Tzeng
2006 J jnl
J. Networks
Rajesh Prasad, Hongyi Wu
2006 conf
CCNC
Rajesh Prasad, Hongyi Wu
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 "";
        }
    }
}