Van Duc Nguyen

46 papers B 2Journal 26Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Mob. Comput.
Minh Ngoc Luu, Minh-Duong Nguyen, Ebrahim Bedeer, Van Duc Nguyen, Dinh Thai Hoang, Diep N. Nguyen, Quoc-Viet Pham
2026 J jnl
CoRR
Trinh Van Chien, Bui Trong Duc, Nguyen Xuan Tung, Van Duc Nguyen, Waqas Khalid, Symeon Chatzinotas, Lajos Hanzo
2025 J jnl
IEEE Access
Cong Thuan Do, Nguyen Duy Khai, Tuan Dat Nguyen, Nguyen Tri Thanh, Pham Hoang Minh Chau, Anh Nam Le, Van Duc Nguyen, Trinh Van Chien
2025 conf
IMCOM
Trong Tuan Do, Dinh Duy Nguyen, Xuan Hai Ho, Van Duc Nguyen
2025 J jnl
Appl. Soft Comput.
Ahad Amini Pishro, Shiquan Zhang, Alain L'Hostis, Qixiao Hu, Yuetong Liu, Zhengrui Zhang, Van Duc Nguyen, Yongguo Fu, Tianzeng Li
2023 conf
IMCOM
Van Duc Nguyen, Van Huy Nguyen, Quoc Khuong Nguyen, Tien Dung Nguyen
2023 conf
APSIPA ASC
Thi Hoai Linh Nguyen, Quoc Khuong Nguyen, Van Duc Nguyen
2023 B conf
GLOBECOM
An Le Ha, Trinh Van Chien, Van Duc Nguyen, Wan Choi
2023 J jnl
IEEE Access
Van Duc Nguyen, Dinh Khoa Phan, Trinh Van Chien
2023 conf
SoICT
Cong Thuan Do, Anh Nam Le, Van Duc Nguyen, Trinh Van Chien
2023 J jnl
CoRR
Ha An Le, Trinh Van Chien, Van Duc Nguyen, Wan Choi
2023 J jnl
IEEE Trans. Commun.
Ha An Le, Trinh Van Chien, Van Duc Nguyen, Wan Choi
2023 conf
IMCOM
Nhat Hoang Bach, Van Duc Nguyen, Le Ha Vu, Duy-Phuong Pham
2023 J jnl
Sensors
Van Duc Nguyen, Ngoc Minh Luu, Quoc Khuong Nguyen, Tien-Dung Nguyen
2023 J jnl
CoRR
Minh Ngoc Luu, Minh-Duong Nguyen, Ebrahim Bedeer, Van Duc Nguyen, Dinh Thai Hoang, Diep N. Nguyen, Quoc-Viet Pham
2022 J jnl
IEEE Access
Van Duc Nguyen, Thi Hoai Linh Nguyen, Quoc Khuong Nguyen, Tien Hoa Nguyen
2022 B conf
PIMRC
Ha An Le, Trinh Van Chien, Van Duc Nguyen, Wan Choi
2022 J jnl
CoRR
Ha An Le, Trinh Van Chien, Van Duc Nguyen, Wan Choi
2021 conf
DSA
Van Duc Nguyen, Ewout Zwanenburg, Steffen Limmer, Wessel Luijben, Thomas Bäck, Markus Olhofer
2021 J jnl
Sensors
Nhat Hoang Bach, Le Ha Vu, Van Duc Nguyen
2021 conf
IMCOM
An Le Ha, Trinh Van Chien, Tien Hoa Nguyen, Wan Choi, Van Duc Nguyen
2021 J jnl
CoRR
An Le Ha, Trinh Van Chien, Tien Hoa Nguyen, Wan Choi, Van Duc Nguyen
2021 J jnl
CoRR
Do Viet Ha, Tien Hoa Nguyen, Van Duc Nguyen
2021 J jnl
Phys. Commun.
Van Duc Nguyen, Do Viet Ha, Vinh Van Duong, Ha An Le, Tien Hoa Nguyen
2021 J jnl
Sensors
Ha An Le, Trinh Van Chien, Tien Hoa Nguyen, Hyunseung Choo, Van Duc Nguyen
2021 J jnl
CoRR
Phan Thi Kim Chinh, Trinh Van Chien, Tran Manh Hoang, Tien Hoa Nguyen, Van Duc Nguyen
2020 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Abu Saleh Md Tayeen, Thanh Hai Nguyen, Van Duc Nguyen, Enrico Pontelli
2019 J jnl
Digit. Commun. Networks
Jin-Kyu Choi, Van Duc Nguyen, Hai Nam Nguyen, Vinh Van Duong, Tien Hoa Nguyen, Hanbyeog Cho, Hyun-Kyun Choi, Seonggyoon Park
2019 conf
FDSE
Quoc-Bao Nguyen, Anh-Quynh Nguyen, Van Duc Nguyen, Thanh Nguyen-Le, Khuong Nguyen-An
2019 conf
ICLP Technical Communications
Van Duc Nguyen, Tran Cao Son, Enrico Pontelli
2018 J jnl
EURASIP J. Wirel. Commun. Netw.
Hanbyeog Cho, Tien Hoa Nguyen, Huu Nghia Nguyen, Hyun-Kyun Choi, Jin-Kyu Choi, Soonghwan Ro, Van Duc Nguyen
2018 conf
IMCOM
Nga Nguyen Thu, Van Duc Nguyen, Byeungwoo Jeon, Nguyen Quy Sy
2018 conf
IMCOM
Huu Nghia Nguyen, Huy Pham Quoc, Luong Pham Van, Tien Hoa Nguyen, Hanbyeog Cho, Van Duc Nguyen, Byeungwoo Jeon
2018 conf
INISCOM
Sang Van Doan, Trang Cong Tran, Van Duc Nguyen
2018 conf
ICLP (Technical Communications)
Van Duc Nguyen, Tran Cao Son, Enrico Pontelli
2018 conf
ICLP (Technical Communications)
Van Duc Nguyen
2018 J jnl
IEEE Access
Tien Hoa Nguyen, The Khai Nguyen, Huy-Dung Han, Van Duc Nguyen
2018 J jnl
IEEE Access
Taehyun Yoon, Tien Hoa Nguyen, Xuan Tung Nguyen, Daeseung Yoo, Byungtae Jang, Van Duc Nguyen
2017 J jnl
J. Commun. Networks
Do Viet Ha, Van Duc Nguyen, Quoc Khuong Nguyen
2016 J jnl
Wirel. Commun. Mob. Comput.
Nga Nguyen Thu, Van Duc Nguyen
2016 J jnl
Int. J. Wirel. Mob. Comput.
Do Viet Ha, Chien Van Trinh, Van Duc Nguyen
2014 conf
ICUIMC
Dien Nguyen Van, Tuan Nguyen Anh, Tu Tran Ngoc, Van Duc Nguyen, Byeungwoo Jeon, Tien Hoa Nguyen
2014 conf
ICUIMC
Nga Nguyen, Bach Tran, Quoc Khuong Nguyen, Van Duc Nguyen, Byeungwoo Jeon
2014 J jnl
KSII Trans. Internet Inf. Syst.
Tien Hoa Nguyen, Thanh Hieu Nguyen, Van Duc Nguyen, Duyen Trung Ha, Guillaume Gelle, Hyunseung Choo
2013 conf
ICUIMC
Chien Van Trinh, Thuong Nguyen Canh, Byeungwoo Jeon, Van Duc Nguyen
2012 conf
ICCASA
Nguyen Thanh Tung, Van Duc Nguyen, Nguyen Hai Thanh, Phan Cong Vinh, Nguyen Dai Tho
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 "";
        }
    }
}