Jaehyuk Cha

44 papers A 1B 10C 2Misc 2Journal 23Unranked 6
YearRankTypeTitle / Venue / Authors
2025 J jnl
J. Intell. Transp. Syst.
Jiwoong Heo, Sungjin Hwang, Jucheol Moon, Jaehwan You, Hansung Kim, Jaehyuk Cha, Kwanguk (Kenny) Kim
2025 B conf
CogSci
Sunwoo Moon, Jaehyuk Cha, Hyungwook Yim
2024 J jnl
Comput. Syst. Sci. Eng.
Irfan Haider, Muhammad Attique Khan, Muhammad Nazir, Taerang Kim, Jaehyuk Cha
2024 J jnl
IEEE Access
Seungsu Baik, Taehwa Lee, Jaehyuk Cha
2024 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Sungjin Hwang, Jiwoong Heo, Youngwug Cho, Jucheol Moon, Yushin Lee, Hansung Kim, Jaehyuk Cha, Kwanguk (Kenny) Kim
2023 J jnl
Sensors
Faiza Jahangir, Muhammad Attique Khan, Majed Alhaisoni, Abdullah Alqahtani, Shtwai Alsubai, Mohemmed Sha, Abdullah Al Hejaili, Jaehyuk Cha
2023 J jnl
SoftwareX
Geunseong Jung, Jaehyuk Cha
2023 B conf
CogSci
Yura Choi, Kawon Kim, Sunwoo Moon, Geunseong Jung, Jaehyuk Cha, Hyungwook Yim
2023 J jnl
Comput. Syst. Sci. Eng.
Abdul Haseeb, Muhammad Attique Khan, Faheem Shehzad, Majed Alhaisoni, Junaid Ali Khan, Taerang Kim, Jaehyuk Cha
2023 J jnl
Comput. Syst. Sci. Eng.
Safdar Khan, Muhammad Attique Khan, Jamal Hussain Shah, Faheem Shehzad, Taerang Kim, Jaehyuk Cha
2023 J jnl
IEEE Access
Sungjin Hwang, Jiwoong Heo, Jucheol Moon, Jaehwan You, Hansung Kim, Jaehyuk Cha, Kwanguk (Kenny) Kim
2023 J jnl
Sensors
Ahmad S. Almadhor, Gabriel Avelino R. Sampedro, Mideth B. Abisado, Sidra Abbas, Ye Jin Kim, Muhammad Attique Khan, Jamel Baili, Jaehyuk Cha
2022 J jnl
Sensors
Marriam Nawaz, Tahira Nazir, Ali Javed, Usman Tariq, Hwan-Seung Yong, Muhammad Attique Khan, Jaehyuk Cha
2022 J jnl
IEEE Access
Geunseong Jung, Sungjae Han, Hansung Kim, Kwanguk (Kenny) Kim, Jaehyuk Cha
2022 J jnl
Sensors
Farhat Afza, Muhammad Sharif, Muhammad Attique Khan, Usman Tariq, Hwan-Seung Yong, Jaehyuk Cha
2021 J jnl
IEEE Trans. Computers
Yoonsuk Kang, Yong-Yeon Jo, Jaehyuk Cha, Wan D. Bae, Wonjun Lee, Sang-Wook Kim
2021 J jnl
CoRR
Geunseong Jung, Sungjae Han, Hansung Kim, Jaehyuk Cha
2017 A conf
CIKM
Yoonsuk Kang, Yong-Yeon Jo, Jaehyuk Cha, Wan D. Bae, Sang-Wook Kim
2016 J jnl
IEEE Trans. Computers
Dongwook Kim, Youjip Won, Jaehyuk Cha, Sungroh Yoon, Jongmoo Choi, Sooyong Kang
2016 J jnl
Int. J. Commun. Syst.
Yoonsuk Kang, Yong-Yeon Jo, Jaehyuk Cha, Sang-Wook Kim, Youngkyun Shin
2015 J jnl
ACM Trans. Storage
Seokhei Cho, Changhyun Park, Youjip Won, Sooyong Kang, Jaehyuk Cha, Sungroh Yoon, Jongmoo Choi
2014 conf
WWW (Companion Volume)
Sungjae Han, Geunseong Jung, Minsoo Ryu, Byung-Uk Choi, Jaehyuk Cha
2014 C conf
SIMULTECH
Jinsoo Yoo, Youjip Won, Sooyong Kang, Jongmoo Choi, Sungroh Yoon, Jaehyuk Cha
2014 C conf
CIT
Sungjae Han, Minsoo Ryu, Jaehyuk Cha, Byung-Uk Choi
2014 J jnl
IEEE Trans. Computers
Bumjoon Seo, Sooyong Kang, Jongmoo Choi, Jaehyuk Cha, Youjip Won, Sungroh Yoon
2014 J jnl
J. Syst. Archit.
Sungmin Park, Jaehyuk Cha, Sooyong Kang
2013 conf
ICUIMC
Seok-Ho Yoon, Suk-Soon Song, Sang-Chul Lee, Kyo-Sung Jeong, Sang-Wook Kim, Sooyong Kang, Yong Suk Choi, Jaehyuk Cha, Minsoo Ryu, Byung-Soo Jeong
2013 Misc conf
MSST
Jinsoo Yoo, Youjip Won, Joongwoo Hwang, Sooyong Kang, Jongmoo Choi, Sungroh Yoon, Jaehyuk Cha
2012 Misc conf
MSST
Jonghwa Kim, Choonghyun Lee, Sang Yup Lee, Ikjoon Son, Jongmoo Choi, Sungroh Yoon, Hu-ung Lee, Sooyong Kang, Youjip Won, Jaehyuk Cha
2010 B conf
ICALT
Yoonsoo Lee, Hyunoh Doh, Haanwoong Choi, Jaehyuk Cha
2010 B conf
ICALT
Sungjae Han, Jinjoo Kim, Youngseok Lee, Jaehyuk Cha, Byung-Uk Choi
2009 B conf
ICALT
Yoonsoo Lee, Byoungchol Chang, Hyunoh Doh, Kyuhyun Park, Jaehyuk Cha
2009 J jnl
IEEE Trans. Computers
Sooyong Kang, Sungmin Park, Hoyoung Jung, Hyoki Shim, Jaehyuk Cha
2008 B conf
ICALT
Byoungchol Chang, Yoonsoo Lee, Sua Ko, Jaehyuk Cha
2008 J jnl
IEEE Trans. Consumer Electron.
Hoyoung Jung, Hyoki Shim, Sungmin Park, Sooyong Kang, Jaehyuk Cha
2008 B conf
MASCOTS
Sungmin Park, Hoyoung Jung, Hyoki Shim, Sooyong Kang, Jaehyuk Cha
2008 B conf
MASCOTS
Sungmin Park, Hoyoung Jung, Hyoki Shim, Sooyong Kang, Jaehyuk Cha
2007 B conf
ICALT
Byoungchol Chang, Dall-ho Ham, Daesung Moon, Yong Suk Choi, Jaehyuk Cha
2007 conf
ICCSA (1)
Hoyoung Jung, Kyunghoon Yoon, Hyoki Shim, Sungmin Park, Sooyong Kang, Jaehyuk Cha
2007 conf
Edutainment
Byoungchol Chang, Mokhwa Lim, Dall-ho Ham, Yoonsoo Lee, Sooyong Kang, Jaehyuk Cha
2007 conf
ICCSA (1)
Byoungchol Chang, Dall-ho Ham, Daesung Moon, Yong Suk Choi, Jaehyuk Cha
2006 conf
KES (1)
Byoungchol Chang, Jaehyuk Cha, Sang-Wook Kim, Miyoung Shin
1996 B conf
COMPSAC
Jisook Park, Sukho Lee, Jaehyuk Cha, Yunmook Nah
1996 J jnl
Multim. Tools Appl.
Jaehyuk Cha, Sukho Lee
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 "";
        }
    }
}