Rajiv Ranjan Sahay

30 papers A 1B 1C 1Journal 12Unranked 14
YearRankTypeTitle / Venue / Authors
2025 J jnl
Mach. Vis. Appl.
Moushumi Medhi, Rajiv Ranjan Sahay
2025 J jnl
CoRR
Moushumi Medhi, Rajiv Ranjan Sahay
2024 J jnl
CoRR
Sankaraganesh Jonna, Moushumi Medhi, Rajiv Ranjan Sahay
2024 conf
ICPR (4)
Kankana Roy, Aparna Mohanty, Rajiv Ranjan Sahay
2024 J jnl
Vis. Comput.
Aparna Mohanty, Kankana Roy, Rajiv Ranjan Sahay
2023 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Sankaraganesh Jonna, Moushumi Medhi, Rajiv Ranjan Sahay
2022 J jnl
Vis. Comput.
Kankana Roy, Rajiv Ranjan Sahay
2021 J jnl
IEEE Trans. Image Process.
Sourish Sarkar, Rajiv Ranjan Sahay
2021 conf
CVIP (2)
Moushumi Medhi, Rajiv Ranjan Sahay
2021 J jnl
Signal Process. Image Commun.
Sukla Satapathy, Rajiv Ranjan Sahay
2021 C conf
ICCE
Sukla Satapathy, Rajiv Ranjan Sahay
2020 conf
NCC
Sukla Satapathy, Rajiv Ranjan Sahay
2019 conf
CVPR Workshops
Prashanth Kumar G., Rajiv Ranjan Sahay
2018 ch.
Heritage Preservation
Aparna Mohanty, Kankana Roy, Rajiv Ranjan Sahay
2018 J jnl
Pattern Recognit.
Aparna Mohanty, Rajiv Ranjan Sahay
2018 J jnl
IEEE J. Biomed. Health Informatics
S. R. Sreeja, Rajiv Ranjan Sahay, Debasis Samanta, Pabitra Mitra
2017 conf
ICCV Workshops
Prashanth Kumar G., Rajiv Ranjan Sahay
2017 conf
ICCV Workshops
Kankana Roy, Aparna Mohanty, Rajiv Ranjan Sahay
2016 conf
ICVGIP Workshops
Moushumi Medhi, Shubham Sinha, Rajiv Ranjan Sahay
2016 conf
CVIP (2)
Aparna Mohanty, Sai Saketh Rambhatla, Rajiv Ranjan Sahay
2016 J jnl
Signal Process. Image Commun.
Aparna Mohanty, Pratik Vaishnavi, Prerana Jana, Anubhab Majumdar, Alfaz Ahmed, Trishita Goswami, Rajiv Ranjan Sahay
2016 conf
CVIP (2)
Aparna Mohanty, Alfaz Ahmed, Trishita Goswami, Arpita Das, Pratik Vaishnavi, Rajiv Ranjan Sahay
2014 conf
ICME Workshops
Chetan S. Negi, Koyel Mandal, Rajiv Ranjan Sahay, Mohan S. Kankanhalli
2013 conf
ICME Workshops
Yang Yang Xiang, Rajiv Ranjan Sahay, Mohan S. Kankanhalli
2013 B conf
ICIP
Vrushali S. Khasare, Rajiv Ranjan Sahay, Mohan S. Kankanhalli
2011 J jnl
IEEE Trans. Image Process.
Rajiv Ranjan Sahay, Ambasamudram N. Rajagopalan
2009 A conf
BMVC
Rajiv Ranjan Sahay, Ambasamudram N. Rajagopalan
2009 conf
DAGM-Symposium
Rajiv Ranjan Sahay, Ambasamudram N. Rajagopalan
2008 conf
VISAPP (1)
Rajiv Ranjan Sahay, A. N. Rajagopalan
2007 conf
ICIP (2)
Rajiv Ranjan Sahay, A. N. Rajagopalan
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 "";
        }
    }
}