Mahsa T. Pourazad

113 papers B 15C 27Misc 11Journal 30Unranked 30
YearRankTypeTitle / Venue / Authors
2024 C conf
ICCE
Hamid Reza Tohidypour, K. Jin, R. Fang, A. Rajavaram, H. Feng, Yixiao Wang, Tala Bazzaza, Mahsa T. Pourazad, Panos Nasiopoulos
2023 J jnl
IEEE Trans. Broadcast.
Jie Xiang, Hamid Reza Tohidypour, Yixiao Wang, Panos Nasiopoulos, Mahsa T. Pourazad
2023 Misc conf
ICNC
Junbin Zhang, Yixiao Wang, Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2023 B conf
SMC
Jie Xiang, Hamid Reza Tohidypour, Yixiao Wang, Panos Nasiopoulos, Mahsa T. Pourazad
2023 C conf
ISCAS
Yixiao Wang, Nusrat Mehajabin, Hamid Reza Tohidypour, Jerry Song, Menghong Huang, Behnoosh Babaghorbani, Zuhao Chen, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2023 C conf
ICCE
Yixiao Wang, Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2023 Misc conf
ICASSP
Fangyuan Chi, Yixiao Wang, Panos Nasiopoulos, Victor C. M. Leung, Mahsa T. Pourazad
2023 conf
DSP
Hamid Reza Tohidypour, Yixiao Wang, Mahsa T. Pourazad, Chen Yuan, Runze Wang, Travis LePage, Panos Nasiopoulos
2023 C conf
ICCE
Hamid Reza Tohidypour, Yixiao Wang, Mahsa T. Pourazad, Panos Nasiopoulos, D. Zhao, M. Xie, D. Kamat
2023 J jnl
IEEE Netw.
Fangyuan Chi, Yixiao Wang, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2022 conf
PETRA
Hamid Reza Tohidypour, Anahita Shojaei-Hashemi, Panos Nasiopoulos, Mahsa T. Pourazad
2022 B conf
WiMob
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Nusrat Mehajabin, Mahsa T. Pourazad, Panos Nasiopoulos
2022 conf
HICSS
Nusrat Mehajabin, Peizhi Yan, Supreet Kaur, Jingxiang Song, Mahsa T. Pourazad, Yixiao Wang, Hamid Reza Tohidypour, Panos Nasiopoulos
2022 J jnl
Int. J. Multim. Intell. Secur.
Joseph Khoury, Nusrat Mehajabin, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2022 C conf
ICCE
Tala Bazzaza, Zuhao Chen, Sandhiya Prabha, Hamid Reza Tohidypour, Yixiao Wang, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2022 C conf
ICCE
Yixiao Wang, Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2021 J jnl
IEEE Access
Abrar Wafa, Mahsa T. Pourazad, Panos Nasiopoulos
2021 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Pedram Mohammadi, Mahsa T. Pourazad, Panos Nasiopoulos
2021 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Pedram Mohammadi, Mahsa T. Pourazad, Panos Nasiopoulos
2021 conf
MeditCom
Mahsa T. Pourazad, T. Sung, H. Hu, S. Wang, Hamid Reza Tohidypour, Yixiao Wang, Panos Nasiopoulos, Victor C. M. Leung
2021 conf
GoodIT
Parnia Haji Faraji, Hamid Reza Tohidypour, Yixiao Wang, Panos Nasiopoulos, Simon Ren, Arash Rizvi, Cloris Feng, Mahsa T. Pourazad, Victor C. M. Leung
2021 C conf
ICCE
Jie Xiang, Mahsa T. Pourazad, Panos Nasiopoulos, Stelios E. Ploumis
2021 B conf
ICIP
Abrar Wafa, Mahsa T. Pourazad, Panos Nasiopoulos
2020 B conf
WiMob
Pedram Mohammadi, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2020 conf
ICOIN
Mahsa T. Pourazad, Anahita Shojaei-Hashemi, Panos Nasiopoulos, Maryam Azimi, Michelle Mak, Jennifer Grace, Doojin Jung, Taran Bains
2020 J jnl
IEEE Trans. Broadcast.
Maryam Azimi, Mahsa T. Pourazad
2020 B conf
ICIP
Maryam Azimi, Panos Nasiopoulos, Mahsa T. Pourazad
2020 C conf
ICCE
Nusrat Mehajabin, Mahsa T. Pourazad, Panos Nasiopoulos
2019 C conf
ISCAS
Pedram Mohammadi, Mahsa T. Pourazad, Panos Nasiopoulos
2019 Misc conf
ICNC
Joseph Khoury, Mahsa T. Pourazad, Panos Nasiopoulos
2019 conf
ICECS
Maryam Azimi, Panos Nasiopoulos, Mahsa T. Pourazad
2019 B conf
ICIP
Nusrat Mehajabin, Sichen Roger Luo, Hao Wei Yu, Joseph Khoury, Jashandeep Kaur, Mahsa T. Pourazad
2019 C conf
ICCE
Pedram Mohammadi, Maryam Azimi Hashemi, Mahsa T. Pourazad
2018 Misc conf
ICNC
Stelios E. Ploumis, Mahsa T. Pourazad, Panos Nasiopoulos
2018 J jnl
CoRR
Amin Banitalebi-Dehkordi, Yuanyuan Dong, Mahsa T. Pourazad, Panos Nasiopoulos
2018 J jnl
CoRR
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2018 conf
NTMS
Pedram Mohammadi, Mahsa T. Pourazad, Panos Nasiopoulos
2018 J jnl
IEEE Trans. Broadcast.
Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2018 J jnl
CoRR
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2018 C conf
ICCE
Ahmad Khaldieh, Stelios E. Ploumis, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2018 C conf
ISCAS
Anahita Shojaei-Hashemi, Panos Nasiopoulos, James J. Little, Mahsa T. Pourazad
2017 conf
ICC
Maryam Azimi, Timothee-Florian Bronner, Panos Nasiopoulos, Mahsa T. Pourazad
2017 C conf
ICCE
Maryam Azimi, Timothee-Florian Bronner, Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2017 J jnl
Multim. Tools Appl.
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2017 conf
ICT
Basak Oztas, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2017 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hamid Reza Tohidypour, Hossein Bashashati, Mahsa T. Pourazad, Panos Nasiopoulos
2017 Misc conf
ICASSP
Fujun Xie, Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2017 J jnl
IEEE Trans. Consumer Electron.
Maryam Azimi, Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2017 conf
EUSIPCO
Maryam Azimi, Ronan Boitard, Panos Nasiopoulos, Mahsa T. Pourazad
2016 conf
DIVANet
Basak Oztas, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2016 J jnl
IEEE Trans. Broadcast.
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2016 J jnl
Multim. Tools Appl.
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2016 J jnl
J. Electronic Imaging
Amin Banitalebi-Dehkordi, Eleni Nasiopoulos, Mahsa T. Pourazad, Panos Nasiopoulos
2016 Misc conf
ICASSP
Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2016 C conf
ICCE
Fujun Xie, Mahsa T. Pourazad, Panos Nasiopoulos, Jim Slevinsky
2016 J jnl
IEEE Syst. J.
Qi Jiang, Victor C. M. Leung, Mahsa T. Pourazad, Hao Tang, Hongsheng Xi
2016 conf
ICECS
Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2016 conf
DMIAF
Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2016 J jnl
IEEE Trans. Multim.
Yuanyuan Dong, Mahsa T. Pourazad, Panos Nasiopoulos
2016 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2016 conf
DMIAF
Stelios E. Ploumis, Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos
2016 J jnl
IEEE Trans. Multim.
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2016 J jnl
EAI Endorsed Trans. Cloud Syst.
Ryan Perera, Anil Fernando, Thanuja Mallikarachchi, Hemantha Kodikara Arachchi, Mahsa T. Pourazad
2016 conf
ICC Workshops
Amin Banitalebi-Dehkordi, Maryam Azimi, Mahsa T. Pourazad, Panos Nasiopoulos
2015 J jnl
Int. J. Distributed Sens. Networks
Bambang A. B. Sarif, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2015 conf
EUSIPCO
Amin Banitalebi-Dehkordi, Yuanyuan Dong, Mahsa T. Pourazad, Panos Nasiopoulos
2015 C conf
ICCE
H. Shahid, D. Li, A. Fanaswala, Mahsa T. Pourazad, Panos Nasiopoulos
2015 C conf
ICCE
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos, Jim Slevinsky
2015 conf
ICC Workshops
Aman Jassal, Basak Oztas, Mahsa T. Pourazad, Panos Nasiopoulos
2015 B conf
QoMEX
Abrar Wafa, Panos Nasiopoulos, Victor C. M. Leung, Mahsa T. Pourazad
2015 B conf
QoMEX
Maryam Azimi, Ronan Boitard, Basak Oztas, Stelios E. Ploumis, Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2015 J jnl
IEEE Consumer Electron. Mag.
Ronan Boitard, Mahsa T. Pourazad, Panos Nasiopoulos, Jim Slevinsky
2015 J jnl
Hum. centric Comput. Inf. Sci.
Bambang A. B. Sarif, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung, Amr Mohamed
2015 conf
ICME Workshops
Mahsa T. Pourazad, Da Zhou, Keith Lee, Saeed Karimifard, Ilya Ganelin, Panos Nasiopoulos
2014 Misc conf
ICASSP
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2014 Misc conf
ICNC
Basak Oztas, Mahsa T. Pourazad, Panos Nasiopoulos, Iraj Sodagar, Victor C. M. Leung
2014 B conf
ICIP
S. Mohsen Amiri, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2014 C conf
ICCE
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2014 C conf
QSHINE
Amin Banitalebi-Dehkordi, Mehran Azimi, Mahsa T. Pourazad, Panos Nasiopoulos
2014 C conf
QSHINE
Chamitha de Alwis, Hemantha Kodikara Arachchi, Anil Fernando, Mahsa T. Pourazad
2014 B conf
ICIP
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2014 C conf
ICCE
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2014 Misc conf
ICNC
S. Mohsen Amiri, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2014 C conf
QSHINE
Emad Danish, Anil Fernando, Omar Abdul-Hameed, Mahsa T. Pourazad
2014 C conf
QSHINE
Ryan Perera, Anil Fernando, Thanuja Mallikarachchi, Hemantha Kodikara Arachchi, Mahsa T. Pourazad
2014 conf
ISCCSP
Maryam Azimi, Mahsa T. Pourazad, Panos Nasiopoulos
2013 conf
IVMSP
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2013 Misc conf
ICASSP
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2013 conf
DSP
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2013 C conf
ICCE
Iliya Koreshev, Mahsa T. Pourazad, Panos Nasiopoulos
2013 conf
3DTV-Conference
Amin Banitalebi-Dehkordi, Mahsa T. Pourazad, Panos Nasiopoulos
2013 Misc conf
ICASSP
Hamid Reza Tohidypour, Mahsa T. Pourazad, Panos Nasiopoulos
2013 C conf
WOWMOM
Bambang A. B. Sarif, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2013 conf
BCI
Hamid Reza Tohidypour, Hossein Bashashati, Mahsa T. Pourazad, Panos Nasiopoulos
2013 C conf
Healthcom
S. Mohsen Amiri, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2012 conf
ICECS
Basak Oztas, Mahsa T. Pourazad, Panos Nasiopoulos, Victor C. M. Leung
2012 conf
ICCE-Berlin
Zicong Mai, Mahsa T. Pourazad, Panos Nasiopoulos
2012 C conf
ICCE
Zicong Mai, Mahsa T. Pourazad, Panos Nasiopoulos, Konstantinos N. Plataniotis
2012 J jnl
IEEE Consumer Electron. Mag.
Mahsa T. Pourazad, Colin Doutre, Maryam Azimi, Panos Nasiopoulos
2012 conf
3DTV-Conference
Iliya Koreshev, Mahsa T. Pourazad, Panos Nasiopoulos
2012 B conf
ICTAI
Mahsa T. Pourazad, Di Xu, Panos Nasiopoulos
2011 B conf
QoMEX
Zicong Mai, Mahsa T. Pourazad, Panos Nasiopoulos
2011 B conf
ICIP
Mahsa T. Pourazad, Zicong Mai, Panos Nasiopoulos, Kostas N. Plataniotis, Rabab K. Ward
2010 C conf
ISCAS
Colin Doutre, Mahsa T. Pourazad, Alexis M. Tourapis, Panos Nasiopoulos, Rabab K. Ward
2010 J jnl
EURASIP J. Image Video Process.
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2010 conf
ICECS
Mahsa T. Pourazad, Panos Nasiopoulos, Ali Bashashati
2009 conf
DPS
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2009 J jnl
IEEE Trans. Consumer Electron.
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2009 B conf
ICIP
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2009 B conf
MMM
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab Kreidieh Ward
2006 conf
EUSIPCO
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab Kreidieh Ward
2006 J jnl
Medical Biol. Eng. Comput.
Mahsa T. Pourazad, Zahra Moussavi, G. Thomas
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 "";
        }
    }
}