Xiangguang Dai

29 papers C 6Journal 19Unranked 4
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Hongzong Li, Luwei Liao, Xiangguang Dai, Yuming Feng, Rong Feng, Shiqin Tang
2025 J jnl
IEEE Trans. Consumer Electron.
Tao Guo, Fengjun Shang, Xiangguang Dai, Qilie Liu
2025 J jnl
Complex Intell. Syst.
Yunshan Lv, Hailing Xiong, Fuqing Zhang, Shengying Dong, Xiangguang Dai
2025 J jnl
IEEE Trans. Consumer Electron.
Qingguo Lü, Xiangguang Dai, Wei Zhang, M. R. Ezilarasan
2025 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Hangjun Che, Chenglu Li, Man-Fai Leung, Deqiang Ouyang, Xiangguang Dai, Shiping Wen
2025 C conf
ISNN
M. R. Ezilarasan, V. Muthu, G. Kavitha, Man-Fai Leung, Jin Zhang, Xiangguang Dai, Yuming Feng
2025 J jnl
Complex Intell. Syst.
Xiangguang Dai, Mingyu Guan, Facheng Dai, Wei Zhang, Tingji Zhang, Hangjun Che, Xiangqin Dai
2024 J jnl
Sensors
Shan Jiang, Yuming Feng, Wei Zhang, Xiaofeng Liao, Xiangguang Dai, Babatunde Oluwaseun Onasanya
2024 C conf
ISNN
M. R. Ezilarasan, D. Preethi, Man-Fai Leung, Hangjun Che, Xiangguang Dai
2023 J jnl
Complex Intell. Syst.
Jing Zhong, Yuelei Feng, Shuyu Tang, Jiang Xiong, Xiangguang Dai, Nian Zhang
2023 conf
ICACI
Yadi Wang, Xiaoding Guo, Yibo Zhang, Yiyuan Ren, Wendi Huang, Zunyan Liu, Yuming Feng, Xiangguang Dai, Wei Zhang, Hangjun Che
2023 conf
ICACI
Wei Guo, Hangjun Che, Man-Fai Leung, Nankun Mu, Xiangguang Dai, Yuming Feng
2023 conf
ICACI
Chan Cao, Shuyu Tang, Nian Zhang, Xiangguang Dai, Wei Zhang, Yuming Feng, Jiang Xiong, Jinkui Liu, Lara A. Thompson
2023 J jnl
Neural Comput. Appl.
Paul Augustine Ejegwa, Yuming Feng, Shuyu Tang, Johnson Mobolaji Agbetayo, Xiangguang Dai
2022 J jnl
Knowl. Based Syst.
Xiangguang Dai, Jun Wang, Wei Zhang
2022 J jnl
Complex Intell. Syst.
Xiangguang Dai, Keke Zhang, Juntang Li, Jiang Xiong, Nian Zhang, Huaqing Li
2022 J jnl
Neurocomputing
Yao Xiao, Wei Zhang, Xiangguang Dai, Xiangqin Dai, Nian Zhang
2021 conf
ICACI
Meng Zhang, Xiangguang Dai, Xiangqin Dai, Nian Zhang
2021 J jnl
Int. J. Artif. Intell. Tools
Keke Zhang, Jiang Xiong, Xiangguang Dai
2020 C conf
ISNN
Xitao Zou, Huan Liu, Xiangguang Dai, Jiang Xiong, Nian Zhang
2020 C conf
ISNN
Yi Yang, Changcheng Xiang, Xiangguang Dai, Liyuan Qi, Tao Dong
2020 C conf
ISNN
Nian Zhang, Xiangguang Dai, Md Amimul Ehsan, Tolessa Deksissa
2020 C conf
ISNN
Xiangguang Dai, Keke Zhang, Juntang Li, Jiang Xiong, Nian Zhang
2020 J jnl
Inf. Sci.
Xiangguang Dai, Xiaojie Su, Wei Zhang, Fangzheng Xue, Huaqing Li
2020 J jnl
Int. J. Comput. Intell. Syst.
Xiangguang Dai, Nian Zhang, Keke Zhang, Jiang Xiong
2019 J jnl
Neural Comput. Appl.
Xiangguang Dai, Guo Chen, Chuandong Li
2019 J jnl
Neural Comput. Appl.
Xiangguang Dai, Chuandong Li, Xing He, Chaojie Li
2018 J jnl
Int. J. Syst. Sci.
Ping Liu, Huaqing Li, Xiangguang Dai, Qi Han
2018 J jnl
Complex.
Xiangguang Dai, Chuandong Li, Biqun Xiang
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 "";
        }
    }
}