Kaarthik Sundar

80 papers A* 1C 7Journal 62Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Control. Syst. Lett.
Shriram Srinivasan, Kaarthik Sundar
2025 J jnl
CoRR
Andrew W. Rosemberg, Joaquim Dias Garcia, François Pacaud, Robert B. Parker, Benoît Legat, Kaarthik Sundar, Russell Bent, Pascal Van Hentenryck
2025 J jnl
J. Glob. Optim.
Christopher Montez, Sujeevraja Sanjeevi, Kaarthik Sundar
2025 A* conf
ICML
Parikshit Pareek, Abhijith Jayakumar, Kaarthik Sundar, Sidhant Misra, Deepjyoti Deka
2025 conf
ICCPS
Andrew Chio, Russell Bent, Kaarthik Sundar, Nalini Venkatasubramanian
2025 conf
ICCPS
Andrew Chio, Russell Bent, Kaarthik Sundar, Nalini Venkatasubramanian
2024 J jnl
CoRR
Kaarthik Sundar, Sivakumar Rathinam
2024 J jnl
CoRR
Kaarthik Sundar, Deepjyoti Deka, Russell Bent
2024 J jnl
CoRR
Manav Mishra, Hritik Bana, Saswata Sarkar, Sujeevraja Sanjeevi, Sujit PB, Kaarthik Sundar
2024 C conf
ACC
Saif R. Kazi, Kaarthik Sundar, Anatoly Zlotnik
2024 J jnl
CoRR
Abhay Singh Bhadoriya, Deepjyoti Deka, Kaarthik Sundar
2024 J jnl
CoRR
Shriram Srinivasan, Kaarthik Sundar
2024 J jnl
IEEE Control. Syst. Lett.
Shriram Srinivasan, Kaarthik Sundar
2024 J jnl
IEEE Control. Syst. Lett.
Shriram Srinivasan, Nishant Panda, Kaarthik Sundar
2024 J jnl
CoRR
Parikshit Pareek, Kaarthik Sundar, Deepjyoti Deka, Sidhant Misra
2024 conf
CDC
Saif R. Kazi, Sidhant Misra, Svetlana Tokareva, Kaarthik Sundar, Anatoly Zlotnik
2023 J jnl
CoRR
Kaarthik Sundar, Deepjyoti Deka, Russell Bent
2023 J jnl
IEEE Trans. Intell. Veh.
Venkata Sirimuvva Chirala, Kaarthik Sundar, Saravanan Venkatachalam, Jonathon M. Smereka, Sam Kassoumeh
2023 J jnl
IEEE Trans. Control. Netw. Syst.
Shriram Srinivasan, Kaarthik Sundar, Vitaliy Gyrya, Anatoly Zlotnik
2023 J jnl
CoRR
Shriram Srinivasan, Nishant Panda, Kaarthik Sundar
2023 J jnl
CoRR
Yuqi Zhou, Kaarthik Sundar, Deepjyoti Deka, Hao Zhu
2023 C conf
ACC
Mo Sodwatana, Saif R. Kazi, Kaarthik Sundar, Anatoly Zlotnik
2023 conf
CDC
Kaarthik Sundar, Harsha Nagarajan, Sidhant Misra, Mowen Lu, Carleton Coffrin, Russell Bent
2022 J jnl
EURO J. Transp. Logist.
Kaarthik Sundar, Sujeevraja Sanjeevi, Christopher Montez
2022 J jnl
J. Intell. Robotic Syst.
Sohum Misra, Kaarthik Sundar, Rajnikant Sharma, Kevin M. Brink
2022 J jnl
Comput. Chem. Eng.
Byron Tasseff, Carleton Coffrin, Russell Bent, Kaarthik Sundar, Anatoly Zlotnik
2022 J jnl
CoRR
Shriram Srinivasan, Kaarthik Sundar, Vitaliy Gyrya, Anatoly Zlotnik
2022 J jnl
IEEE Trans. Control. Syst. Technol.
Sai Krishna Kanth Hari, Kaarthik Sundar, Shriram Srinivasan, Anatoly Zlotnik, Russell Bent
2022 J jnl
Comput. Oper. Res.
Sudarshan Rajan, Kaarthik Sundar, Natarajan Gautam
2021 J jnl
IEEE Trans. Control. Netw. Syst.
Kaarthik Sundar, Sidhant Misra, Russell Bent, Feng Pan
2021 J jnl
IEEE Access
Fuyu Hu, Kaarthik Sundar, Shriram Srinivasan, Russell Bent
2021 J jnl
CoRR
Sohum Misra, Kaarthik Sundar, Rajnikant Sharma, Kevin M. Brink
2021 J jnl
Oper. Res. Lett.
Kaarthik Sundar, Harsha Nagarajan, Jeff T. Linderoth, Site Wang, Russell Bent
2021 C conf
ACC
Kaarthik Sundar, Sidhant Misra, Anatoly Zlotnik, Russell Bent
2020 J jnl
CoRR
Line A. Roald, Kaarthik Sundar, Anatoly Zlotnik, Sidhant Misra, Göran Andersson
2020 J jnl
Proc. IEEE
Line A. Roald, Kaarthik Sundar, Anatoly Zlotnik, Sidhant Misra, Göran Andersson
2020 J jnl
IEEE Trans Autom. Sci. Eng.
Satyanarayana G. Manyam, Kaarthik Sundar, David W. Casbeer
2020 J jnl
CoRR
Kaarthik Sundar, Harsha Nagarajan, Site Wang, Jeff T. Linderoth, Russell Bent
2020 conf
SWAT
Sivakumar Rathinam, R. Ravi, J. Bae, Kaarthik Sundar
2020 J jnl
IEEE Access
Sohum Misra, Bingyu Wang, Kaarthik Sundar, Rajnikant Sharma, Sivakumar Rathinam
2019 J jnl
CoRR
Ignacio Losada Carreno, Anna Scaglione, Anatoly Zlotnik, Deepjyoti Deka, Kaarthik Sundar
2019 J jnl
J. Glob. Optim.
Harsha Nagarajan, Mowen Lu, Site Wang, Russell Bent, Kaarthik Sundar
2019 J jnl
IEEE Trans. Control. Netw. Syst.
Kaarthik Sundar, Harsha Nagarajan, Line Roald, Sidhant Misra, Russell Bent, Daniel Bienstock
2019 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Parikshit Maini, Kaarthik Sundar, Mandeep Singh, Sivakumar Rathinam, P. B. Sujit
2019 J jnl
CoRR
Kaarthik Sundar, Anatoly Zlotnik
2019 conf
CCTA
Kaarthik Sundar, Anatoly Zlotnik
2019 conf
CDC
Anatoly Zlotnik, Kaarthik Sundar, Aleksandr M. Rudkevich, Aleksandr Beylin, Xindi Li
2019 J jnl
Optim. Lett.
Kaarthik Sundar, Sivakumar Rathinam, Rajnikant Sharma
2019 J jnl
IEEE Trans. Control. Syst. Technol.
Kaarthik Sundar, Anatoly Zlotnik
2018 J jnl
Sensors
Saravanan Venkatachalam, Kaarthik Sundar, Sivakumar Rathinam
2018 J jnl
CoRR
Harsha Nagarajan, Kaarthik Sundar, Hassan L. Hijazi, Russell Bent
2018 J jnl
CoRR
Parikshit Maini, Kaarthik Sundar, Sivakumar Rathinam, P. B. Sujit
2018 J jnl
CoRR
Sai Krishna Kanth Hari, Kaarthik Sundar, Harsha Nagarajan, Russell Bent, Scott Backhaus
2018 C conf
ACC
Kaarthik Sundar, Shriram Srinivasan, Sohum Misra, Sivakumar Rathinam, Rajnikant Sharma
2018 J jnl
CoRR
Kaarthik Sundar, Harsha Nagarajan, Sidhant Misra, Mowen Lu, Carleton Coffrin, Russell Bent
2018 J jnl
Networks
Kaarthik Sundar, Carleton Coffrin, Harsha Nagarajan, Russell Bent
2018 J jnl
CoRR
Kaarthik Sundar, Anatoly Zlotnik
2017 J jnl
CoRR
Kaarthik Sundar, Harsha Nagarajan, Line Roald, Sidhant Misra, Russell Bent, Daniel Bienstock
2017 J jnl
J. Intell. Robotic Syst.
Kaarthik Sundar, Sivakumar Rathinam
2017 J jnl
CoRR
Harsha Nagarajan, Mowen Lu, Site Wang, Russell Bent, Kaarthik Sundar
2017 J jnl
Unmanned Syst.
Kaarthik Sundar, Saravanan Venkatachalam, Sivakumar Rathinam
2017 conf
CCTA
Satyanarayana G. Manyam, Kaarthik Sundar, David W. Casbeer
2017 J jnl
J. Glob. Optim.
Kaarthik Sundar, Sivakumar Rathinam
2017 J jnl
CoRR
Kaarthik Sundar, Saravanan Venkatachalam, Satyanarayana G. Manyam
2017 J jnl
CoRR
Carleton Coffrin, Russell Bent, Kaarthik Sundar, Yeesian Ng, Miles Lubin
2017 J jnl
CoRR
Kaarthik Sundar, Carleton Coffrin, Harsha Nagarajan, Russell Bent
2017 J jnl
CoRR
Kaarthik Sundar, Sohum Misra, Sivakumar Rathinam, Rajnikant Sharma
2016 conf
CASE
Kaarthik Sundar, Jianglei Qin, Sivakumar Rathinam, Lewis Ntaimo, Swaroop Darbha, Christopher G. Valicka
2016 J jnl
CoRR
Kaarthik Sundar, Saravanan Venkatachalam, Sivakumar Rathinam
2016 C conf
ACC
Kaarthik Sundar, Saravanan Venkatachalam, Sivakumar Rathinam
2016 J jnl
Comput. Oper. Res.
Kaarthik Sundar, Sivakumar Rathinam
2016 C conf
ACC
Satyanarayana G. Manyam, David W. Casbeer, Kaarthik Sundar
2016 J jnl
CoRR
Kaarthik Sundar, Harsha Nagarajan, Miles Lubin, Line Roald, Sidhant Misra, Russell Bent, Daniel Bienstock
2016 conf
PSCC
Kaarthik Sundar, Harsha Nagarajan, Miles Lubin, Line Roald, Sidhant Misra, Russell Bent, Daniel Bienstock
2015 J jnl
CoRR
Kaarthik Sundar, Saravanan Venkatachalam, Sivakumar Rathinam
2015 J jnl
CoRR
Kaarthik Sundar, Sivakumar Rathinam
2014 J jnl
IEEE Trans Autom. Sci. Eng.
Kaarthik Sundar, Sivakumar Rathinam
2014 J jnl
CoRR
Kaarthik Sundar, Sivakumar Rathinam
2013 J jnl
CoRR
Kaarthik Sundar, Sivakumar Rathinam
2012 C conf
ACC
Kaarthik Sundar, Sivakumar Rathinam
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 "";
        }
    }
}