R. N. Uma

28 papers A* 5A 1B 6C 1Misc 2Journal 10Unranked 3
YearRankTypeTitle / Venue / Authors
2024 conf
SIGCSE (2)
John Bartucz, Ana Smaranda Sandu, Laney Strange, R. N. Uma
2020 Misc ed.
COCOON
Donghyun Kim, R. N. Uma, Zhipeng Cai, Dong Hoon Lee
2020 J jnl
IEEE Trans. Netw. Sci. Eng.
Donghyun Kim, My T. Thai, R. N. Uma
2019 J jnl
IEEE Trans. Cloud Comput.
S. Eman Mahmoodi, R. N. Uma, K. P. Subbalakshmi
2018 C ed.
COCOA
Donghyun Kim, R. N. Uma, Alexander Zelikovsky
2017 J jnl
IEEE Trans. Veh. Technol.
Donghyun Kim, Yesenia Velasco, Wei Wang, R. N. Uma, Rasheed Hussain, Sejin Lee
2016 Misc conf
ICNC
Donghyun Kim, Yesenia Velasco, Zishen Yang, Wei Wang, Rasheed Hussain, R. N. Uma
2016 A* conf
MobiCom
S. Eman Mahmoodi, K. P. Subbalakshmi, R. N. Uma
2014 J jnl
IEEE Trans. Mob. Comput.
Donghyun Kim, R. N. Uma, Baraki H. Abay, Weili Wu, Wei Wang, Alade O. Tokuta
2012 B conf
GLOBECOM
Donovan Bradley, R. N. Uma
2012 A* conf
INFOCOM
Donghyun Kim, Baraki H. Abay, R. N. Uma, Weili Wu, Wei Wang, Alade O. Tokuta
2006 J jnl
ACM Trans. Inf. Syst. Secur.
Rajarathnam Chandramouli, Satish Bapatla, K. P. Subbalakshmi, R. N. Uma
2006 J jnl
Theor. Comput. Sci.
R. N. Uma, Joel Wein, David P. Williamson
2005 J jnl
INFORMS J. Comput.
Martin W. P. Savelsbergh, R. N. Uma, Joel Wein
2004 conf
ICC
Rajarathnam Chandramouli, S. Sri Ganesh Veera Kumar, R. N. Uma
2004 B conf
ICIP
Siva Somasundaram, Koduvayur P. Subbalakshmi, R. N. Uma
2004 conf
Security, Steganography, and Watermarking of Multimedia Contents
Rajarathnam Chandramouli, Shalin P. Trivedi, R. N. Uma
2003 J jnl
Int. J. Cooperative Inf. Syst.
Je-Ho Park, Vinay Kanitkar, R. N. Uma, Alex Delis
2003 J jnl
IEEE J. Sel. Areas Commun.
Jianping Wang, Biao Chen, R. N. Uma
2003 A* conf
ICRA
Ovidiu Daescu, Derek Soeder, R. N. Uma
2003 J jnl
J. Algorithms
Daniel W. Engels, David R. Karger, Stavros G. Kolliopoulos, Sudipta Sengupta, R. N. Uma, Joel Wein
2003 B conf
WCNC
Rajarathnam Chandramouli, R. N. Uma
2000 A* conf
SODA
Cynthia A. Phillips, R. N. Uma, Joel Wein
1999 B conf
ICTAI
Je-Ho Park, Vinay Kanitkar, Alex Delis, R. N. Uma
1998 A* conf
SODA
Martin W. P. Savelsbergh, R. N. Uma, Joel Wein
1998 B conf
IPCO
R. N. Uma, Joel Wein
1998 A conf
ESA
Daniel W. Engels, David R. Karger, Stavros G. Kolliopoulos, Sudipta Sengupta, R. N. Uma, Joel Wein
1996 B conf
SPAA
Susan Flynn Hummel, Jeanette P. Schmidt, R. N. Uma, Joel Wein
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 "";
        }
    }
}