Rajdeep Kumar Nath

29 papers C 2Misc 1Journal 13Unranked 13
YearRankTypeTitle / Venue / Authors
2025 conf
ISVLSI
Rajdeep Kumar Nath, Daniel Nguyen, Mohammad H. Behfar, Mari Rytky, Teemu Ahmaniemi, Johan Plomp
2023 conf
UbiComp/ISWC Adjunct
Rajdeep Kumar Nath, Jaakko Tervonen, Johanna Närväinen, Kati Pettersson, Jani Mäntyjärvi
2023 conf
PervasiveHealth
Jaakko Tervonen, Rajdeep Kumar Nath, Kati Pettersson, Johanna Närväinen, Jani Mäntyjärvi
2023 conf
UbiComp/ISWC Adjunct
Jaakko Tervonen, Rajdeep Kumar Nath, Kati Pettersson, Johanna Närväinen, Jani Mäntyjärvi
2023 conf
BHI
Rajdeep Kumar Nath, Jaakko Tervonen, Johanna Närväinen, Kati Pettersson, Jani Mäntyjärvi
2023 conf
ACM Great Lakes Symposium on VLSI
Rajdeep Kumar Nath, Jaakko Tervonen, Johanna Närväinen, Kati Pettersson, Jani Mäntyjärvi
2022 J jnl
J. Signal Process. Syst.
Rajdeep Kumar Nath, Himanshu Thapliyal, Allison Caban-Holt
2021 J jnl
SN Comput. Sci.
Rajdeep Kumar Nath, Himanshu Thapliyal, Travis S. Humble
2021 J jnl
CoRR
Rajdeep Kumar Nath, Himanshu Thapliyal, Travis S. Humble
2021 J jnl
CoRR
Rajdeep Kumar Nath, Himanshu Thapliyal
2021 conf
WF-IoT
Joseph Clark, Rajdeep Kumar Nath, Himanshu Thapliyal
2021 J jnl
CoRR
Joseph Clark, Rajdeep Kumar Nath, Himanshu Thapliyal
2021 J jnl
SN Comput. Sci.
Rajdeep Kumar Nath, Himanshu Thapliyal
2021 conf
ISVLSI
Rajdeep Kumar Nath, Himanshu Thapliyal, Travis S. Humble
2021 J jnl
CoRR
Rajdeep Kumar Nath, Himanshu Thapliyal, Travis S. Humble
2021 J jnl
IEEE Trans. Consumer Electron.
Rajdeep Kumar Nath, Himanshu Thapliyal
2021 conf
ISVLSI
Rajdeep Kumar Nath, Himanshu Thapliyal
2021 J jnl
CoRR
Rajdeep Kumar Nath, Himanshu Thapliyal
2020 J jnl
IEEE Consumer Electron. Mag.
Rajdeep Kumar Nath, Himanshu Thapliyal, Allison Caban-Holt, Saraju P. Mohanty
2020 conf
WF-IoT
Rajdeep Kumar Nath, Himanshu Thapliyal
2020 C conf
ICCE
Rajdeep Kumar Nath, Himanshu Thapliyal, Allison Caban-Holt
2018 C conf
ICCE
Rajdeep Kumar Nath, Rajnish Bajpai, Himanshu Thapliyal
2018 J jnl
IEEE Consumer Electron. Mag.
Himanshu Thapliyal, Rajdeep Kumar Nath, Saraju P. Mohanty
2018 conf
iSES
Rajdeep Kumar Nath, Himanshu Thapliyal, Allison Caban-Holt
2017 J jnl
IET Circuits Devices Syst.
Rajdeep Kumar Nath, Bibhash Sen, Biplab K. Sikdar
2016 J jnl
Microelectron. J.
Bibhash Sen, Yashraj Sahu, Rijoy Mukherjee, Rajdeep Kumar Nath, Biplab K. Sikdar
2016 Misc conf
VLSID
Bibhash Sen, Rajdeep Kumar Nath, Rijoy Mukherjee, Yashraj Sahu, Biplab K. Sikdar
2015 conf
VDAT
Rajdeep Kumar Nath, Bibhash Sen, Rachit Daga, Nilesh Chakraborty, Harsh Tibrewal, Biplab K. Sikdar
2014 conf
ISED
Bibhash Sen, Rijoy Mukherjee, Rajdeep Kumar Nath, Biplab K. Sikdar
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 "";
        }
    }
}