Nadjet Kamel

48 papers B 1C 2Misc 1Journal 20Unranked 24
YearRankTypeTitle / Venue / Authors
2026 J jnl
Concurr. Comput. Pract. Exp.
Asma Douadi, Nadjet Kamel, Lakhdar Sais
2025 J jnl
Concurr. Comput. Pract. Exp.
Mohamed Amine Laamari, Nadjet Kamel
2025 conf
RIF
Djihad Arrar, Nadjet Kamel, Saad Harous
2025 conf
RIF
Meriem Sellami, Djihad Arrar, Raid Nedjm Eddine Dekkar, Mohamed El Amine Bouchareb, Nadjet Kamel
2025 J jnl
Int. J. Data Sci. Anal.
Djihad Arrar, Chahinez Ounoughi, Nadjet Kamel, Tarmo Kalvet, Marek Tiits, Sadok Ben Yahia
2024 J jnl
Comput. Sci. J. Moldova
Kamel Eddine Heraguemi, Nadjet Kamel, Majdi M. Mafarja
2024 J jnl
Expert Syst. J. Knowl. Eng.
Widad Hassina Belkadi, Yassine Drias, Habiba Drias, Mustapha Dali, Samira Hamdous, Nadjet Kamel, Djemai Aksa
2024 J jnl
J. Supercomput.
Djihad Arrar, Nadjet Kamel, Abdelaziz Lakhfif
2024 conf
ICT-DM
Djihad Arrar, Nadjet Kamel, Allaoua Refoufi
2024 J jnl
J. Supercomput.
Asma Douadi, Nadjet Kamel, Lakhdar Sais
2024 conf
ICT-DM
Meriem Sellami, Ramzi Hadrouk, Sofiane Chelghoum, Ramzi Badache, Nadjet Kamel, Abdelaziz Lakhfif
2022 J jnl
Concurr. Comput. Pract. Exp.
Youcef Belkhiri, Nadjet Kamel, Habiba Drias
2022 J jnl
Int. J. Data Min. Model. Manag.
Ikram Nekkache, Saïd Jabbour, Nadjet Kamel, Lakhdar Sais
2021 J jnl
Int. J. Swarm Intell. Res.
Saida Ishak Boushaki, Omar Bendjeghaba, Nadjet Kamel
2021 B conf
CPAIOR
Ikram Nekkache, Saïd Jabbour, Lakhdar Sais, Nadjet Kamel
2020 J jnl
Int. J. Data Min. Model. Manag.
Imane Messaoudi, Nadjet Kamel
2019 J jnl
Appl. Intell.
Imane Messaoudi, Nadjet Kamel
2019 J jnl
Int. J. Artif. Intell. Tools
Imane Messaoudi, Nadjet Kamel
2019 conf
ICCCI (2)
Youcef Belkhiri, Nadjet Kamel, Habiba Drias
2018 J jnl
Expert Syst. Appl.
Saida Ishak Boushaki, Nadjet Kamel, Omar Bendjeghaba
2018 J jnl
Appl. Intell.
Abdelhak Bousbaci, Nadjet Kamel
2018 J jnl
J. Inf. Knowl. Manag.
Saida Ishak Boushaki, Nadjet Kamel, Omar Bendjeghaba
2018 J jnl
Int. J. Bio Inspired Comput.
Kamel Eddine Heraguemi, Nadjet Kamel, Habiba Drias
2017 conf
WorldCIST (2)
Youcef Belkhiri, Nadjet Kamel, Habiba Drias, Sofiane Yahiaoui
2016 conf
ACIIDS (2)
Youcef Belkhiri, Nadjet Kamel, Habiba Drias
2016 Misc conf
DCAI
Abdelhak Bousbaci, Nadjet Kamel
2016 conf
MIKE
Kamel Eddine Heraguemi, Nadjet Kamel, Habiba Drias
2016 J jnl
Appl. Intell.
Kamel Eddine Heraguemi, Nadjet Kamel, Habiba Drias
2015 conf
IPAC
Mohamed Amine Laamari, Nadjet Kamel
2015 conf
MIKE
Yasmin Aboubi, Habiba Drias, Nadjet Kamel
2015 conf
CIIA
Saida Ishak Boushaki, Nadjet Kamel, Omar Bendjeghaba
2015 conf
ICCCI (1)
Kamel Eddine Heraguemi, Nadjet Kamel, Habiba Drias
2014 conf
BIC-TA
Mohamed Amine Laamari, Nadjet Kamel
2014 conf
SCDM
Yasmina Boughachiche, Nadjet Kamel
2014 conf
IC2IT
Nadjet Kamel, Rafik Boucheta
2014 conf
SCDM
Saida Ishak Boushaki, Nadjet Kamel, Omar Bendjeghaba
2014 C conf
HIS
Abdelhak Bousbaci, Nadjet Kamel
2014 conf
BIC-TA
Kamel Eddine Heraguemi, Nadjet Kamel, Habiba Drias
2013 conf
ICGEC
Saida Ishak Boushaki, Nadjet Kamel, Omar Bendjeghaba
2013 conf
ICGEC
Nadjet Kamel, Imane Ouchen, Karim Baali
2013 J jnl
Int. J. Comput. Aided Eng. Technol.
Nassima Aleb, Zahia Tamen, Nadjet Kamel
2011 C conf
MEDI
Nassima Aleb, Zahia Tamen, Nadjet Kamel
2009 J jnl
Int. J. Softw. Tools Technol. Transf.
Yamine Aït Ameur, Mickaël Baron, Nadjet Kamel, Jean-Marc Mota
2008 conf
Software Engineering Research and Practice
Nadjet Kamel, Sid-Ahmed Selouani, Habib Hamam
2008 conf
AMBI-SYS
Nadjet Kamel, Yamine Aït Ameur, Sid-Ahmed Selouani, Habib Hamam
2007 conf
ICPS
Nadjet Kamel, Yamine Aït Ameur
2004 conf
IFIP Congress Topical Sessions
Yamine Aït Ameur, Nadjet Kamel
2004 conf
IHM
Nadjet Kamel
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 "";
        }
    }
}