Chamseddine Zaki

27 papers B 1Journal 19Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Ambient Intell. Humaniz. Comput.
Firas Salika, Chamseddine Zaki, Hassan Harb, Jenan Abou Zour, Eric Saux
2025 conf
ICC
Sarah Ismail, Abbass Nasser, Alaaeddine Ramadan, Chamseddine Zaki, Sofiane Hamrioui, Pascal Lorenz
2025 conf
ICC
Nancy Boughannam, Sofiane Hamrioui, Chamseddine Zaki, Alaaeddine Ramadan, Abbass Nasser, Pascal Lorenz
2025 J jnl
IEEE Access
Souha Al Katat, Chamseddine Zaki, Hussein Hazimeh, Ibrahim El Bitar, Rafael Angarita, Lionel Trojman
2025 J jnl
Discov. Comput.
Hassan Salman, Chamseddine Zaki, Nour Charara, Sonia Guehis, Jean-François Pradat-Peyre, Abbass Nasser
2025 J jnl
Internet Things
Abbass Nasser, Hussein Al Haj Hassan, Alaaeddine Ramadan, Chamseddine Zaki, Nada Sarkis, Jad Abou Chaaya, Ali Mansour
2025 J jnl
Veh. Commun.
Nourhan Bachir, Chamseddine Zaki, Hassan Harb, Roland Billen
2024 J jnl
J. Locat. Based Serv.
Adib Saliba, Kifah Tout, Chamseddine Zaki, Christophe Claramunt
2024 J jnl
ISPRS Int. J. Geo Inf.
Adib Saliba, Kifah Tout, Chamseddine Zaki, Christophe Claramunt
2024 J jnl
Internet Things
Hassan Harb, Clara Abou Nader, Ali Jaber, Mourad Hakem, Jean-Claude Charr, Chady Abou Jaoude, Chamseddine Zaki
2024 B conf
WiMob
Mohamad Kheir El Dine, Hussein Al Haj Hassan, Ali Mansour, Abbass Nasser, Chamseddine Zaki, Azza Moawad
2024 J jnl
J. Ambient Intell. Humaniz. Comput.
Firas Salika, Hassan Harb, Chamseddine Zaki, Eric Saux
2024 J jnl
IEEE Trans. Big Data
Souha Al Katat, Chamseddine Zaki, Hussein Hazimeh, Ibrahim El Bitar, Rafael Angarita, Lionel Trojman
2024 conf
VTC Fall
Nourhan Bachir, Hassan Harb, Chamseddine Zaki, Roland Billen
2023 J jnl
IEEE Access
Ersin Elbasi, Nour Mostafa, Zakwan AlArnaout, Aymen I. Zreikat, Elda Cina, Greeshma Varghese, Ahmed Shdefat, Ahmet E. Topcu, Wiem Abdelbaki, Shinu Mathew, Chamseddine Zaki
2023 J jnl
Comput. Electr. Eng.
Nourhan Bachir, Hassan Harb, Chamseddine Zaki, Michel Nabaa, Gilles-Antoine Nys, Roland Billen
2023 conf
ApplePies
Mohamad Kheir El Dine, Hussein Al Haj Hassan, Abbass Nasser, Chamseddine Zaki, Azza Moawad, Ali Mansour
2022 conf
ISCIT
Firas Salika, Chamseddine Zaki, Eric Saux, Hassan Harb
2022 J jnl
Wirel. Pers. Commun.
Hassan Harb, Chady Abou Jaoude, David Laiymani, Abdallah Makhoul, Chamseddine Zaki, Layla Tannoury
2022 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Kamila Koteish, Hassan Harb, Mohammad Dbouk, Chamseddine Zaki, Chady Abou Jaoude
2022 J jnl
EURASIP J. Wirel. Commun. Netw.
Hussein Baalbaki, Hassan Harb, Ameer Sardar Kwekha Rashid, Ali Jaber, Chady Abou Jaoude, Chamseddine Zaki, Kifah Tout
2021 J jnl
Internet Things
Maxime Mroue, Abbass Nasser, Benoît Parrein, Ali Mansour, Chamseddine Zaki, Eduardo Motta Cruz
2019 J jnl
Rev. Int. Géomatique
Chamseddine Zaki, Mohamed Ayet Allah Bilel Soussi
2015 J jnl
Rev. Int. Géomatique
Frédéric Bertrand, Cyril Faucher, Jean-Yves Lafaye, Guillaume Moreau, Myriam Servières, Chamseddine Zaki
2011 J jnl
Intell. Decis. Technol.
Chamseddine Zaki, Elyes Zekri, Myriam Servières, Guillaume Moreau, Gérard Hégron
2011 conf
ICSDM
Chamseddine Zaki, Myriam Servières, Guillaume Moreau
2011 conf
ER Workshops
Chamseddine Zaki, Myriam Servières, Guillaume Moreau
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 "";
        }
    }
}