Viacheslav Wolfengagen

49 papers C 2Journal 14Unranked 33
YearRankTypeTitle / Venue / Authors
2025 J jnl
Cogn. Syst. Res.
Viacheslav Wolfengagen, Larissa Ismailova, Sergey Kosikov
2024 J jnl
Cogn. Syst. Res.
Viacheslav Wolfengagen, Larissa Ismailova, Sergey Kosikov
2024 J jnl
Cogn. Syst. Res.
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov
2024 J jnl
Cogn. Syst. Res.
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov, Igor O. Slieptsov, Sebastian Dohrn, Alexander Marenkov, Vladislav Zaytsev
2023 J jnl
Cogn. Syst. Res.
Larissa Ismailova, Viacheslav Wolfengagen, Sergey Kosikov, Sergey I. Andronov
2022 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2022 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2022 J jnl
Cogn. Syst. Res.
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov
2022 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2022 conf
BICA*AI
Igor O. Slieptsov, Viacheslav Wolfengagen, Sergey Kosikov
2022 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2022 J jnl
Cogn. Syst. Res.
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2021 J jnl
Cogn. Syst. Res.
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov, Denis Babushkin
2020 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2020 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2020 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2020 conf
BICA*AI
Sergey Kosikov, Larisa Y. Ismailova, Viacheslav Wolfengagen
2020 conf
BICA*AI
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2020 conf
BICA*AI
Larisa Y. Ismailova, Sergey Kosikov, Viacheslav Wolfengagen
2019 conf
BICA
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov
2019 conf
BICA
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov, Igor Volkov
2019 conf
BICA
Sergey Kosikov, Larisa Y. Ismailova, Viacheslav Wolfengagen
2019 conf
BICA
Larisa Y. Ismailova, Sergey Kosikov, Konstantin Zinchenko, Viacheslav Wolfengagen
2019 conf
BICA
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov, Irina Parfenova
2019 conf
BICA
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov, Mikhail Maslov
2019 conf
BICA
Viacheslav Wolfengagen, Melanie Dohrn
2017 conf
BICA
Larisa Y. Ismailova, Viacheslav Wolfengagen, Sergey Kosikov
2017 conf
BICA
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov, Ilya A. Nikulin, Irina A. Parfenova, Viktor A. Kcholodov
2017 conf
BICA
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov
2017 conf
BICA
Viacheslav Wolfengagen, Sergey Kosikov, Larisa Y. Ismailova, Irina A. Aleksandrova, Anatoly E. Zaytsev
2017 conf
BICA
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov
2016 conf
BICA
Larissa Ismailova, Sergey Kosikov, Viacheslav Wolfengagen
2016 conf
BICA
Viacheslav Wolfengagen, Larissa Ismailova, Sergey Kosikov
2016 conf
BICA
Viacheslav Wolfengagen, Larissa Ismailova, Sergey Kosikov
2016 conf
BICA
Viacheslav Wolfengagen, Larissa Ismailova, Sergey Kosikov, Viacheslav V. Navrotskiy, Sergey I. Kukalev, Alexander A. Zuev, Polina V. Belyatskaya
2016 conf
BICA
Viacheslav Wolfengagen, Larisa Y. Ismailova, Sergey Kosikov, Irina Parfenova, Mikhail Yu. Ermak, Vasiliy D. Petrov, Ilya A. Nikulin, Victor A. Kholodov
2015 conf
S-BPM ONE
Pavel Shapkin, Alexander Marenkov, Leonid Shumsky, Vladimir Roslovtsev, Viacheslav Wolfengagen
2014 conf
ICEIS (2)
Leonid Shumsky, Vladimir Roslovtsev, Viacheslav Wolfengagen
2014 conf
ICE-B
Leonid Shumsky, Pavel Shapkin, Viacheslav Wolfengagen
2013 conf
ICEIS (2)
Viacheslav Wolfengagen, Vladimir Roslovtsev, Leonid Shumsky, Artyom Bohulenkov, Artyom Sakhatskiy
2010 C conf
CIS
Viacheslav Wolfengagen
2004 C conf
iiWAS
Viacheslav Wolfengagen
2001 J jnl
CoRR
Viacheslav Wolfengagen
2001 J jnl
CoRR
Viacheslav Wolfengagen
2001 J jnl
CoRR
Viacheslav Wolfengagen
2001 J jnl
CoRR
Viacheslav Wolfengagen
2001 J jnl
CoRR
Viacheslav Wolfengagen
2001 J jnl
CoRR
Viacheslav Wolfengagen
2000 conf
WFLP
Viacheslav Wolfengagen
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 "";
        }
    }
}