Neda Mohammadi

35 papers Misc 4Journal 18Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Networks
Neda Mohammadi, Mehdi Kadivar, Abdollah Amirkhani
2026 J jnl
Adv. Eng. Informatics
Nanjiang Chen, Nader Naderpajouh, Wei-Ting Hong, Neda Mohammadi
2026 J jnl
J. Comput. Civ. Eng.
Xiyu Pan, Neda Mohammadi, John E. Taylor
2025 J jnl
CoRR
Zhangding Liu, Neda Mohammadi, John E. Taylor
2025 J jnl
CoRR
Zhangding Liu, Neda Mohammadi, John E. Taylor
2025 J jnl
CoRR
Zhangding Liu, Neda Mohammadi, John E. Taylor
2025 J jnl
Comput. Commun.
Neda Mohammadi, Bahram Sadeghi Bigham, Mehdi Kadivar
2025 J jnl
IEEE Trans. Veh. Technol.
Neda Mohammadi, Bahram Sadeghi Bigham, Mehdi Kadivar
2024 J jnl
IEEE Trans. Serv. Comput.
Neda Khorasani, Faeze Ramezani, Hoda Taheri, Neda Mohammadi, Parisa Khoshdel, Bahareh Taghavi, Saeid Abrishami, Abbas Rasoolzadegan
2024 J jnl
CoRR
Jennifer Whyte, Ranjith Soman, Rafael Sacks, Neda Mohammadi, Nader Naderpajouh, Wei-Ting Hong, Ghang Lee
2024 J jnl
CoRR
Xiyu Pan, Neda Mohammadi, John E. Taylor
2023 conf
BuildSys
Jiajia Xie, Christin J. Salley, Neda Mohammadi, John E. Taylor
2023 Misc conf
WSC
Christin J. Salley, Neda Mohammadi, John E. Taylor
2022 Misc conf
CSICC
Neda Mohammadi, Abbas Rasoolzadegan
2022 J jnl
J. Comput. Syst. Sci.
Mehdi Kadivar, Neda Mohammadi
2022 J jnl
Database J. Biol. Databases Curation
Shahin Ramazi, Neda Mohammadi, Abdollah Allahverdi, Elham Khalili, Parviz Abdolmaleki
2022 J jnl
Expert Syst. Appl.
Neda Mohammadi, Abbas Rasoolzadegan
2022 Misc conf
WSC
Xiyu Pan, Neda Mohammadi, John E. Taylor
2021 J jnl
CoRR
Hoda Taheri, Faeze Ramezani, Neda Mohammadi, Parisa Khoshdel, Bahareh Taghavi, Neda Khorasani, Saeid Abrishami, Abbas Rasoolzadegan
2021 conf
HICSS
Dimitri Mavrokapnidis, Neda Mohammadi, John Eric Taylor
2021 conf
HICSS
John Eric Taylor, Neda Mohammadi, Gisele Bennett
2021 J jnl
Nat. Comput. Sci.
Neda Mohammadi, John E. Taylor
2020 Misc conf
WSC
Neda Mohammadi, John E. Taylor
2020 conf
HICSS
Gisele Bennett, John E. Taylor, Neda Mohammadi
2020 conf
HICSS
Neda Mohammadi, John E. Taylor
2020 J jnl
IEEE Access
Neda Mohammadi, Mehdi Kadivar
2019 conf
BuildSys
Neda Mohammadi, John E. Taylor
2019 conf
HICSS
Neda Mohammadi, John Eric Taylor
2019 conf
HICSS
John E. Taylor, Gisele Bennett, Neda Mohammadi
2018 conf
ISCRAM
Rachel Samuels, John Eric Taylor, Neda Mohammadi
2017 J jnl
J. Inf. Technol. Constr.
Samuel J. Ferrara, Neda Mohammadi, John E. Taylor, Amy Javernick-Will
2017 conf
SSCI
Neda Mohammadi, John E. Taylor
2017 conf
ISCRAM
Neda Mohammadi, John E. Taylor, Ryan M. Pollyea
2017 conf
HICSS
Neda Mohammadi, John E. Taylor, Yan Wang
2011 conf
WCIT
Neda Mohammadi, Vahid Ghorbani, Farideh Hamidi
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 "";
        }
    }
}