Hamid R. Jamali

75 papers Journal 71Unranked 4
YearRankTypeTitle / Venue / Authors
2026 J jnl
Learn. Publ.
Hamid R. Jamali, Simon Wakeling, Edward J. Luca
2026 J jnl
Learn. Publ.
Hamid R. Jamali, Majid Nabavi, Mozhgan Oroji, Ebrahim Emrani
2026 J jnl
Learn. Publ.
Edward J. Luca, Simon Wakeling, Hamid R. Jamali
2025 J jnl
Scientometrics
Hamid R. Jamali
2024 J jnl
Scientometrics
Hamid R. Jamali
2024 J jnl
Learn. Publ.
David Nicholas, Jorge Revez, Abdullah Abrizah, Blanca Rodríguez-Bravo, Cherifa Boukacem-Zeghmouri, David J. Clark, Jie Xu, Marzena Swigon, Anthony Watkinson, Hamid R. Jamali, Eti Herman
2024 J jnl
Inf. Res.
Simon Wakeling, Monique Shephard, Hamid R. Jamali
2024 J jnl
Learn. Publ.
David J. Clark, David Nicholas, Eti Herman, Abdullah Abrizah, Anthony Watkinson, Blanca Rodríguez-Bravo, Cherifa Boukacem-Zeghmouri, Marzena Swigon, Jie Xu, Hamid R. Jamali, David Sims, Galina Serbina
2023 J jnl
Public Libr. Q.
Philip Hider, Jane Garner, Simon Wakeling, Hamid R. Jamali
2023 J jnl
Learn. Publ.
David Nicholas, Cherifa Boukacem-Zeghmouri, Blanca Rodríguez-Bravo, Eti Herman, Abdullah Abrizah, David J. Clark, Galina Serbina, David Sims, Marzena Swigon, Jie Xu, Anthony Watkinson, Hamid R. Jamali, Carol Tenopir, Suzie Allard
2023 J jnl
Scientometrics
Hamid R. Jamali, Alireza Abbasi
2023 J jnl
Learn. Publ.
Eti Herman, David Nicholas, David J. Clark, Cherifa Boukacem-Zeghmouri, Blanca Rodríguez-Bravo, Abdullah Abrizah, David Sims, Anthony Watkinson, Jie Xu, Galina Serbina, Marzena Swigon, Hamid R. Jamali, Carol Tenopir, Suzie Allard
2023 J jnl
Scientometrics
Giovanni Abramo, Isidro F. Aguillo, Dag W. Aksnes, Kevin W. Boyack, Quentin L. Burrell, Juan Miguel Campanario, Zaida Chinchilla-Rodríguez, Rodrigo Costas, Ciriaco Andrea D'Angelo, Anne-Wil Harzing, Hamid R. Jamali, Vincent Larivière, Loet Leydesdorff, Marc Luwel, Ben Martin, Philipp Mayr, Katherine W. McCain, Isabella Peters, Ismael Ràfols, Nicolás Robinson-García, Torben Schubert, Henry Small, Cassidy R. Sugimoto, Mike Thelwall, Peter van den Besselaar, Thed N. van Leeuwen, Ludo Waltman
2023 J jnl
Learn. Publ.
David Nicholas, Eti Herman, David J. Clark, Cherifa Boukacem-Zeghmouri, Blanca Rodríguez-Bravo, Abdullah Abrizah, Anthony Watkinson, David Sims, Marzena Swigon, Jie Xu, Galina Serbina, Hamid R. Jamali, Carol Tenopir, Suzie Allard
2023 J jnl
Learn. Publ.
David Nicholas, Eti Herman, Cherifa Boukacem-Zeghmouri, Blanca Rodríguez-Bravo, Anthony Watkinson, Abdullah Abrizah, Marzena Swigon, Jie Xu, David Sims, Galina Serbina, David J. Clark, Hamid R. Jamali, Carol Tenopir, Suzie Allard
2023 J jnl
J. Inf. Sci.
Atiyeh Baghestani Tajali, Azam Sanatjoo, Hassan Behzadi, Hamid R. Jamali
2022 J jnl
Learn. Publ.
David Nicholas, Eti Herman, David J. Clark, Cherifa Boukacem-Zeghmouri, Blanca Rodríguez-Bravo, Abdullah Abrizah, Anthony Watkinson, Jie Xu, David Sims, Galina Serbina, Marzena Swigon, Hamid R. Jamali, Carol Tenopir, Suzie Allard
2022 J jnl
Inf. Res.
Simon Wakeling, Danny Kingsley, Hamid R. Jamali, Mary Anne Kennan, Maryam Sarrafzadeh
2022 J jnl
Learn. Publ.
Hamid R. Jamali, Simon Wakeling, Alireza Abbasi
2022 J jnl
Inf. Res.
Hamid R. Jamali, Majid Nabavi
2022 J jnl
Learn. Publ.
Hamid R. Jamali, Simon Wakeling, Alireza Abbasi
2020 J jnl
Learn. Publ.
David Nicholas, Hamid R. Jamali, Eti Herman, Anthony Watkinson, Abdullah Abrizah, Blanca Rodríguez-Bravo, Cherifa Boukacem-Zeghmouri, Jie Xu, Marzena Swigon, Tatiana Polezhaeva
2020 J jnl
Comput. Educ.
Delneshin Danaei, Hamid R. Jamali, Yazdan Mansourian, Hassan Rastegarpour
2020 J jnl
Learn. Publ.
Hamid R. Jamali, David Nicholas, Anthony Watkinson, Abdullah Abrizah, Blanca Rodríguez-Bravo, Cherifa Boukacem-Zeghmouri, Jie Xu, Tatiana Polezhaeva, Eti Herman, Marzena Swigon
2020 J jnl
Learn. Publ.
Hamid R. Jamali, David Nicholas, Eti Herman, Cherifa Boukacem-Zeghmouri, Abdullah Abrizah, Blanca Rodríguez-Bravo, Jie Xu, Marzena Swigon, Tatiana Polezhaeva, Anthony Watkinson
2020 J jnl
Data Inf. Manag.
Sara Behimehr, Hamid R. Jamali
2020 J jnl
J. Sci. Res.
Alireza Abbasi, Hamid R. Jamali
2020 J jnl
J. Inf. Sci.
Hamid R. Jamali, Alireza Abbasi, Lutz Bornmann
2019 conf
ASIST
Hamid R. Jamali, Fariborz Foroutan
2019 conf
ISSI
Alireza Abbasi, Hamid R. Jamali
2018 J jnl
Scientometrics
Hamid R. Jamali, Majid Nabavi, Saeid Asadi
2018 J jnl
Scientometrics
Hamid R. Jamali, Ghasem Azadi-Ahmadabadi, Saeid Asadi
2018 J jnl
Inf. Res.
Philip Hider, Hollie White, Hamid R. Jamali
2017 conf
ISSI
Hamid R. Jamali, Saeid Asadi, Ghasem Azadi-Ahmadabadi
2017 J jnl
Scientometrics
Hamid R. Jamali
2017 J jnl
Aslib J. Inf. Manag.
Hamid R. Jamali, Pria Shahbaztabar
2016 J jnl
Program
Majid Nabavi, Keith G. Jeffery, Hamid R. Jamali
2016 J jnl
Inf. Process. Manag.
Anthony Watkinson, David Nicholas, Clare Thornley, Eti Herman, Hamid R. Jamali, Rachel Volentine, Suzie Allard, Kenneth J. Levine, Carol Tenopir
2016 J jnl
J. Assoc. Inf. Sci. Technol.
Carol Tenopir, Kenneth J. Levine, Suzie Allard, Lisa Christian, Rachel Volentine, Reid I. Boehm, Frances Nichols, David Nicholas, Hamid R. Jamali, Eti Herman, Anthony Watkinson
2015 J jnl
Learn. Publ.
David Nicholas, Eti Herman, Hamid R. Jamali, Blanca Rodríguez-Bravo, Cherifa Boukacem-Zeghmouri, Tom Dobrowolski, Stéphanie Pouchot
2015 J jnl
Scientometrics
Hamid R. Jamali, Majid Nabavi
2015 J jnl
Learn. Publ.
David Nicholas, Anthony Watkinson, Hamid R. Jamali, Eti Herman, Carol Tenopir, Rachel Volentine, Suzie Allard, Kenneth J. Levine
2015 J jnl
Inf. Res.
Clare Thornley, Anthony Watkinson, David Nicholas, Rachel Volentine, Hamid R. Jamali, Eti Herman, Suzie Allard, Kenneth J. Levine, Carol Tenopir
2014 J jnl
Aslib J. Inf. Manag.
Hamid R. Jamali, Bill Russell, David Nicholas, Anthony Watkinson
2014 J jnl
Learn. Publ.
David J. Clark, David Nicholas, Hamid R. Jamali
2013 J jnl
Webology
Hamid R. Jamali
2013 J jnl
Webology
David Nicholas, Ian Rowlands, Anthony Watkinson, David Brown, Bill Russell, Hamid R. Jamali
2013 J jnl
J. Sci. Res.
Fariba Tohidinasab, Hamid R. Jamali
2011 J jnl
Aslib Proc.
Zohreh Dehghani, Ebrahim Afshar, Hamid R. Jamali, Mohammad Ali Nematbakhsh
2011 J jnl
Scientometrics
Hamid R. Jamali, Mahsa Nikzad
2011 J jnl
J. Medical Syst.
Seyed Hesam Seyedin, Hamid R. Jamali
2010 J jnl
J. Documentation
David Nicholas, Ian Rowlands, Paul Huntington, Hamid R. Jamali, Patricia Hernández Salazar
2010 J jnl
Online Inf. Rev.
Hamid R. Jamali, Saeid Asadi
2010 J jnl
Electron. Libr.
Dariush Alimohammadi, Hamid R. Jamali
2009 J jnl
J. Documentation
David Nicholas, Paul Huntington, Hamid R. Jamali, Ian Rowlands, Maggie Fieldhouse
2008 J jnl
Aslib Proc.
Hamid R. Jamali, David Nicholas
2008 J jnl
Aslib Proc.
Mehrnoush Mozaffarian, Hamid R. Jamali
2008 J jnl
Aslib Proc.
Ian Rowlands, David Nicholas, Peter Williams, Paul Huntington, Maggie Fieldhouse, Barrie Gunter, Richard Withey, Hamid R. Jamali, Tom Dobrowolski, Carol Tenopir
2008 J jnl
Aslib Proc.
David Nicholas, Ian Rowlands, David J. Clark, Paul Huntington, Hamid R. Jamali, Candela Ollé
2008 J jnl
Aslib Proc.
David Nicholas, Paul Huntington, Hamid R. Jamali, Ian Rowlands, Tom Dobrowolski, Carol Tenopir
2007 J jnl
Aslib Proc.
Paul Huntington, David Nicholas, Hamid R. Jamali, Chris Russell
2007 J jnl
Webology
Saeid Asadi, Xiaofang Zhou, Hamid R. Jamali, Hossein Vakili Mofrad
2007 J jnl
J. Documentation
Hamid R. Jamali
2007 J jnl
J. Documentation
David Nicholas, Paul Huntington, Hamid R. Jamali
2007 J jnl
Learn. Publ.
David Nicholas, Paul Huntington, Hamid R. Jamali
2007 J jnl
Aslib Proc.
Ian Rowlands, David Nicholas, Hamid R. Jamali, Paul Huntington
2006 J jnl
Webology
Hamid R. Jamali
2006 conf
ASIST
Hamid R. Jamali, David Nicholas
2006 J jnl
Learn. Publ.
David Nicholas, Hamid R. Jamali, Ian Rowlands
2006 J jnl
Aslib Proc.
Peter Williams, Hamid R. Jamali, David Nicholas
2006 J jnl
J. Documentation
David Nicholas, Paul Huntington, Hamid R. Jamali, Carol Tenopir
2005 J jnl
Webology
Hamid R. Jamali
2005 J jnl
Learn. Publ.
David Nicholas, Paul Huntington, Bill Russell, Anthony Watkinson, Hamid R. Jamali, Carol Tenopir
2005 J jnl
Aslib Proc.
Hamid R. Jamali, David Nicholas, Paul Huntington
2004 J jnl
Webology
Saeid Asadi, Hamid R. Jamali
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 "";
        }
    }
}