Naveen Mysore Balasubramanya

35 papers B 8Journal 15Unranked 12
YearRankTypeTitle / Venue / Authors
2024 conf
VTC Spring
Yashwanth Ramesh Kumar, Naveen Mysore Balasubramanya
2024 conf
VTC Spring
Rishita S. Nambur, Naveen Mysore Balasubramanya, V. Shrikanth
2024 J jnl
IEEE Internet Things J.
Ayman T. Abusabah, Naveen Mysore Balasubramanya, Rodolfo Oliveira
2023 J jnl
IEEE Internet Things J.
Harini Grama Srinath, Smriti Jha, Naveen Mysore Balasubramanya
2023 conf
ICC
Rishabh Roy, Rajshekhar Vishweshwar Bhat, Preyas Hathi, Nadeem Akhtar, Naveen Mysore Balasubramanya
2023 J jnl
CoRR
Rishabh Roy, Rajshekhar Vishweshwar Bhat, Preyas Hathi, Nadeem Akhtar, Naveen Mysore Balasubramanya
2023 B conf
WCNC
Smriti Jha, Harini Grama Srinath, Naveen Mysore Balasubramanya
2023 B conf
WCNC
N. Praveen Kumar, Sivarama Krishna M, Naveen Mysore Balasubramanya
2022 conf
VTC Spring
N. Praveen Kumar, Naveen Mysore Balasubramanya
2022 B conf
WCNC
Yashwanth Ramesh Kumar, Naveen Mysore Balasubramanya
2022 J jnl
IEEE Internet Things J.
Harini Grama Srinath, Mrinal Rana, Naveen Mysore Balasubramanya
2022 conf
GLOBECOM (Workshops)
Smriti Jha, Naveen Mysore Balasubramanya
2021 J jnl
IEEE Internet Things J.
Faramarz Jabbarvaziri, Naveen Mysore Balasubramanya, Lutz Lampe
2021 J jnl
IEEE Trans. Commun.
Ronghua Gui, Naveen Mysore Balasubramanya, Lutz Lampe
2020 J jnl
IEEE Internet Things J.
Ronghua Gui, Naveen Mysore Balasubramanya, Lutz Lampe
2020 conf
ICC
Ankit Gupta, Naveen Mysore Balasubramanya, Mathini Sellathurai
2020 conf
WF-IoT
G. S. Harini, Naveen Mysore Balasubramanya, Mrinal Rana
2019 J jnl
IEEE Access
Hebatallah Shoukry, Naveen Mysore Balasubramanya, Satyanarayana Vuppala, Mathini Sellathurai
2019 J jnl
IEEE Wirel. Commun. Lett.
Sohail Payami, Naveen Mysore Balasubramanya, Christos Masouros, Mathini Sellathurai
2019 J jnl
IEEE Commun. Stand. Mag.
Ali Cagatay Cirik, Naveen Mysore Balasubramanya, Lutz Lampe, Gustav Vos, Steve Bennett
2019 B conf
GLOBECOM
Ronghua Gui, Naveen Mysore Balasubramanya, Gautham Prasad, Lutz Lampe
2018 B conf
GLOBECOM
Naveen Mysore Balasubramanya, Ankit Gupta, Mathini Sellathurai
2018 J jnl
IEEE Wirel. Commun. Lett.
Ali Cagatay Cirik, Naveen Mysore Balasubramanya, Lutz Lampe
2018 conf
VTC Spring
Naveen Mysore Balasubramanya, Sohail Payami, Mathini Sellathurai
2017 B conf
ICCCN
Ali Cagatay Cirik, Naveen Mysore Balasubramanya, Lutz Lampe
2017 J jnl
CoRR
Sohail Payami, Naveen Mysore Balasubramanya, Mathini Sellathurai
2017 J jnl
IEEE Trans. Mob. Comput.
Naveen Mysore Balasubramanya, Lutz Lampe, Gustav Vos, Steve Bennett
2017 B conf
PIMRC
Martin Kuerbis, Naveen Mysore Balasubramanya, Lutz Lampe, Alexander Lampe
2016 J jnl
IEEE Internet Things J.
Naveen Mysore Balasubramanya, Lutz Lampe, Gustav Vos, Steve Bennett
2016 J jnl
IEEE Access
Naveen Mysore Balasubramanya, Lutz Lampe, Gustav Vos, Steve Bennett
2016 conf
EUSIPCO
Martin Kuerbis, Naveen Mysore Balasubramanya, Lutz H.-J. Lampe, Alexander Lampe
2016 conf
CCECE
Naveen Mysore Balasubramanya, Lutz Lampe
2014 conf
GLOBECOM Workshops
Naveen Mysore Balasubramanya, Lutz Lampe, Gustav Vos, Steve Bennett
2014 conf
GLOBECOM Workshops
Naveen Mysore Balasubramanya, Lutz Lampe
2011 B conf
GLOBECOM
Timothy X. Brown, Naveen Mysore Balasubramanya
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 "";
        }
    }
}