Nadezhda Shchegoleva

24 papers Misc 1Journal 1Unranked 22
YearRankTypeTitle / Venue / Authors
2025 conf
ICCSA (Workshops 9)
Nadezhda Shchegoleva, Nadezhda Pronina, Nataliya Zalutskaya, Jasur Kiyamov
2025 conf
ICCSA (Workshops 9)
Evgeniy Ibatullin, Valery Khvatov, Alexander V. Bogdanov, Nadezhda Shchegoleva
2025 conf
ICCSA (Workshops 9)
Nadezhda Shchegoleva, Petr Tonka, Natalia Zalutskaya
2025 conf
ICCSA (Workshops 9)
Nadezhda Shchegoleva, Maria Gladkaya, Gennady Dik
2024 conf
ICCSA (Workshops 7)
Gennady Dik, Alexander V. Bogdanov, Nadezhda Shchegoleva, Aleksandr Dik, Jasur Kiyamov
2024 conf
ICCSA (Workshops 7)
Alexander V. Bogdanov, Nadezhda Shchegoleva, Nataliya Zalutskaya
2024 conf
ICCSA (Workshops 1)
Alexander V. Bogdanov, Nadezhda Shchegoleva, Valery Khvatov, Jasur Kiyamov, Gennady Dik, Ilkhom Rakhmatullayev, Shakhboz Ergashev, Oybek Umurzakov
2024 conf
ICCSA (Workshops 1)
Alexander V. Bogdanov, Valery Khvatov, Alexei Uteshev, Nadezhda Shchegoleva
2023 conf
ICCSA (Workshops 6)
Alexander V. Bogdanov, Nadezhda Shchegoleva, Valery Khvatov, Gennady Dik, Jasur Kiyamov, Aleksandr Dik
2023 conf
ICCSA (Workshops 6)
Gennady Dik, Alexander V. Bogdanov, Nadezhda Shchegoleva, Jasur Kiyamov, Aleksandr Dik
2023 conf
ICCSA (Workshops 1)
Alexander V. Bogdanov, Nadezhda Shchegoleva, Valery Khvatov, Gennady Dik, Jasur Kiyamov, Aleksandr Dik
2022 conf
ICCSA (Workshops 4)
Alexander V. Bogdanov, Nadezhda Shchegoleva, Gennady Dik, Valery Khvatov, Aleksandr Dik
2022 conf
ICCSA (Workshops 1)
Alexander V. Bogdanov, Alexander B. Degtyarev, Nadezhda Shchegoleva, Vladimir Korkhov, Valery Khvatov, Nodir Zaynalov, Jasur Kiyamov, Aleksandr Dik
2022 J jnl
Comput.
Gennady Dik, Alexander V. Bogdanov, Nadezhda Shchegoleva, Aleksandr Dik, Jasur Kiyamov
2022 conf
ICCSA (Workshops 4)
Nadezhda Shchegoleva, Natalia Zalutskaya, Alina Dambaeva, Jasur Kiyamov, Aleksandr Dik
2021 conf
MECO
Georgy Kukharev, Nazym Kazieva, Nadezhda Shchegoleva
2021 conf
ICCSA (8)
Alexander V. Bogdanov, Alexander B. Degtyarev, Nadezhda Shchegoleva, Vladimir Korkhov, Valery Khvatov, Nodir Zaynalov, Jasur Kiyamov, Aleksandr Dik, Anar Faradzhov
2021 conf
ICCSA (4)
Alexander V. Bogdanov, Nadezhda Shchegoleva, Vladimir Korkhov, Valery Khvatov, Nodir Zaynalov, Jasur Kiyamov, Aleksandr Dik, Anar Faradzhov
2020 conf
ICCSA (3)
Alexander V. Bogdanov, Alexander B. Degtyarev, Alexei Yu. Uteshev, Nadezhda Shchegoleva, Valery Khvatov, Mikhail Zvyagintsev
2020 conf
ICCSA (3)
Alexander V. Bogdanov, Alexander B. Degtyarev, Nadezhda Shchegoleva, Valery Khvatov
2020 conf
ICCSA (6)
Alexander V. Bogdanov, Alexander B. Degtyarev, Nadezhda Shchegoleva, Valery Khvatov, Vladimir Korkhov
2018 conf
ICCSA (4)
David Grigoryan, Avetik Muradov, Serob Balyan, Suren Abrahamyan, Armine Katvalyan, Vladimir Korkhov, Oleg Iakushkin, Natalia V. Kulabukhova, Nadezhda Shchegoleva
2014 Misc conf
AIST
Georgy Kukharev, Yuri Matveev, Nadezhda Shchegoleva
2013 conf
ICIAP (1)
Pawel Forczmanski, Georgy Kukharev, Nadezhda Shchegoleva
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 "";
        }
    }
}