Karola Pitsch

45 papers A* 3A 1B 23Misc 1Journal 7Unranked 10
YearRankTypeTitle / Venue / Authors
2025 conf
ICSR+AI (1)
Ryota Suzuki, Mina Takao, Kosei Shino, Yoshinori Kobayashi, Kenji Iwata, Tomomi Satoh, Yutaka Satoh, Naoki Uchida, Akiko Yamazaki, Keiichi Yamazaki, Felix Bergmann, Karola Pitsch
2023 J jnl
Comput. Graph. Forum
Carina Liebers, Shivam Agarwal, Maximilian Krug, Karola Pitsch, Fabian Beck
2020 B conf
ECSCW
Karola Pitsch, Peter Bachmann, Marcel Dudda
2020 B conf
ECSCW
Karola Pitsch, Maximilian Krug, Corvin Cleff
2020 B conf
ECSCW
Scheffler Joline, Karola Pitsch
2019 conf
MuC (Workshopband)
Karola Pitsch
2019 conf
MuC (Workshopband)
Karola Pitsch
2018 conf
ICAHGCA@AAMAS
Stefan Kopp, Mara Brandt, Hendrik Buschmeier, Katharina Cyra, Farina Freigang, Nicole C. Krämer, Franz Kummert, Christiane Opfermann, Karola Pitsch, Lars Schillingmann, Carolin Straßmann, Eduard Wall, Ramin Yaghoubzadeh
2017 B conf
RO-MAN
Katharina Cyra, Karola Pitsch
2017 B conf
HAI
Katharina Cyra, Karola Pitsch
2017 A* conf
HRI
Raphaela Gehle, Karola Pitsch, Timo Dankert, Sebastian Wrede
2017 B conf
HAI
Karola Pitsch, Raphaela Gehle, Timo Dankert, Sebastian Wrede
2017 B conf
RO-MAN
Christiane Opfermann, Karola Pitsch
2017 B conf
HAI
Christiane Opfermann, Karola Pitsch, Ramin Yaghoubzadeh, Stefan Kopp
2016 B conf
ICSR
Timo Dankert, Michael Goerlich, Sebastian Wrede, Raphaela Gehle, Karola Pitsch
2016 Misc conf
MuC
Katharina Cyra, Antje Amrhein, Karola Pitsch
2016 J jnl
AI Soc.
Karola Pitsch
2016 conf
EDIA@ECAI
Antje Amrhein, Katharina Cyra, Karola Pitsch
2016 B conf
RO-MAN
Karola Pitsch, Timo Dankert, Raphaela Gehle, Sebastian Wrede
2015 B conf
IVA
Ramin Yaghoubzadeh, Karola Pitsch, Stefan Kopp
2015 conf
GSCL
Karola Pitsch, Ramin Yaghoubzadeh, Stefan Kopp
2015 B conf
RO-MAN
Raphaela Gehle, Karola Pitsch, Timo Dankert, Sebastian Wrede
2014 B conf
RO-MAN
Luise Süssenbach, Nina Riether, Sebastian Schneider, Ingmar Berger, Franz Kummert, Ingo Lütkebohle, Karola Pitsch
2014 B conf
HAI
Raphaela Gehle, Karola Pitsch, Sebastian Wrede
2014 J jnl
Top. Cogn. Sci.
Frank Broz, Chrystopher L. Nehaniv, Tony Belpaeme, Ambra Bisio, Kerstin Dautenhahn, Luciano Fadiga, Tomassino Ferrauto, Kerstin Fischer, Frank Förster, Onofrio Gigliotta, Sascha S. Griffiths, Hagen Lehmann, Katrin S. Lohan, Caroline Lyon, Davide Marocco, Gianluca Massera, Giorgio Metta, Vishwanathan Mohan, Anthony F. Morse, Stefano Nolfi, Francesco Nori, Martin Peniak, Karola Pitsch, Katharina J. Rohlfing, Gerhard Sagerer, Yo Sato, Joe Saunders, Lars Schillingmann, Alessandra Sciutti, Vadim Tikhanoff, Britta Wrede, Arne Zeschel, Angelo Cangelosi
2014 B conf
RO-MAN
Karola Pitsch, Sebastian Wrede
2013 conf
GI-Jahrestagung
Marcel Kramer, Ramin Yaghoubzadeh, Stefan Kopp, Karola Pitsch
2013 B conf
ICMI
Alexander Neumann, Christian Schnier, Thomas Hermann, Karola Pitsch
2013 conf
Audio Mostly Conference
Thomas Hermann, Alexander Neumann, Christian Schnier, Karola Pitsch
2013 B conf
IVA
Ramin Yaghoubzadeh, Marcel Kramer, Karola Pitsch, Stefan Kopp
2012 B conf
RO-MAN
Luise Süssenbach, Karola Pitsch, Ingmar Berger, Nina Riether, Franz Kummert
2012 B conf
RO-MAN
Karola Pitsch, Katrin S. Lohan, Katharina J. Rohlfing, Joe Saunders, Chrystopher L. Nehaniv, Britta Wrede
2012 B conf
ICMI
Bernhard Andreas Brüning, Christian Schnier, Karola Pitsch, Sven Wachsmuth
2012 B conf
LREC
Bernhard Andreas Brüning, Christian Schnier, Karola Pitsch, Sven Wachsmuth
2012 J jnl
Int. J. Soc. Robotics
Katrin S. Lohan, Katharina J. Rohlfing, Karola Pitsch, Joe Saunders, Hagen Lehmann, Chrystopher L. Nehaniv, Kerstin Fischer, Britta Wrede
2011 A* conf
HRI
Karola Pitsch, Sebastian Wrede, Jens-Christian Seele, Luise Süssenbach
2011 B conf
ECSCW
Christian Schnier, Karola Pitsch, Angelika Dierker, Thomas Hermann
2011 conf
ICDL-EPIROB
Katrin S. Lohan, Karola Pitsch, Katharina J. Rohlfing, Kerstin Fischer, Joe Saunders, Hagen Lehmann, Chrystopher L. Nehaniv, Britta Wrede
2011 J jnl
Int. J. Soc. Robotics
Patrick Holthaus, Karola Pitsch, Sven Wachsmuth
2010 conf
ICDL
Anna-Lisa Vollmer, Karola Pitsch, Katrin S. Lohan, Jannik Fritsch, Katharina J. Rohlfing, Britta Wrede
2010 J jnl
Pers. Ubiquitous Comput.
Paul Luff, Karola Pitsch, Christian Heath, Peter Herdman, Julian Wood
2009 B conf
RO-MAN
Karola Pitsch, Hideaki Kuzuoka, Yuya Suzuki, Luise Süssenbach, Paul Luff, Christian Heath
2009 A* conf
CHI
Keiichi Yamazaki, Akiko Yamazaki, Mai Okada, Yoshinori Kuno, Yoshinori Kobayashi, Yosuke Hoshi, Karola Pitsch, Paul Luff, Dirk vom Lehn, Christian Heath
2008 A conf
CSCW
Hideaki Kuzuoka, Karola Pitsch, Yuya Suzuki, Ikkaku Kawaguchi, Keiichi Yamazaki, Akiko Yamazaki, Yoshinori Kuno, Paul Luff, Christian Heath
2003 J jnl
LDV Forum
Ulrike Gut, Jan-Torsten Milde, Karola Pitsch
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 "";
        }
    }
}