Oleg Gusikhin

59 papers C 21Misc 1Journal 5Unranked 8
YearRankTypeTitle / Venue / Authors
2025 ed.
DeLTA
Allel Hadjali, Emanuele Maiorana, Oleg Gusikhin, Carlo Sansone
2025 C ed.
VEHITS
Jeroen Ploeg, Oleg Gusikhin, Karsten Berns
2024 J jnl
SN Comput. Sci.
Harry H. Beyel, Omar Makke, Mahsa Pourbafrani, Oleg Gusikhin, Wil M. P. van der Aalst
2024 ed.
DeLTA (1)
Ana Fred, Allel Hadjali, Oleg Gusikhin, Carlo Sansone
2024 ed.
DeLTA (2)
Ana Fred, Allel Hadjali, Oleg Gusikhin, Carlo Sansone
2024 J jnl
CoRR
Bach Do Viet, Xingyu Li, Chaoye Pan, Oleg Gusikhin
2024 C conf
DATA
Omar Makke, Syam Chand, Vamsee Krishna Batchu, Oleg Gusikhin, Vicky Svidenko
2024 C ed.
VEHITS
Alexey Vinel, Karsten Berns, Jeroen Ploeg, Oleg Gusikhin
2024 C ed.
DATA
Alfredo Cuzzocrea, Elhadj Benkhelifa, Oleg Gusikhin, Slimane Hammoudi
2023 conf
Business Process Management Workshops
Harry H. Beyel, Omar Makke, Oleg Gusikhin, Wil M. P. van der Aalst
2023 C conf
DATA
Harry H. Beyel, Omar Makke, Fangbo Yuan, Oleg Gusikhin, Wil M. P. van der Aalst
2023 ed.
DATA (Revised Selected Papers)
Alfredo Cuzzocrea, Oleg Gusikhin, Slimane Hammoudi, Christoph Quix
2023 ed.
DeLTA
Donatello Conte, Ana Fred, Oleg Gusikhin, Carlo Sansone
2023 ed.
DeLTA (Selected Papers)
Ana Fred, Carlo Sansone, Oleg Gusikhin, Kurosh Madani
2023 ed.
IN4PL
Sergio Terzi, Kurosh Madani, Oleg Gusikhin, Hervé Panetto
2023 C ed.
DATA
Oleg Gusikhin, Slimane Hammoudi, Alfredo Cuzzocrea
2023 C ed.
VEHITS
Alexey Vinel, Jeroen Ploeg, Karsten Berns, Oleg Gusikhin
2023 ed.
SMARTGREENS/VEHITS (Selected Papers)
Cornel Klein, Matthias Jarke, Jeroen Ploeg, Markus Helfert, Karsten Berns, Oleg Gusikhin
2023 conf
MOST
Trung Bach Tran, Ilya V. Kolmanovsky, Erik Biberstein, Omar Makke, Marina Tharayil, Oleg Gusikhin
2022 conf
IN4PL
Oleg Gusikhin
2022 ed.
ICINCO (Selected Papers)
Oleg Gusikhin, Kurosh Madani, Janan Zaytoon
2022 C conf
ACC
Tariq Samad, Daniel Y. Abramovitch, Michael Lees, Iven Mareels, R. Russell Rhinehart, Francesco Cuzzola, Benny Grosman, Oleg Gusikhin, Esko Juuso, Bhagyesh V. Patil, Stefan Pickl
2022 C ed.
DATA
Alfredo Cuzzocrea, Oleg Gusikhin, Wil M. P. van der Aalst, Slimane Hammoudi
2022 ed.
DeLTA
Ana Fred, Carlo Sansone, Oleg Gusikhin, Kurosh Madani
2022 C ed.
VEHITS
Jeroen Ploeg, Markus Helfert, Karsten Berns, Oleg Gusikhin
2022 ed.
SMARTGREENS/VEHITS (Selected Papers)
Cornel Klein, Matthias Jarke, Markus Helfert, Karsten Berns, Oleg Gusikhin
2021 C ed.
ICINCO
Oleg Gusikhin, Henk Nijmeijer, Kurosh Madani
2021 C ed.
VEHITS
Karsten Berns, Markus Helfert, Oleg Gusikhin
2021 ed.
SMARTGREENS/VEHITS (Selected Papers)
Markus Helfert, Cornel Klein, Brian Donnellan, Oleg Gusikhin
2020 ed.
ICINCO (Selected Papers)
Oleg Gusikhin, Kurosh Madani
2020 ed.
ICINCO (Selected Papers)
Oleg Gusikhin, Kurosh Madani
2020 C conf
VEHITS
Omar Makke, Oleg Gusikhin
2020 C ed.
ICINCO
Oleg Gusikhin, Kurosh Madani, Janan Zaytoon
2020 C ed.
VEHITS
Karsten Berns, Markus Helfert, Oleg Gusikhin
2019 C conf
VEHITS
Alexander V. Smirnov, Alexey M. Kashevnik, Nikolay Shilov, Sergei Mikhailov, Oleg Gusikhin, Harry Martinez
2019 ed.
ICINCO (1)
Oleg Gusikhin, Kurosh Madani, Janan Zaytoon
2019 ed.
ICINCO (2)
Oleg Gusikhin, Kurosh Madani, Janan Zaytoon
2019 C ed.
VEHITS
Oleg Gusikhin, Markus Helfert
2019 ed.
SMARTGREENS/VEHITS (Selected Papers)
Brian Donnellan, Cornel Klein, Markus Helfert, Oleg Gusikhin
2019 J jnl
CoRR
Ehsan Taheri, Ilya V. Kolmanovsky, Oleg Gusikhin
2018 C conf
VEHITS
Shengzhi Zhang, Omar Makke, Oleg Gusikhin, Ayush Shah, Athanasios V. Vasilakos
2018 C conf
VEHITS
Oleg Gusikhin, Ayush Shah, Omar Makke, Alexander V. Smirnov, Nikolay Shilov
2018 ed.
ICINCO (Selected Papers)
Kurosh Madani, Dimitri Peaucelle, Oleg Gusikhin
2018 ed.
ICINCO (1)
Kurosh Madani, Oleg Gusikhin
2018 ed.
ICINCO (2)
Kurosh Madani, Oleg Gusikhin
2018 C ed.
VEHITS
Markus Helfert, Oleg Gusikhin
2017 Misc conf
CogSIMA
Alexander V. Smirnov, Nikolay Shilov, Oleg Gusikhin
2017 ed.
ICINCO (1)
Oleg Gusikhin, Kurosh Madani
2017 ed.
ICINCO (2)
Oleg Gusikhin, Kurosh Madani
2016 conf
NEW2AN
Alexander V. Smirnov, Nikolay Shilov, Oleg Gusikhin
2016 ed.
ICINCO (1)
Oleg Gusikhin, Dimitri Peaucelle, Kurosh Madani
2016 ed.
ICINCO (2)
Oleg Gusikhin, Dimitri Peaucelle, Kurosh Madani
2016 conf
ICINCO (1)
Oleg Gusikhin, Omar Makke, Jeffrey Yeung, Perry MacNeille
2015 C conf
VEHITS
Fei Peng, Amy Mainville Cohn, Oleg Gusikhin, David Perner
2015 J jnl
Interfaces
David Simchi-Levi, William Schmidt, Yehua Wei, Peter Yun Zhang, Keith Combs, Yao Ge, Oleg Gusikhin, Michael Sanders, Don Zhang
2015 conf
SMARTGREENS/VEHITS (Selected Papers)
Fei Peng, Amy Mainville Cohn, Oleg Gusikhin, David Perner
2015 J jnl
IEEE Commun. Mag.
Alexey V. Vinel, Henrik Pettersson, Lin Lan, Onur Altintas, Oleg Gusikhin
2014 conf
ICINCO (Selected Papers)
Joaquim Filipe, Oleg Gusikhin, Kurosh Madani, Jurek Z. Sasiadek
2010 conf
ICINCO (Selected Papers)
Oleg Gusikhin, Erica Klampfl, Dimitar P. Filev, Yifan Chen
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 "";
        }
    }
}