Oleg Fryazinov

49 papers A* 2C 1Journal 19Unranked 25
YearRankTypeTitle / Venue / Authors
2022 conf
EVA
Tahmeena Javaid Adeel, Rehan Zia, Oleg Fryazinov
2022 conf
GCH
Ana-Maria-Cristina Ureche, Oleg Fryazinov, Eike Falk Anderson
2021 J jnl
Graph. Model.
Alexander Tereshin, Alexander A. Pasko, Oleg Fryazinov, Valery Adzhiev
2021 conf
GCH
Eike Falk Anderson, Valery Adzhiev, Oleg Fryazinov
2020 J jnl
SIAM J. Imaging Sci.
Alexander Tereshin, Valery Adzhiev, Oleg Fryazinov, Felix Marrington-Reeve, Alexander A. Pasko
2020 J jnl
Comput. Aided Des.
Dmitry D. Popov, Evgenii Maltsev, Oleg Fryazinov, Alexander A. Pasko, Iskander Sh. Akhatov
2020 J jnl
CoRR
Alexander Tereshin, Alexander A. Pasko, Oleg Fryazinov, Valery Adzhiev
2020 conf
VISIGRAPP (3: IVAPP)
Eugeniya Malikova, Valery Adzhiev, Oleg Fryazinov, Alexander A. Pasko
2019 conf
SIGGRAPH Posters
Laura Mann, Oleg Fryazinov
2019 conf
Eurographics (Short Papers)
Alexander Tereshin, Valery Adzhiev, Oleg Fryazinov, Alexander A. Pasko
2019 conf
Eurographics (Posters)
Eugeniya Malikova, Valery Adzhiev, Oleg Fryazinov, Alexander A. Pasko
2018 J jnl
Comput. Graph. Forum
Beatriz Sousa Santos, Jean-Michel Dischler, Valery Adzhiev, Eike Falk Anderson, Andrej Ferko, Oleg Fryazinov, Martin Ilcík, Ivana Ilcíková, Pavel Slavík, Veronica Sundstedt, Lucie Svobodova, Michael Wimmer, Jiri Zara
2017 conf
SIGGRAPH Posters
Teemu Lindborg, Philip Gifford, Oleg Fryazinov
2017 conf
Eurographics (Short Papers)
Fabio Turchet, Oleg Fryazinov, Sara C. Schvartzman
2016 conf
Eurographics (Education Papers)
Eike Falk Anderson, Valery Adzhiev, Oleg Fryazinov
2016 conf
GraDiFab@Eurographics
Neena Michalik, Oleg Fryazinov
2016 conf
SIGGRAPH Posters
Fabio Turchet, Marco Romeo, Oleg Fryazinov
2016 J jnl
IEEE Computer Graphics and Applications
Leigh McLoughlin, Oleg Fryazinov, Mark Moseley, Mathieu Sanchez, Valery Adzhiev, Peter Comninos, Alexander A. Pasko
2015 J jnl
Comput. Graph. Forum
Mathieu Sanchez, Oleg Fryazinov, Pierre-Alain Fayolle, Alexander A. Pasko
2015 conf
CVMP
Fabio Turchet, Oleg Fryazinov, Marco Romeo
2015 conf
SIGGRAPH Posters
Benjamin Knowles, Oleg Fryazinov
2015 conf
SIGGRAPH Asia Posters
Fabio Turchet, Oleg Fryazinov, Marco Romeo
2015 conf
SIGRAD
Jaime A. Losada, Eike Falk Anderson, Oleg Fryazinov
2015 J jnl
Comput. Aided Des.
Oleg Fryazinov, Alexander A. Pasko
2015 J jnl
Comput. Graph.
Oleg Fryazinov, Mathieu Sanchez, Alexander A. Pasko
2015 J jnl
IEEE Trans. Vis. Comput. Graph.
Mathieu Sanchez, Oleg Fryazinov, Valery Adzhiev, Peter Comninos, Alexander A. Pasko
2014 J jnl
Comput. Graph. Forum
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2014 C conf
ICCE
Leigh McLoughlin, Oleg Fryazinov, Mark Moseley, Mathieu Sanchez, Valery Adzhiev, Peter Comninos, Alexander A. Pasko
2013 J jnl
Comput. Graph.
Mathieu Sanchez, Oleg Fryazinov, Turlif Vilbrandt, Alexander A. Pasko
2013 J jnl
Comput. Aided Des.
Oleg Fryazinov, Turlif Vilbrandt, Alexander A. Pasko
2013 conf
Eurographics (Posters)
Oleg Fryazinov, Mathieu Sanchez, Valery Adzhiev, Alexander A. Pasko
2012 conf
SCCG
Mathieu Sanchez, Oleg Fryazinov, Alexander A. Pasko
2011 conf
VS-GAMES
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2011 J jnl
Comput. Aided Des.
Oleg Fryazinov, Alexander A. Pasko, Valery Adzhiev
2011 J jnl
Comput. Graph.
Oleg Fryazinov, Pierre-Alain Fayolle, Turlif Vilbrandt, Galina Pasko, Alexander A. Pasko
2011 J jnl
Graph. Model.
Alexander A. Pasko, Oleg Fryazinov, Turlif Vilbrandt, Pierre-Alain Fayolle, Valery Adzhiev
2010 A* conf
SIGGRAPH ASIA (Posters)
Galina Pasko, Turlif Vilbrandt, Oleg Fryazinov, Alexander A. Pasko
2010 conf
SIGGRAPH Posters
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2010 J jnl
Comput. Graph. Forum
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2010 conf
GRAPP
Oleg Fryazinov, Alexander A. Pasko, Peter Comninos
2010 J jnl
Comput. Graph.
Oleg Fryazinov, Alexander A. Pasko, Peter Comninos
2010 ch.
GPU Pro
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2010 conf
Shape Modeling International
Alexander A. Pasko, Turlif Vilbrandt, Oleg Fryazinov, Valery Adzhiev
2010 A* conf
SIGGRAPH ASIA (Sketches)
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2009 conf
Shape Modeling International
Oleg Fryazinov, Alexander A. Pasko, Valery Adzhiev
2009 conf
SIGGRAPH Posters
Denis Kravtsov, Oleg Fryazinov, Valery Adzhiev, Alexander A. Pasko, Peter Comninos
2008 ch.
Heterogeneous Objects Modelling and Applications
Elena Kartasheva, Valery Adzhiev, Peter Comninos, Oleg Fryazinov, Alexander A. Pasko
2003 conf
Symposium on Solid Modeling and Applications
Elena L. Kartasheva, Valery Adzhiev, Alexander A. Pasko, Oleg Fryazinov, Vladimir A. Gasilov
2003 J jnl
J. Comput. Inf. Sci. Eng.
Elena L. Kartasheva, Valery Adzhiev, Alexander A. Pasko, Oleg Fryazinov, Vladimir A. Gasilov
redb/extractors/decompiler/_archive/GhidraDecompilerScript-v2.java
← Index redb/extractors/decompiler/_archive/GhidraDecompilerScript-v2.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 {
        System.err.println("{\"debug\": \"Script starting\"}");

        // 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];

        // Add debug output after setup
        System.err.println("{\"debug\": \"Processing file: " + 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);
        }

        System.err.println("{\"debug\": \"Preparing final 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) {
        try {
            Address entry = function.getEntryPoint();
            String functionName = function.getName();
            String functionAddress = entry.toString();

            // Process each analysis type independently
            boolean hasAnyResults = false;

            try {
                if (processDecompiledCode(function, output.getJSONArray("decompiled"),
                                        functionName, functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"Decompilation failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            try {
                if (processDisassembledCode(function, output.getJSONArray("disassembled"),
                                        functionName, functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"Disassembly failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            try {
                if (processCFG(function, output.getJSONArray("cfg"), functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"CFG extraction failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            if (!hasAnyResults) {
                System.err.println(String.format(
                    "{\"warning\": \"No results obtained for function %s\"}",
                    functionName));
            }

        } catch (Exception e) {
            System.err.println(String.format(
                "{\"error\": \"Failed to process function: %s\"}",
                e.getMessage().replace("\"", "'")));
        }
    }

    private boolean processDecompiledCode(Function function, JSONArray decompArray,
                                        String functionName, String functionAddress) {
        try {
            DecompileResults results = decompInterface.decompileFunction(function, 30, monitor);
            if (results == null || !results.decompileCompleted()) {
                System.err.println(String.format(
                    "{\"warning\": \"Decompilation incomplete for function %s\"}",
                    functionName));
                return false;
            }

            String decompiledCode = results.getDecompiledFunction().getC();
            if (decompiledCode == null || decompiledCode.trim().isEmpty()) {
                System.err.println(String.format(
                    "{\"warning\": \"Empty decompilation result for function %s\"}",
                    functionName));
                return false;
            }

            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);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("Decompilation error: " + e.getMessage(), e);
        }
    }

    private boolean processDisassembledCode(Function function, JSONArray disasmArray,
                                        String functionName, String functionAddress) {
        try {
            StringBuilder disassembly = new StringBuilder();
            StringBuilder normalized = new StringBuilder();
            int instructionCount = 0;
            boolean hasValidInstructions = false;

            Listing listing = currentProgram.getListing();
            AddressSetView functionBody = function.getBody();
            InstructionIterator instructions = listing.getInstructions(functionBody, true);

            while (instructions.hasNext()) {
                try {
                    Instruction instr = instructions.next();
                    if (instr != null) {
                        String disasmLine = instr.toString();
                        if (disasmLine != null && !disasmLine.trim().isEmpty()) {
                            disassembly.append(disasmLine).append("\n");
                            normalized.append(normalizeInstruction(disasmLine)).append("\n");
                            instructionCount++;
                            hasValidInstructions = true;
                        }
                    }
                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid instruction in %s: %s\"}",
                        functionName, e.getMessage().replace("\"", "'")));
                }
            }

            if (!hasValidInstructions) {
                System.err.println(String.format(
                    "{\"warning\": \"No valid instructions found in function %s\"}",
                    functionName));
                return false;
            }

            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);

            // Initialize similarity fields as null
            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);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("Disassembly error: " + e.getMessage(), e);
        }
    }

    private boolean processCFG(Function function, JSONArray cfgArray, String functionAddress) {
        try {
            CodeBlockIterator blocks = basicBlockModel.getCodeBlocksContaining(
                function.getBody(), monitor);

            boolean hasValidBlocks = false;

            while (blocks.hasNext()) {
                try {
                    CodeBlock block = blocks.next();
                    String blockInstructions = getBlockInstructions(block);

                    if (blockInstructions == null || blockInstructions.trim().isEmpty()) {
                        continue;
                    }

                    String blockId = calculateHash(blockInstructions);

                    JSONObject blockObj = new JSONObject();
                    blockObj.put("block_id", blockId);
                    blockObj.put("function_address", functionAddress);
                    blockObj.put("block_instructions", blockInstructions);

                    // Process successors with error handling
                    JSONArray successorAddresses = new JSONArray();
                    try {
                        CodeBlockReferenceIterator successors = block.getDestinations(monitor);
                        while (successors.hasNext()) {
                            try {
                                CodeBlockReference ref = successors.next();
                                if (ref != null && ref.getDestinationAddress() != null) {
                                    successorAddresses.put(ref.getDestinationAddress().toString());
                                }
                            } catch (Exception e) {
                                System.err.println(String.format(
                                    "{\"warning\": \"Skipped invalid successor in block %s: %s\"}",
                                    blockId, e.getMessage().replace("\"", "'")));
                            }
                        }
                    } catch (Exception e) {
                        System.err.println(String.format(
                            "{\"warning\": \"Error processing successors for block %s: %s\"}",
                            blockId, e.getMessage().replace("\"", "'")));
                    }

                    blockObj.put("successor_blocks", successorAddresses);
                    cfgArray.put(blockObj);
                    hasValidBlocks = true;

                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid block in function %s: %s\"}",
                        functionAddress, e.getMessage().replace("\"", "'")));
                }
            }

            return hasValidBlocks;

        } catch (Exception e) {
            throw new RuntimeException("CFG extraction error: " + e.getMessage(), e);
        }
    }

    private String getBlockInstructions(CodeBlock block) {
        StringBuilder instructions = new StringBuilder();
        try {
            AddressIterator addresses = block.getAddresses(true);
            while (addresses.hasNext()) {
                try {
                    Address addr = addresses.next();
                    if (addr != null) {
                        Instruction instr = currentProgram.getListing().getInstructionAt(addr);
                        if (instr != null) {
                            instructions.append(instr.toString()).append("\n");
                        }
                    }
                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid instruction at address %s: %s\"}",
                        addresses.next(), e.getMessage().replace("\"", "'")));
                }
            }
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"warning\": \"Error getting block instructions: %s\"}",
                e.getMessage().replace("\"", "'")));
        }
        return instructions.toString();
    }

    private String normalizeInstruction(String instruction) {
        try {
            if (instruction == null || instruction.trim().isEmpty()) {
                return "";
            }
            return instruction.replaceAll("0x[0-9a-fA-F]+", "IMM")
                            .replaceAll("\\b\\d+\\b", "NUM")
                            .replaceAll("[\\[\\]\\+\\-\\*/%&|^]+", "_OP_");
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"warning\": \"Error normalizing instruction: %s\"}",
                e.getMessage().replace("\"", "'")));
            return instruction;
        }
    }

    private String calculateHash(String content) {
        try {
            if (content == null || content.trim().isEmpty()) {
                return "";
            }
            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(String.format(
                "{\"error\": \"Error calculating hash: %s\"}",
                e.getMessage().replace("\"", "'")));
            return "";
        }
    }
}