Ian Rae

11 papers A* 2A 1Journal 7Unranked 1
YearRankTypeTitle / Venue / Authors
2020 J jnl
Proc. VLDB Endow.
Jiacheng Yang, Ian Rae, Jun Xu, Jeff Shute, Zhan Yuan, Kelvin Lau, Qiang Zeng, Xi Zhao, Jun Ma, Ziyang Chen, Yuan Gao, Qilin Dong, Junxiong Zhou, Jeremy Wood, Goetz Graefe, Jeffrey F. Naughton, John Cieslewicz
2018 J jnl
Proc. VLDB Endow.
Bart Samwel, John Cieslewicz, Ben Handy, Jason Govig, Petros Venetis, Chanjun Yang, Keith Peters, Jeff Shute, Daniel Tenedorio, Himani Apte, Felix Weigel, David Wilhite, Jiacheng Yang, Jun Xu, Jiexing Li, Zhan Yuan, Craig Chasseur, Qiang Zeng, Ian Rae, Anurag Biyani, Andrew Harn, Yang Xia, Andrey Gubichev, Amr El-Helw, Orri Erling, Zhepeng Yan, Mohan Yang, Yiqun Wei, Thanh Do, Colin Zheng, Goetz Graefe, Somayeh Sardashti, Ahmed M. Aly, Divy Agrawal, Ashish Gupta, Shivakumar Venkataraman
2015 A conf
CIDR
Willis Lang, Rimma V. Nehme, Ian Rae
2015 J jnl
J. Parallel Distributed Comput.
Mark G. Aartsen, Rasha U. Abbasi, Markus Ackermann, Jenni Adams, Juan Antonio Aguilar Sánchez, Markus Ahlers, David Altmann, Carlos A. Argüelles Delgado, Jan Auffenberg, Xinhua Bai, Michael F. Baker, Steven W. Barwick, Volker Baum, Ryan Bay, James J. Beatty, Julia K. Becker Tjus, Karl-Heinz Becker, Segev BenZvi, Patrick Berghaus, David Berley, Elisa Bernardini, Anna Bernhard, David Z. Besson, G. Binder, Daniel Bindig, Martin Bissok, Erik Blaufuss, Jan Blumenthal, David J. Boersma, Christian Bohm, Debanjan Bose, Sebastian Böser, Olga Botner, Lionel Brayeur, Hans-Peter Bretz, Anthony M. Brown, Ronald Bruijn, James Casey, Martin Casier, Dmitry Chirkin, Asen Christov, Brian John Christy, Ken Clark, Lew Classen, Fabian Clevermann, Stefan Coenders, Shirit Cohen, Doug F. Cowen, Angel H. Cruz Silva, Matthias Danninger, Jacob Daughhetee, James C. Davis, Melanie Day, Catherine De Clercq, Sam De Ridder, Paolo Desiati, Krijn D. de Vries, Meike de With, Tyce DeYoung, Juan Carlos Díaz-Vélez, Matthew Dunkman, Ryan Eagan, Benjamin Eberhardt, Björn Eichmann, Jonathan Eisch, Sebastian Euler, Paul A. Evenson, Oladipo O. Fadiran, Ali R. Fazely, Anatoli Fedynitch, Jacob Feintzeig, Tom Feusels, Kirill Filimonov, Chad Finley, Tobias Fischer-Wasels, Samuel Flis, Anna Franckowiak, Katharina Frantzen, Tomasz Fuchs, Thomas K. Gaisser, Joseph S. Gallagher, Lisa Marie Gerhardt, Laura E. Gladstone, Thorsten Glüsenkamp, Azriel Goldschmidt, Geraldina Golup, Javier G. González, Jordan A. Goodman, Dariusz Góra, Dylan T. Grandmont, Darren Grant, Pavel Gretskov, John C. Groh, Andreas Groß, Chang Hyon Ha, Abd Al Karim Haj Ismail, Patrick Hallen, Allan Hallgren, Francis Halzen, Kael D. Hanson, Dustin Hebecker, David Heereman, Dirk Heinen, Klaus Helbing, Robert Eugene Hellauer III, Stephanie Virginia Hickford, Gary C. Hill, Kara D. Hoffman, Ruth Hoffmann, Andreas Homeier, Kotoyo Hoshina, Feifei Huang, Warren Huelsnitz, Per Olof Hulth, Klas Hultqvist, Shahid Hussain, Aya Ishihara, Emanuel Jacobi, John E. Jacobsen, Kai Jagielski, George S. Japaridze, Kyle Jero, Ola Jlelati, Basho Kaminsky, Alexander Kappes, Timo Karg, Albrecht Karle, Matthew Kauer, John Lawrence Kelley, Joanna Kiryluk, J. Kläs, Spencer R. Klein, Jan-Hendrik Köhne, Georges Kohnen, Hermann Kolanoski, Lutz Köpke, Claudio Kopper, Sandro Kopper, D. Jason Koskinen, Marek Kowalski, Mark Krasberg, Anna Kriesten, Kai Michael Krings, Gösta Kroll, Jan Kunnen, Naoko Kurahashi, Takao Kuwabara, Mathieu L. M. Labare, Hagar Landsman, Michael James Larson, Mariola Lesiak-Bzdak, Martin Leuermann, Julia Leute, Jan Lünemann, Oscar A. Macías-Ramírez, James Madsen, Giuliano Maggi, Reina Maruyama, Keiichi Mase, Howard S. Matis, Frank McNally, Kevin James Meagher, Martin Merck, Gonzalo Merino Arévalo, Thomas Meures, Sandra Miarecki, Eike Middell, Natalie Milke, John Lester Miller, Lars Mohrmann, Teresa Montaruli, Robert M. Morse, Rolf Nahnhauer, Uwe Naumann, Hans Niederhausen, Sarah C. Nowicki, David R. Nygren, Anna Obertacke, Sirin Odrowski, Alex Olivas, Ahmad Omairat, Aongus Starbuck Ó Murchadha, Larissa Paul, Joshua A. Pepper, Carlos Pérez de los Heros, Carl Pfendner, Damian Pieloth, Elisa Pinat, Jonas Posselt, P. Buford Price, Gerald T. Przybylski, Melissa Quinnan, Leif Rädel, Ian Rae, Mohamed Rameez, Katherine Rawlins, Peter Christian Redl, René Reimann, Elisa Resconi, Wolfgang Rhode, Mathieu Ribordy, Michael Richman, Benedikt Riedel, J. P. Rodrigues, Carsten Rott, Tim Ruhe, Bakhtiyar Ruzybayev, Dirk Ryckbosch, Sabine M. Saba, Heinz-Georg Sander, Juan Marcos Santander, Subir Sarkar, Kai Schatto, Florian Scheriau, Torsten Schmidt, Martin Schmitz, Sebastian Schoenen, Sebastian Schöneberg, Arne Schönwald, Anne Schukraft, Lukas Schulte, David Schultz, Olaf Schulz, David Seckel, Yolanda Sestayo de la Cerra, Surujhdeo Seunarine, Rezo Shanidze, Chris Sheremata, Miles W. E. Smith, Dennis Soldin, Glenn M. Spiczak, Christian Spiering, Michael Stamatikos, Todor Stanev, Nick A. Stanisha, Alexander Stasik, Thorsten Stezelberger, Robert G. Stokstad, Achim Stößl, Erik A. Strahler, Rickard Ström, Nora Linn Strotjohann, Gregory W. Sullivan, Henric Taavola, Ignacio J. Taboada, Alessio Tamburro, Andreas Tepe, Samvel Ter-Antonyan, Gordana Tesic, Serap Tilav, Patrick A. Toale, Moriah Natasha Tobin, Simona Toscano, Maria Tselengidou, Elisabeth Unger, Marcel Usner, Sofia Vallecorsa, Nick van Eijndhoven, Arne Van Overloop, Jakob van Santen, Markus Vehring, Markus Voge, Matthias Vraeghe, Christian Walck, Tilo Waldenmaier, Marius Wallraff, Christopher N. Weaver, Mark T. Wellons, Christopher H. Wendt, Stefan Westerhoff, Nathan Whitehorn, Klaus Wiebe, Christopher H. Wiebusch, Dawn R. Williams, Henrike Wissing, Martin Wolf, Terri R. Wood, Kurt Woschnagg, Donglian Xu, Xianwu Xu, Juan Pablo Yáñez, Gaurang B. Yodh, Shigeru Yoshida, Pavel Zarzhitsky, Jan Ziemann, Simon Zierke, Marcel Zoll
2014 A* conf
ICDE
Ian Rae, Alan Halverson, Jeffrey F. Naughton
2013 J jnl
Proc. VLDB Endow.
Jeff Shute, Radek Vingralek, Bart Samwel, Ben Handy, Chad Whipkey, Eric Rollins, Mircea Oancea, Kyle Littlefield, David Menestrina, Stephan Ellner, John Cieslewicz, Ian Rae, Traian Stancescu, Himani Apte
2013 J jnl
Proc. VLDB Endow.
Ian Rae, Eric Rollins, Jeff Shute, Sukhdeep S. Sodhi, Radek Vingralek
2013 J jnl
CoRR
Mark G. Aartsen, Rasha U. Abbasi, Markus Ackermann, Jenni Adams, Juan Antonio Aguilar Sánchez, Markus Ahlers, David Altmann, Carlos A. Argüelles Delgado, Jan Auffenberg, Xinhua Bai, Michael F. Baker, Steven W. Barwick, Volker Baum, Ryan Bay, James J. Beatty, Julia K. Becker Tjus, Karl-Heinz Becker, Segev BenZvi, Patrick Berghaus, David Berley, Elisa Bernardini, Anna Bernhard, David Z. Besson, G. Binder, Daniel Bindig, Martin Bissok, Erik Blaufuss, Jan Blumenthal, David J. Boersma, Christian Bohm, Debanjan Bose, Sebastian Böser, Olga Botner, Lionel Brayeur, Hans-Peter Bretz, Anthony M. Brown, Ronald Bruijn, James Casey, Martin Casier, Dmitry Chirkin, Asen Christov, Brian John Christy, Ken Clark, Lew Classen, Fabian Clevermann, Stefan Coenders, Shirit Cohen, Doug F. Cowen, Angel H. Cruz Silva, Matthias Danninger, Jacob Daughhetee, James C. Davis, Melanie Day, Catherine De Clercq, Sam De Ridder, Paolo Desiati, Krijn D. de Vries, Meike de With, Tyce DeYoung, Juan Carlos Díaz-Vélez, Matthew Dunkman, Ryan Eagan, Benjamin Eberhardt, Björn Eichmann, Jonathan Eisch, Sebastian Euler, Paul A. Evenson, Oladipo O. Fadiran, Ali R. Fazely, Anatoli Fedynitch, Jacob Feintzeig, Tom Feusels, Kirill Filimonov, Chad Finley, Tobias Fischer-Wasels, Samuel Flis, Anna Franckowiak, Katharina Frantzen, Tomasz Fuchs, Thomas K. Gaisser, Joseph S. Gallagher, Lisa Marie Gerhardt, Laura E. Gladstone, Thorsten Glüsenkamp, Azriel Goldschmidt, Geraldina Golup, Javier G. González, Jordan A. Goodman, Dariusz Góra, Dylan T. Grandmont, Darren Grant, Pavel Gretskov, John C. Groh, Andreas Groß, Chang Hyon Ha, Abd Al Karim Haj Ismail, Patrick Hallen, Allan Hallgren, Francis Halzen, Kael D. Hanson, Dustin Hebecker, David Heereman, Dirk Heinen, Klaus Helbing, Robert Eugene Hellauer III, Stephanie Virginia Hickford, Gary C. Hill, Kara D. Hoffman, Ruth Hoffmann, Andreas Homeier, Kotoyo Hoshina, Feifei Huang, Warren Huelsnitz, Per Olof Hulth, Klas Hultqvist, Shahid Hussain, Aya Ishihara, Emanuel Jacobi, John E. Jacobsen, Kai Jagielski, George S. Japaridze, Kyle Jero, Ola Jlelati, Basho Kaminsky, Alexander Kappes, Timo Karg, Albrecht Karle, Matthew Kauer, John Lawrence Kelley, Joanna Kiryluk, J. Kläs, Spencer R. Klein, Jan-Hendrik Köhne, Georges Kohnen, Hermann Kolanoski, Lutz Köpke, Claudio Kopper, Sandro Kopper, D. Jason Koskinen, Marek Kowalski, Mark Krasberg, Anna Kriesten, Kai Michael Krings, Gösta Kroll, Jan Kunnen, Naoko Kurahashi, Takao Kuwabara, Mathieu L. M. Labare, Hagar Landsman, Michael James Larson, Mariola Lesiak-Bzdak, Martin Leuermann, Julia Leute, Jan Lünemann, Oscar A. Macías-Ramírez, James Madsen, Giuliano Maggi, Reina Maruyama, Keiichi Mase, Howard S. Matis, Frank McNally, Kevin James Meagher, Martin Merck, Gonzalo Merino Arévalo, Thomas Meures, Sandra Miarecki, Eike Middell, Natalie Milke, John Lester Miller, Lars Mohrmann, Teresa Montaruli, Robert M. Morse, Rolf Nahnhauer, Uwe Naumann, Hans Niederhausen, Sarah C. Nowicki, David R. Nygren, Anna Obertacke, Sirin Odrowski, Alex Olivas, Ahmad Omairat, Aongus Starbuck Ó Murchadha, Larissa Paul, Joshua A. Pepper, Carlos Pérez de los Heros, Carl Pfendner, Damian Pieloth, Elisa Pinat, Jonas Posselt, P. Buford Price, Gerald T. Przybylski, Melissa Quinnan, Leif Rädel, Ian Rae, Mohamed Rameez, Katherine Rawlins, Peter Christian Redl, René Reimann, Elisa Resconi, Wolfgang Rhode, Mathieu Ribordy, Michael Richman, Benedikt Riedel, J. P. Rodrigues, Carsten Rott, Tim Ruhe, Bakhtiyar Ruzybayev, Dirk Ryckbosch, Sabine M. Saba, Heinz-Georg Sander, Juan Marcos Santander, Subir Sarkar, Kai Schatto, Florian Scheriau, Torsten Schmidt, Martin Schmitz, Sebastian Schoenen, Sebastian Schöneberg, Arne Schönwald, Anne Schukraft, Lukas Schulte, David Schultz, Olaf Schulz, David Seckel, Yolanda Sestayo de la Cerra, Surujhdeo Seunarine, Rezo Shanidze, Chris Sheremata, Miles W. E. Smith, Dennis Soldin, Glenn M. Spiczak, Christian Spiering, Michael Stamatikos, Todor Stanev, Nick A. Stanisha, Alexander Stasik, Thorsten Stezelberger, Robert G. Stokstad, Achim Stößl, Erik A. Strahler, Rickard Ström, Nora Linn Strotjohann, Gregory W. Sullivan, Henric Taavola, Ignacio J. Taboada, Alessio Tamburro, Andreas Tepe, Samvel Ter-Antonyan, Gordana Tesic, Serap Tilav, Patrick A. Toale, Moriah Natasha Tobin, Simona Toscano, Maria Tselengidou, Elisabeth Unger, Marcel Usner, Sofia Vallecorsa, Nick van Eijndhoven, Arne Van Overloop, Jakob van Santen, Markus Vehring, Markus Voge, Matthias Vraeghe, Christian Walck, Tilo Waldenmaier, Marius Wallraff, Christopher N. Weaver, Mark T. Wellons, Christopher H. Wendt, Stefan Westerhoff, Nathan Whitehorn, Klaus Wiebe, Christopher H. Wiebusch, Dawn R. Williams, Henrike Wissing, Martin Wolf, Terri R. Wood, Kurt Woschnagg, Donglian Xu, Xianwu Xu, Juan Pablo Yáñez, Gaurang B. Yodh, Shigeru Yoshida, Pavel Zarzhitsky, Jan Ziemann, Simon Zierke, Marcel Zoll
2010 conf
INM/WREN
Jeffrey R. Ballard, Ian Rae, Aditya Akella
2010 J jnl
Proc. VLDB Endow.
Akanksha Baid, Ian Rae, Jiexing Li, AnHai Doan, Jeffrey F. Naughton
2010 A* conf
ICDE
Akanksha Baid, Ian Rae, AnHai Doan, Jeffrey F. Naughton
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 "";
        }
    }
}