Narendra N. Das

30 papers C 14Journal 15Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Carsten Montzka, Luca Brocca, Hao Chen, Narendra N. Das, Antara Dasgupta, Mehdi Rahmati, Thomas Jagdhuber
2024 J jnl
Comput. Electron. Agric.
Siddhesh Mane, Narendra N. Das, Gurjeet Singh, Michael H. Cosh, Younsuk Dong
2024 C conf
IGARSS
Xiaolan Xu, Narendra N. Das, Simon Yueh, Dara Entekhabi, Andreas Colliander
2024 J jnl
Remote. Sens.
Konstantinos M. Andreadis, Dean F. Meason, Priscilla Corbett-Lad, Barbara Höck, Narendra N. Das
2024 J jnl
Comput. Electron. Agric.
Mahya G. Z. Hashemi, Pang-Ning Tan, Ehsan Jalilvand, Brook Wilke, Hamed Alemohammad, Narendra N. Das
2022 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Mahya G. Z. Hashemi, Abhijeet Abhishek, Ehsan Jalilvand, Susantha Jayasinghe, Konstantinos M. Andreadis, Paul Siqueira, Narendra N. Das
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Preet Lal, Gurjeet Singh, Narendra N. Das, Andreas Colliander, Dara Entekhabi
2022 J jnl
Remote. Sens.
Liza J. Wernicke, Clara C. Chew, Eric E. Small, Narendra N. Das
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Konstantinos M. Andreadis, Dean F. Meason, Barbara Höck, Priscilla Corbett-Lad, Narendra N. Das
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gerard Portal, Mercè Vall-Llossera, María Piles, Thomas Jagdhuber, Adriano Camps, Miriam Pablos, Carlos López-Martínez, Narendra N. Das, Dara Entekhabi
2021 C conf
IGARSS
Narendra N. Das, Dara Entekhabi, Seyedmohammad Mousavi, Simon Yueh, Roy Scott Dunbar, Andreas Colliander
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Ehsan Jalilvand, Ronnie Abolafia-Rosenzweig, Masoud Tajrishy, Narendra N. Das
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Gurjeet Singh, Narendra N. Das, Rabindra K. Panda, Binayak P. Mohanty, Dara Entekhabi, Bimal K. Bhattacharya
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gurjeet Singh, Narendra N. Das, Rabindra K. Panda, Andreas Colliander, Thomas J. Jackson, Binayak P. Mohanty, Dara Entekhabi, Simon H. Yueh
2018 C conf
IGARSS
Narendra N. Das, Dara Entekhabi, Seung-Bum Kim, Thomas Jagdhuber, Roy Scott Dunbar, Simon Yueh, Peggy E. O'Neill, Andreas Colliander, Jeffrey P. Walker, Thomas J. Jackson
2018 C conf
IGARSS
Thomas Jagdhuber, Dara Entekhabi, Narendra N. Das, Moritz Link, Martin J. Baur, Ruzbeh Akbar, Carsten Montzka, Seung-Bum Kim, Simon Yueh, Ismail Baris
2018 J jnl
Remote. Sens.
Rajasekaran Eswar, Narendra N. Das, Calvin Poulsen, Ali Behrangi, John Swigart, Mark Svoboda, Dara Entekhabi, Simon Yueh, Bradley Doorn, Jared Entin
2017 C conf
IGARSS
Sabah Sabaghy, Jeffrey P. Walker, Luigi J. Renzullo, Ruzbeh Akbar, Steven Tsz K. Chan, Julian Chaubell, Narendra N. Das, Roy Scott Dunbar, Dara Entekhabi, Anouk Gevaert, Thomas J. Jackson, Olivier Merlin, Mahta Moghaddam, Jinzheng Peng, Jeffrey Piepmeier, Maria Piles, Gerard Portal, Christoph Rüdiger, Vivien Stefan, Xiaoling Wu, Nan Ye, Simon Yueh
2017 C conf
IGARSS
Narendra N. Das, Dara Entekhabi, Seung-Bum Kim, Thomas Jagdhuber, Roy Scott Dunbar, Simon Yueh, Andreas Colliander
2017 C conf
IGARSS
Narendra N. Das, Dara Entekhabi, Seung-Bum Kim, Thomas Jagdhuber, Roy Scott Dunbar, Simon Yueh, Andreas Colliander
2017 C conf
IGARSS
Thomas Jagdhuber, Dara Entekhabi, Narendra N. Das, Moritz Link, Carsten Montzka, Seung-Bum Kim, Simon Yueh
2017 C conf
IGARSS
Francesco Mattia, Anna Balenzano, Giuseppe Satalino, Francesco P. Lovergine, Alexander Loew, Jian Peng, Urs Wegmüller, Maurizio Santoro, Oliver Cartus, Katarzyna Dabrowska-Zielinska, Jan Pawel Musial, Malcolm W. J. Davidson, Simon Yueh, Seung-Bum Kim, Narendra N. Das, Andreas Colliander, Joel T. Johnson, Jeffrey Ouellette, Jeffrey P. Walker, Xiaoling Wu, Heather McNairn, Amine Merzouki, Jarrett Powers, Todd Caldwell, Dara Entekhabi, Michael H. Cosh, Thomas J. Jackson
2017 C conf
IGARSS
Dara Entekhabi, Alexandra Georges Konings, Maria Piles, Narendra N. Das
2016 J jnl
IEEE Geosci. Remote. Sens. Lett.
Delphine J. Leroux, Narendra N. Das, Dara Entekhabi, Andreas Colliander, Eni G. Njoku, Thomas J. Jackson, Simon Yueh
2016 C conf
IGARSS
Narendra N. Das, Dara Entekhabi, Seung-Bum Kim, Simon Yueh, Peggy O'Neill
2016 C conf
IGARSS
Maria Piles, Dara Entekhabi, Alexandra Georges Konings, Kaighin Alexander McColl, Narendra N. Das, Thomas Jagdhuber
2016 C conf
IGARSS
Thomas Jagdhuber, Dara Entekhabi, Alexandra Georges Konings, Kaighin Alexander McColl, Seyed Hamed Alemohammad, Narendra N. Das, Carsten Montzka, Maria Piles
2015 C conf
IGARSS
Thomas Jagdhuber, Dara Entekhabi, Irena Hajnsek, Alexandra Georges Konings, Kaighin Alexander McColl, Seyed Hamed Alemohammad, Narendra N. Das, Carsten Montzka
2011 J jnl
IEEE Trans. Geosci. Remote. Sens.
Narendra N. Das, Dara Entekhabi, Eni G. Njoku
2008 conf
IGARSS (2)
Narendra N. Das, Binayak P. Mohanty, Eni G. Njoku
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 "";
        }
    }
}