Oleg Davydov

48 papers A 1Journal 43Unranked 4
YearRankTypeTitle / Venue / Authors
2025 J jnl
Comput. Math. Appl.
Cesare Bracco, Oleg Davydov, Carlotta Giannelli, Alessandra Sestini
2025 J jnl
CoRR
Oleg Davydov, Anatolii Tushev
2025 J jnl
CoRR
Oleg Davydov
2025 J jnl
CoRR
Oleg Davydov, Sergei G. Solodky
2024 J jnl
CoRR
Cesare Bracco, Oleg Davydov, Carlotta Giannelli, Alessandra Sestini
2024 J jnl
CoRR
Oleg Davydov, Bruno Degli Esposti
2023 J jnl
Adv. Comput. Math.
Oleg Davydov
2023 J jnl
J. Comput. Appl. Math.
Oleg Davydov, Dang Thi Oanh, Ngo Manh Tuong
2023 J jnl
CoRR
Oleg Davydov
2022 J jnl
CoRR
Oleg Davydov, Dang Thi Oanh, Ngo Manh Tuong
2020 J jnl
CoRR
Oleg Davydov
2020 J jnl
J. Complex.
Oleg Davydov, Oleksandr Kozynenko, Dmytro S. Skorokhodov
2019 J jnl
J. Num. Math.
Andriy Sokolov, Oleg Davydov, Dmitri Kuzmin, Alexander Westermann, Stefan Turek
2019 J jnl
CoRR
Oleg Davydov
2019 J jnl
Comput. Aided Geom. Des.
Cesare Bracco, Oleg Davydov, Carlotta Giannelli, Alessandra Sestini
2019 J jnl
J. Approx. Theory
Elena E. Berdysheva, Martin D. Buhmann, Oleg Davydov
2019 J jnl
CoRR
Oleg Davydov
2018 J jnl
Numerische Mathematik
Oleg Davydov, Robert Schaback
2017 J jnl
Appl. Math. Comput.
Dang Thi Oanh, Oleg Davydov, Hoang Xuan Phu
2017 J jnl
J. Approx. Theory
Martin D. Buhmann, Oleg Davydov
2016 J jnl
Numerische Mathematik
Oleg Davydov, Robert Schaback
2016 J jnl
Comput. Aided Geom. Des.
Oleg Davydov, Georgy V. Kostin, Abid Saeed
2014 J jnl
J. Approx. Theory
Oleg Davydov, Fabien Rabarison
2014 J jnl
Math. Comput.
Oleg Davydov, Jennifer Prasiswa, Ulrich Reif
2013 J jnl
J. Comput. Appl. Math.
Oleg Davydov, Abid Saeed
2013 J jnl
J. Comput. Appl. Math.
Oleg Davydov, Wee Ping Yeo
2012 J jnl
Medical Image Anal.
Nagulan Ratnarajah, Andrew Simmons, Oleg Davydov, Ali Hojjatoleslami
2012 J jnl
J. Approx. Theory
Oleg Davydov
2012 conf
MMCS
Oleg Davydov, Wee Ping Yeo
2011 J jnl
J. Comput. Phys.
Oleg Davydov, Dang Thi Oanh
2011 J jnl
SIAM J. Sci. Comput.
Mark Ainsworth, Gaelle Andriamaro, Oleg Davydov
2011 J jnl
Comput. Math. Appl.
Oleg Davydov, Dang Thi Oanh
2011 J jnl
J. Comput. Appl. Math.
Oleg Davydov, Tim N. T. Goodman
2010 conf
MICCAI (1)
Nagulan Ratnarajah, Andrew Simmons, Oleg Davydov, Ali Hojjatoleslami
2010 J jnl
J. Comput. Appl. Math.
Oleg Davydov, Carla Manni
2010 J jnl
J. Approx. Theory
Oleg Davydov, Paul Sablonnière
2010 J jnl
J. Approx. Theory
Richard K. Beatson, Oleg Davydov, Jeremy Levesley
2010 conf
Curves and Surfaces
Oleg Davydov, Abid Saeed
2007 conf
IMA Conference on the Mathematics of Surfaces
Oleg Davydov, Larry L. Schumaker
2006 J jnl
Comput. Aided Geom. Des.
Oleg Davydov, Rossana Morandi, Alessandra Sestini
2004 J jnl
Adv. Comput. Math.
Oleg Davydov, Frank Zeilfelder
2003 J jnl
Found. Comput. Math.
Martin D. Buhmann, Oleg Davydov, Tim N. T. Goodman
2003 J jnl
SIAM J. Math. Anal.
Oleg Davydov, Pencho Petrushev
2002 J jnl
SIAM J. Numer. Anal.
Oleg Davydov, Larry L. Schumaker
2001 J jnl
J. Approx. Theory
Martin D. Buhmann, Oleg Davydov, Tim N. T. Goodman
2001 A conf
IEEE Visualization
Jörg Haber, Frank Zeilfelder, Oleg Davydov, Hans-Peter Seidel
2001 J jnl
J. Approx. Theory
Oleg Davydov
2000 J jnl
Adv. Comput. Math.
Oleg Davydov, Larry L. Schumaker
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 "";
        }
    }
}