Varsha Apte

40 papers A* 3A 3B 9C 2Misc 5Journal 5Unranked 12
YearRankTypeTitle / Venue / Authors
2025 A conf
ICPC
Jayant Havare, Varsha Apte, Kaushikraj Maharajan, Nithin Chandra Gupta Samudrala, Ganesh Ramakrishnan, Srikanth Tamilselvam, Sainath Vavilapalli
2025 J jnl
CoRR
Jayant Havare, Srikanth Tamilselvam, Ashish R. Mittal, Shalaka Thorat, Soham Jadia, Varsha Apte, Ganesh Ramakrishnan
2025 conf
SIGCSE (1)
Goda Nagakalyani, Saurav Chaudhary, Varsha Apte, Ganesh Ramakrishnan, Srikanth Tamilselvam
2025 conf
SIGCSE (2)
Goda Nagakalyani, Saurav Chaudhary, Varsha Apte, Ganesh Ramakrishnan
2023 Misc conf
COMSNETS
Chaitanya Varma, Varsha Apte
2022 A conf
ICPC
Pranshu Chourasia, Ganesh Ramakrishnan, Varsha Apte, Suraj Kumar
2019 conf
ICPE Companion
Varsha Apte
2019 ed.
ICPE Companion
Varsha Apte, Antinisca Di Marco, Marin Litoiu, José Merseguer
2019 B ed.
ICPE
Varsha Apte, Antinisca Di Marco, Marin Litoiu, José Merseguer
2017 B conf
ICPE
Varsha Apte, T. V. S. Viswanath, Devidas Gawali, Akhilesh Kommireddy, Anshul Gupta
2017 conf
ICPE Companion
Varsha Apte
2016 Misc conf
ICDCN
Anshu Yadav, Varsha Apte
2016 C conf
ICCE
Kannan M. Moudgalya, Kiran L. N. Eranki, Sohinee Ganguly, Varsha Apte
2016 conf
ICPE Companion
Subhasri Duttagupta, Mukund Kumar, Varsha Apte
2016 conf
QUDOS@ISSTA
Devidas Gawali, Varsha Apte
2014 conf
VALUETOOLS
Varsha Apte, T. V. Nadeesh
2014 B conf
ICPE
Varsha Apte, Bhavin Doshi
2013 A conf
ISSRE
Gangadhar Enagandula, Varsha Apte, Bipul Raj
2010 Misc conf
COMSNETS
Kuriakose Mathew, Purushottam Kulkarni, Varsha Apte
2009 B conf
IWQoS
Vipul Mathur, Preetam Patil, Varsha Apte, Kannan M. Moudgalya
2009 J jnl
J. Syst. Softw.
Vipul Mathur, Varsha Apte
2009 B conf
LCN
Preetam Patil, Vipul Mathur, Varsha Apte, Kannan M. Moudgalya
2009 B conf
WCNC
Yogesh Ashok Powar, Varsha Apte
2009 A* conf
WWW
Vipul Mathur, Sanket Dhopeshwarkar, Varsha Apte
2008 conf
WOSP
Akhila Deshpande, Varsha Apte, Supriya Marathe
2007 Misc conf
HiPC
Rukma Prabhu Verlekar, Varsha Apte
2007 J jnl
CoRR
Preetam Patil, Varsha Apte
2007 C conf
QSHINE
Preetam Patil, Varsha Apte
2007 conf
WOSP
Vipul Mathur, Varsha Apte
2007 A* conf
WWW
Shrirang Sudhir Shirodkar, Varsha Apte
2007 B conf
MASCOTS
Rukma Prabhu Verlekar, Varsha Apte, Prakhar Goyal, Bhavish Agarwal
2007 conf
WICSA
Varsha Apte
2006 J jnl
CoRR
Naresh Singhmar, Vipul Mathur, Varsha Apte, D. Manjunath
2006 conf
COMSWARE
Shourya P. Bhattacharya, Varsha Apte
2006 A* conf
ICSE
Rukma Prabhu Verlekar, Varsha Apte
2006 B conf
WCNC
Raman Kumar K., Varsha Apte, Yogesh Ashok Powar
2005 Misc conf
ICDCIT
B. Nagaprabhanjan, Varsha Apte
2005 conf
WMASH
Preetam Patil, Varsha Apte
2004 B conf
MASCOTS
Vipul Mathur, Varsha Apte
2003 J jnl
Comput. Commun.
Varsha Apte, Tony Hansen, Paul Reeser
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 "";
        }
    }
}