Isabelle Phan

12 papers Journal 11Unranked 1
YearRankTypeTitle / Venue / Authors
2012 J jnl
Nucleic Acids Res.
Flora J. Logan-Klumpler, Nishadi De Silva, Ulrike Böhme, Matthew B. Rogers, Giles Velarde, Jacqueline A. McQuillan, Tim Carver, Martin Aslett, Christian Olsen, Sandhya Subramanian, Isabelle Phan, Carol Farris, Siddhartha Mitra, Gowthaman Ramasamy, Haiming Wang, Adrian Tivey, Andrew Jackson, Robin Houston, Julian Parkhill, Matthew T. G. Holden, Omar S. Harb, Brian P. Brunk, Peter J. Myler, David S. Roos, Mark Carrington, Deborah F. Smith, Christiane Hertz-Fowler, Matthew Berriman
2010 J jnl
Nucleic Acids Res.
Martin Aslett, Cristina Aurrecoechea, Matthew Berriman, John Brestelli, Brian P. Brunk, Mark Carrington, Daniel P. Depledge, Steve Fischer, Bindu Gajria, Xin Gao, Malcolm J. Gardner, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, Christiane Hertz-Fowler, Robin Houston, Frank Innamorato, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, Flora J. Logan, John A. Miller, Siddhartha Mitra, Peter J. Myler, Vishal Nayak, Cary Pennington, Isabelle Phan, Deborah F. Pinney, Gowthaman Ramasamy, Matthew B. Rogers, David S. Roos, Chris Ross, Dhileep Sivam, Deborah F. Smith, Ganesh Srinivasamoorthy, Christian J. Stoeckert Jr., Sandhya Subramanian, Ryan Thibodeau, Adrian Tivey, Charles Treatman, Giles Velarde, Haiming Wang
2009 J jnl
Nucleic Acids Res.
Tania Lima, Andrea H. Auchincloss, Elisabeth Coudert, Guillaume Keller, Karine Michoud, Catherine Rivoire, Virginie Bulliard, Edouard De Castro, Corinne Lachaize, Delphine Baratin, Isabelle Phan, Lydie Bougueleret, Amos Bairoch
2009 J jnl
BMC Bioinform.
Eric Jain, Amos Bairoch, Severine Duvaud, Isabelle Phan, Nicole Redaschi, Baris E. Suzek, Maria Jesus Martin, Peter B. McGarvey, Elisabeth Gasteiger
2008 J jnl
Briefings Bioinform.
Heinz Stockinger, Teresa K. Attwood, Shahid Nadeem Chohan, Richard G. Côté, Philippe Cudré-Mauroux, Laurent Falquet, Pedro L. Fernandes, Robert D. Finn, Taavi Hupponen, Eija Korpelainen, Alberto Labarga, Aurélie Laugraud, Tania Lima, Evangelos Pafilis, Marco Pagni, Steve Pettifer, Isabelle Phan, Nazim Rahman
2005 J jnl
Nucleic Acids Res.
Paul J. Kersey, Lawrence Bower, Lorna Morris, Alan Horne, Robert Petryszak, Carola Kanz, Alexander Kanapin, Ujjwal Das, Karine Michoud, Isabelle Phan, Alexandre Gattiker, Tamara Kulikova, Nadeem Faruque, Karyn Duggan, Peter McLaren, Britt Reimholz, Laurent Duret, Simon Penel, Ingmar Reuter, Rolf Apweiler
2003 J jnl
Nucleic Acids Res.
Manuela Pruess, Wolfgang Fleischmann, Alexander Kanapin, Youla Karavidopoulou, Paul J. Kersey, Evgenia V. Kriventseva, Virginie Mittard, Nicola J. Mulder, Isabelle Phan, Florence Servant, Rolf Apweiler
2003 J jnl
Nucleic Acids Res.
Brigitte Boeckmann, Amos Bairoch, Rolf Apweiler, Marie-Claude Blatter, Anne Estreicher, Elisabeth Gasteiger, Maria Jesus Martin, Karine Michoud, Claire O'Donovan, Isabelle Phan, Sandrine Pilbout, Michel Schneider
2002 J jnl
Briefings Bioinform.
Margaret Biswas, Joseph F. O'Rourke, Evelyn Camon, Gillian Fraser, Alexander Kanapin, Youla Karavidopoulou, Paul J. Kersey, Evgenia V. Kriventseva, Virginie Mittard, Nicola J. Mulder, Isabelle Phan, Florence Servant, Rolf Apweiler
2002 J jnl
Bioinform.
Alexander Kanapin, Rolf Apweiler, Margaret Biswas, Wolfgang Fleischmann, Youla Karavidopoulou, Paul J. Kersey, Evgenia V. Kriventseva, Virginie Mittard, Nicola J. Mulder, Thomas M. Oinn, Isabelle Phan, Florence Servant, Evgeni M. Zdobnov
2001 J jnl
Nucleic Acids Res.
Rolf Apweiler, Margaret Biswas, Wolfgang Fleischmann, Alexander Kanapin, Youla Karavidopoulou, Paul J. Kersey, Evgenia V. Kriventseva, Virginie Mittard, Nicola J. Mulder, Isabelle Phan, Evgeni M. Zdobnov
2000 conf
German Conference on Bioinformatics
Margaret Biswas, Rolf Apweiler, Wolfgang Fleischmann, Alexander Kanapin, Youla Karavidopoulou, Paul J. Kersey, Evgenia V. Kriventseva, Virginie Mittard, Nicola J. Mulder, Thomas M. Oinn, Isabelle Phan, Evgeni M. Zdobnov
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 "";
        }
    }
}