Raheel Nawaz

121 papers B 3C 1Misc 1Journal 97Unranked 19
YearRankTypeTitle / Venue / Authors
2025 J jnl
Frontiers Artif. Intell.
Sidra Hameed, Muhammad Nauman, Nadeem Akhtar, Muhammad A. B. Fayyaz, Raheel Nawaz
2025 J jnl
IEEE Access
Muhammad Nauman, Ahmad S. Almadhor, Mohammed Albekairi, Ali R. Ansari, Muhammad A. B. Fayyaz, Raheel Nawaz
2025 J jnl
ACM Trans. Asian Low Resour. Lang. Inf. Process.
Muhammad Rauf Tabassam, Hajra Waheed, Iqra Safder, Raheem Sarwar, Naif Radi Aljohani, Raheel Nawaz, Saeed-Ul Hassan, Farooq Zaman, Muhammad Ahtazaz Ahsan
2024 J jnl
IEEE Access
Anum Jaffar, Sara Ali, Khawaja Fahad Iqbal, Yasar Ayaz, Ali R. Ansari, Muhammad A. B. Fayyaz, Raheel Nawaz
2024 J jnl
J. Ambient Intell. Humaniz. Comput.
Muhammad Hadi, Iqra Safder, Hajra Waheed, Farooq Zaman, Naif Radi Aljohani, Raheel Nawaz, Saeed-Ul Hassan, Raheem Sarwar
2024 J jnl
Neural Comput. Appl.
Esha Sadia Nasir, Shahzad Rasool, Raheel Nawaz, Muhammad Moazam Fraz
2024 J jnl
IEEE Access
Raheem Sarwar, Le An Ha, Pin Shen Teh, Fahad Sabah, Raheel Nawaz, Ibrahim A. Hameed, Muhammad Umair Hassan
2024 J jnl
ACM Trans. Asian Low Resour. Lang. Inf. Process.
Raheem Sarwar, Maneesha Perera, Pin Shen Teh, Raheel Nawaz, Muhammad Umair Hassan
2024 J jnl
IEEE Access
Hamza Shabbir Minhas, Hammad Nazeer, Noman Naseer, Umar Shahbaz Khan, Ali R. Ansari, Raheel Nawaz
2024 J jnl
IEEE Access
Taher Al-Shehari, Domenico Rosaci, Muna S. Al-Razgan, Taha Alfakih, Mohammed Kadrie, Hammad Afzal, Raheel Nawaz
2024 J jnl
IEEE Access
Adeel Wahab, Umar Shahbaz Khan, Tahir Nawaz, Hassan Akbar, Syed Tayyab Hussain Shah, Azfar Khalid, Ali R. Ansari, Raheel Nawaz
2024 J jnl
IEEE Access
Zeeshan Anwar, Hammad Afzal, Taher Al-Shehari, Muna S. Al-Razgan, Taha Alfakih, Raheel Nawaz
2024 J jnl
IEEE Access
Haseeb Amjad, Nija Asif, Hassan Elahi, Umar Shahbaz Khan, Hassan Akbar, Ali R. Ansari, Raheel Nawaz
2024 J jnl
IEEE Access
Shahab Uddin, Tahir Nawaz, James M. Ferryman, Nasir Rashid, Md. Asaduzzaman, Raheel Nawaz
2024 J jnl
J. Ambient Intell. Humaniz. Comput.
Iqra Safder, Muhammad Abu Bakar, Farooq Zaman, Hajra Waheed, Naif Radi Aljohani, Raheel Nawaz, Saeed-Ul Hassan
2024 J jnl
Comput. Electron. Agric.
Muhammad Salman Akhtar, Zuhair Zafar, Raheel Nawaz, Muhammad Moazam Fraz
2023 J jnl
Displays
Mingxuan Zhang, Muhammad Umair Hassan, Dongmei Niu, Xiuyang Zhao, Raheel Nawaz, Ibrahim A. Hameed, Saeed-Ul Hassan
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Chen Liang, Thar Baker, Yuanzhang Li, Raheel Nawaz, Yu-an Tan
2023 J jnl
IEEE Access
Tahira Naseem, Abbas Javed, Mirza Tariq Hamayun, Muhammad Jawad, Ejaz Ahmad Ansari, Muhammad A. B. Fayyaz, Ali R. Ansari, Raheel Nawaz
2023 J jnl
IEEE Access
Naureen Zainab, Hammad Afzal, Taher Al-Shehari, Muna S. Al-Razgan, Naima Iltaf, Muhammad Zakria, Muhammad Javed Hyder, Raheel Nawaz
2023 J jnl
Expert Syst. Appl.
Hajra Waheed, Saeed-Ul Hassan, Raheel Nawaz, Naif R. Aljohani, Guanliang Chen, Dragan Gasevic
2023 J jnl
IEEE Access
Waleed Afandi, Syed Muhammad Ammar Hassan Bukhari, Muhammad Usman Shahid Khan, Tahir Maqsood, Muhammad A. B. Fayyaz, Ali R. Ansari, Raheel Nawaz
2023 J jnl
J. Inf. Sci.
Saeed-Ul Hassan, Naif Radi Aljohani, Usman Iqbal Tarar, Iqra Safder, Raheem Sarwar, Salem Alelyani, Raheel Nawaz
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Muhammad Kashif Afzal, Matthew Shardlow, Suppawong Tuarob, Farooq Zaman, Raheem Sarwar, Mohsen Ali, Naif Radi Aljohani, Miltiades D. Lytras, Raheel Nawaz, Saeed-Ul Hassan
2023 J jnl
J. Assoc. Inf. Sci. Technol.
Iqra Safder, Momin Ali, Naif Radi Aljohani, Raheel Nawaz, Saeed-Ul Hassan
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Muhammad Asad Manzoor, Saeed-Ul Hassan, Amina Muazzam, Suppawong Tuarob, Raheel Nawaz
2022 J jnl
PeerJ Comput. Sci.
Umer Rashid, Aiman Javid, Abdur Rehman Khan, Leo Liu, Adeel Ahmed, Osman Khalid, Khalid Saleem, Shaista Meraj, Uzair Iqbal, Raheel Nawaz
2022 J jnl
IEEE Wirel. Commun.
Qianqian Pan, Jun Wu, Ali Kashif Bashir, Jianhua Li, Sahil Vashisht, Raheel Nawaz
2022 J jnl
Comput. Commun.
Xiao Zheng, Syed Bilal Hussain Shah, Ali Kashif Bashir, Raheel Nawaz, Omer F. Rana
2022 J jnl
Sensors
Jamal Nasir, Aftab Ahmad Khan, Shoaib Khaliq, Muhammad Bilal Qureshi, Irfan Ullah, Leo Liu, Raheel Nawaz
2022 J jnl
CoRR
Shah Rukh Qasim, Nadezda Chernyavskaya, Jan Kieseler, Kenneth Long, Oleksandr Viazlo, Maurizio Pierini, Raheel Nawaz
2022 J jnl
Libr. Hi Tech
Noor Arshad, Abu Bakar, Saira Hanif Soroya, Iqra Safder, Sajjad Haider, Saeed-Ul Hassan, Naif Radi Aljohani, Salem Alelyani, Raheel Nawaz
2022 conf
RIIFORUM
Hadi Karami, Sofiane Tebboune, Diane Hart, Raheel Nawaz
2022 J jnl
IEEE Trans. Green Commun. Netw.
Himanshi Babbar, Shalli Rani, Ali Kashif Bashir, Raheel Nawaz
2022 conf
RIIFORUM
Mandy Parkinson, Jackie Carter, Raheel Nawaz
2022 conf
RIIFORUM
Salem AlJanah, Pin Shen Teh, Jin Yee Tay, Opeoluwa Aiyenitaju, Raheel Nawaz
2022 J jnl
Expert Syst. Appl.
Matthew Shardlow, Luciano Gerber, Raheel Nawaz
2022 J jnl
Appl. Artif. Intell.
Iqra Safder, Hafsa Batool, Raheem Sarwar, Farooq Zaman, Naif Radi Aljohani, Raheel Nawaz, Mohamed Gaber, Saeed-Ul Hassan
2022 conf
RIIFORUM
Hajra Waheed, Ifra Nisar, Mehr-un-Nisa Khalid, Ali Shahid, Naif Radi Aljohani, Saeed-Ul Hassan, Raheel Nawaz
2022 conf
DroneCom@MobiCom
Siyuan Li, Xi Lin, Jun Wu, Ali Kashif Bashir, Raheel Nawaz
2021 J jnl
Scientometrics
Sehrish Iqbal, Saeed-Ul Hassan, Naif Radi Aljohani, Salem Alelyani, Raheel Nawaz, Lutz Bornmann
2021 conf
GLOBECOM (Workshops)
Gunasekaran Raja, Yashvandh Baskar, Priyanka Dhanasekaran, Raheel Nawaz, Keping Yu
2021 J jnl
Comput. Electr. Eng.
Hajra Waheed, Muhammad Anas Hasnul, Saeed-Ul Hassan, Naif Radi Aljohani, Salem Alelyani, Ernest Edifor, Raheel Nawaz
2021 J jnl
Future Gener. Comput. Syst.
Anwar Said, Saeed-Ul Hassan, Suppawong Tuarob, Raheel Nawaz, Mudassir Shabbir
2021 J jnl
PeerJ Comput. Sci.
Anwar Said, Muhammad Umar Janjua, Saeed-Ul Hassan, Zeeshan Muzammal, Tania Saleem, Tipajin Thaipisutikul, Suppawong Tuarob, Raheel Nawaz
2021 J jnl
IEEE Internet Comput.
Muhammad Usman Shahid Khan, Assad Abbas, Attiqa Rehman, Raheel Nawaz
2021 J jnl
Sensors
Bizzat Hussain Zaidi, Ihsan Ullah, Musharraf Alam, Bamidele Adebisi, R. Muhammad Atif Azad, Ali R. Ansari, Raheel Nawaz
2021 J jnl
Int. J. Inf. Manag.
Saeed-Ul Hassan, Mudassir Shabbir, Sehrish Iqbal, Anwar Said, Faisal Kamiran, Raheel Nawaz, Umar Saif
2021 Misc conf
FIT
Duaa Baig, Muhammad Usman Shahid Khan, Darren Dancey, Assad Abbas, Mazhar Ali, Raheel Nawaz
2021 J jnl
ISPRS Int. J. Geo Inf.
Khydija Wakil, Ali Tahir, Muhammad Qadeer ul Hussnain, Abdul Waheed, Raheel Nawaz
2021 J jnl
IEEE Access
Muzammil Iqbal, Muhammad Jawad, Mujtaba Hussain Jaffery, Saleem Akhtar, Muhammad Nadeem Rafiq, Muhammad Bilal Qureshi, Ali R. Ansari, Raheel Nawaz
2021 conf
ICFNDS
Yakubu Tsado, Olamide Jogunola, Raheel Nawaz, Guan Gui, Bamidele Adebisi
2021 J jnl
J. Real Time Image Process.
Haseeb Hassan, Ali Kashif Bashir, Muhammad Ahmad, Varun G. Menon, Imran Uddin Afridi, Raheel Nawaz, Bin Luo
2021 J jnl
Expert Syst. J. Knowl. Eng.
Iqra Safder, Zainab Mahmood, Raheem Sarwar, Saeed-Ul Hassan, Farooq Zaman, Rao Muhammad Adeel Nawab, Faisal Bukhari, Rabeeh Ayaz Abbasi, Salem Alelyani, Naif Radi Aljohani, Raheel Nawaz
2021 J jnl
J. Inf. Sci.
Saeed-Ul Hassan, Aneela Saleem, Saira Hanif Soroya, Iqra Safder, Sehrish Iqbal, Saqib Jamil, Faisal Bukhari, Naif Radi Aljohani, Raheel Nawaz
2021 J jnl
Phys. Commun.
Noman Shabbir, Lauri Kütt, Muhammad Mahtab Alam, Priit Roosipuu, Muhammad Jawad, Muhammad Bilal Qureshi, Ali R. Ansari, Raheel Nawaz
2021 J jnl
Scientometrics
Raheem Sarwar, Afifa Zia, Raheel Nawaz, Ayman G. Fayoumi, Naif Radi Aljohani, Saeed-Ul Hassan
2020 J jnl
Sensors
Muhammad Jawad, Muhammad Bilal Qureshi, Sahibzada Muhammad Ali, Noman Shabbir, Muhammad Usman Shahid Khan, Afnan Aloraini, Raheel Nawaz
2020 J jnl
CoRR
Sehrish Iqbal, Saeed-Ul Hassan, Naif Radi Aljohani, Salem Alelyani, Raheel Nawaz, Lutz Bornmann
2020 J jnl
Sensors
Yifang Shi, Sundas Qayyum, Sufyan Ali Memon, Uzair Khan, Junaid Imtiaz, Ihsan Ullah, Darren Dancey, Raheel Nawaz
2020 J jnl
IEEE Access
Sara Ali, Faisal Mehmood, Muhammad Jawad Khan, Yasar Ayaz, Umer Asgher, Haleema Sadia, Ernest Edifor, Raheel Nawaz
2020 J jnl
Int. J. Inf. Manag.
Leo Liu, Weizi Li, Naif R. Aljohani, Miltiadis D. Lytras, Saeed-Ul Hassan, Raheel Nawaz
2020 conf
IIT
Wajid Khan, Sara Ali, Muhammad Usman Shahid Khan, Muhammad Jawad, Mazhar Ali, Raheel Nawaz
2020 J jnl
IEEE Access
Muhammad Asfand Yar Rustam, Bilal Khan, Sahibzada Muhammad Ali, Muhammad Bilal Qureshi, Chaudhary Arshad Mehmood, Muhammad Usman Shahid Khan, Raheel Nawaz
2020 J jnl
CoRR
Wasiq Khan, Abir Hussain, Sohail Ahmed Khan, Mohammed Al-Jumaily, Raheel Nawaz
2020 J jnl
Neural Comput. Appl.
Maham Jahangir, Hammad Afzal, Mehreen Ahmed, Khawar Khurshid, Muhammad Faisal Amjad, Raheel Nawaz, Haider Abbas
2020 J jnl
IEEE Access
Beenish Gul, Imran Ali Khan, Saad Mustafa, Osman Khalid, Syed Sajid Hussain, Darren Dancey, Raheel Nawaz
2020 J jnl
IEEE Access
Sara Ali, Faisal Mehmood, Yasar Ayaz, Muhammad Jawad Khan, Haleema Sadia, Raheel Nawaz
2020 J jnl
Inf. Process. Manag.
Iqra Safder, Saeed-Ul Hassan, Anna Visvizi, Thanapon Noraset, Raheel Nawaz, Suppawong Tuarob
2020 J jnl
Inf. Process. Manag.
Zainab Mahmood, Iqra Safder, Rao Muhammad Adeel Nawab, Faisal Bukhari, Raheel Nawaz, Ahmed S. Alfakeeh, Naif Radi Aljohani, Saeed-Ul Hassan
2020 J jnl
IEEE Access
Rumshaa Yunus, Sara Ali, Yasar Ayaz, Mushtaq Khan, Shamsa Kanwal, Uzma Akhlaque, Raheel Nawaz
2020 J jnl
CoRR
Saeed-Ul Hassan, Naif Radi Aljohani, Usman Iqbal Tarar, Iqra Safder, Raheem Sarwar, Salem Alelyani, Raheel Nawaz
2020 J jnl
Appl. Soft Comput.
Salman Ahmed, Saeed-Ul Hassan, Naif Radi Aljohani, Raheel Nawaz
2020 J jnl
IEEE Access
Farhan Riaz, Saad Rehman, Muhammad Ajmal Azad, Rehan Hafiz, Ali Hassan, Naif Radi Aljohani, Raheel Nawaz, Rupert C. D. Young, Miguel Tavares Coimbra
2020 J jnl
Inf. Process. Manag.
Farooq Zaman, Matthew Shardlow, Saeed-Ul Hassan, Naif Radi Aljohani, Raheel Nawaz
2020 J jnl
IEEE Access
Waqar Ahmed, Hammad Ansari, Bilal Khan, Zahid Ullah, Sahibzada Muhammad Ali, Chaudhry Arshad Mehmood, Muhammad Bilal Qureshi, Iqrar Hussain, Muhammad Jawad, Muhammad Usman Shahid Khan, Amjad Ullah, Raheel Nawaz
2020 J jnl
IEEE Access
Faisal Mehmood, Bilal Khan, Sahibzada Muhammad Ali, Muhammad Bilal Qureshi, C. Diver, Raheel Nawaz
2020 J jnl
IEEE Access
Naveed Taimoor, Ikramullah Khosa, Muhammad Jawad, Jahanzeb Akhtar, Imran Ghous, Muhammad Bilal Qureshi, Ali R. Ansari, Raheel Nawaz
2020 J jnl
Comput. Hum. Behav.
Hajra Waheed, Saeed-Ul Hassan, Naif Radi Aljohani, Julie Hardman, Salem Alelyani, Raheel Nawaz
2020 J jnl
Knowl. Based Syst.
Saeed-Ul Hassan, Naif R. Aljohani, Nimra Idrees, Raheem Sarwar, Raheel Nawaz, Eugenio Martínez-Cámara, Sebastián Ventura, Francisco Herrera
2020 J jnl
IEEE Access
Muhammad Hamza Asif Nizami, Zaid Ahsan Shah, Yasar Ayaz, Muhammad Jawad Khan, Sara Ali, Muhammad Naveed, Khalid Akhtar, Darren Dancey, Raheel Nawaz
2020 J jnl
IEEE Access
Danish Iqbal, Assad Abbas, Mazhar Ali, Muhammad Usman Shahid Khan, Raheel Nawaz
2020 J jnl
J. Ambient Intell. Humaniz. Comput.
Pin Shen Teh, Ning Zhang, Syh-Yuan Tan, Qi Shi, Wee-How Khoh, Raheel Nawaz
2019 J jnl
IEEE Access
Raza Yunus, Omar Arif, Hammad Afzal, Muhammad Faisal Amjad, Haider Abbas, Hira Noor Bokhari, Syeda Tazeen Haider, Nauman Zafar, Raheel Nawaz
2019 J jnl
J. Medical Syst.
Omar Arif, Hammad Afzal, Haider Abbas, Muhammad Faisal Amjad, Jiafu Wan, Raheel Nawaz
2019 J jnl
IEEE J. Biomed. Health Informatics
Farhan Riaz, Sidra Naeem, Raheel Nawaz, Miguel T. Coimbra
2019 J jnl
Sensors
Haseeb Ahmed, Ihsan Ullah, Uzair Khan, Muhammad Bilal Qureshi, Sajjad Manzoor, Muhammad Nazeer, Muhammad Usman Shahid Khan, Raheel Nawaz
2019 J jnl
IEEE Access
Sara Ali, Faisal Mehmood, Darren Dancey, Yasar Ayaz, Muhammad Jawad Khan, Noman Naseer, Rita De Cassia Amadeu, Haleema Sadia, Raheel Nawaz
2019 conf
MedPRAI
Faiza Rehman, Hira Masood, Adnan Ul-Hasan, Raheel Nawaz, Faisal Shafait
2019 conf
MedPRAI
Raaiha Humayun Kabir, Bisma Pervaiz, Tayyeba Muhammad Khan, Adnan Ul-Hasan, Raheel Nawaz, Faisal Shafait
2019 conf
WMT (3)
Noor-e-Hira, Sadaf Abdul-Rauf, Kiran Kiani, Ammara Zafar, Raheel Nawaz
2019 J jnl
IEEE Access
Hafeez Ur Rehman, Usman Habib, Umer Ijaz, Naveed Islam, Atta ur Rehman Khan, Raheel Nawaz
2019 J jnl
Scientometrics
Anwar Said, Timothy D. Bowman, Rabeeh Ayaz Abbasi, Naif Radi Aljohani, Saeed-Ul Hassan, Raheel Nawaz
2019 conf
ACL (1)
Matthew Shardlow, Raheel Nawaz
2019 C conf
DeSE
Wasiq Khan, Abir Hussain, Bilal Muhammed Khan, Raheel Nawaz, Thar Baker
2019 J jnl
IEEE Access
Ahmad Naseem Alvi, Sangrez Khan, Muhammad Awais Javed, Kostromitin Konstantin, Alaa Omran Almagrabi, Ali Kashif Bashir, Raheel Nawaz
2019 B conf
CBMS
Farhan Riaz, Rehan Nemati, Hina Ajmal, Ali Hassan, Ernest Edifor, Raheel Nawaz
2019 conf
ICTC
Pin Shen Teh, Ning Zhang, Syh-Yuan Tan, Qi Shi, Raheel Nawaz, Wee-How Khoh
2019 J jnl
IEEE Access
Rizwana Irfan, Osman Khalid, Muhammad Usman Shahid Khan, Faisal Rehman, Atta ur Rehman Khan, Raheel Nawaz
2018 J jnl
IEEE Access
Hajra Qadir, Osman Khalid, Muhammad Usman Shahid Khan, Atta ur Rehman Khan, Raheel Nawaz
2018 J jnl
Scientometrics
Saeed-Ul Hassan, Mubashir Imran, Sehrish Iqbal, Naif Radi Aljohani, Raheel Nawaz
2018 J jnl
J. Comput. Sci.
Fahad Anwar, Naima Iltaf, Hammad Afzal, Raheel Nawaz
2018 J jnl
BMC Medical Informatics Decis. Mak.
Matthew Shardlow, Riza Batista-Navarro, Paul Thompson, Raheel Nawaz, John McNaught, Sophia Ananiadou
2018 conf
ICADL
Saeed-Ul Hassan, Sehrish Iqbal, Mubashir Imran, Naif Radi Aljohani, Raheel Nawaz
2018 J jnl
CoRR
Zaid Tahir, Ahmed Hussain Qureshi, Yasar Ayaz, Raheel Nawaz
2018 J jnl
Robotics Auton. Syst.
Zaid Tahir, Ahmed Hussain Qureshi, Yasar Ayaz, Raheel Nawaz
2017 J jnl
CoRR
Maham Jahangir, Hammad Afzal, Mehreen Ahmed, Khawar Khurshid, Raheel Nawaz
2017 J jnl
Lang. Resour. Evaluation
Paul Thompson, Raheel Nawaz, John McNaught, Sophia Ananiadou
2017 conf
DASC/PiCom/DataCom/CyberSciTech
Komal Khalid, Hammad Afzal, Faiza Moqaddas, Naima Iltaf, Ahmed Muqeem Sheri, Raheel Nawaz
2013 J jnl
SIGWEB Newsl.
Sophia Ananiadou, Paul Thompson, Raheel Nawaz
2013 conf
CICLing (2)
Sophia Ananiadou, Paul Thompson, Raheel Nawaz
2013 conf
CICLing (1)
Riza Theresa Batista-Navarro, Georgios Kontonatsios, Claudiu Mihaila, Paul Thompson, Rafal Rak, Raheel Nawaz, Ioannis Korkontzelos, Sophia Ananiadou
2013 J jnl
BMC Bioinform.
Raheel Nawaz, Paul Thompson, Sophia Ananiadou
2013 conf
Digital Heritage (1)
Paul Thompson, Raheel Nawaz, Ioannis Korkontzelos, William J. Black, John McNaught, Sophia Ananiadou
2013 J jnl
Int. J. Comput. Linguistics Appl.
Raheel Nawaz, Paul Thompson, Sophia Ananiadou
2013 J jnl
Int. J. Comput. Linguistics Appl.
Raheel Nawaz, Paul Thompson, Sophia Ananiadou
2012 B conf
LREC
Raheel Nawaz, Paul Thompson, Sophia Ananiadou
2011 J jnl
BMC Bioinform.
Xinglong Wang, Rafal Rak, Angelo C. Restificar, Chikashi Nobata, C. J. Rupp, Riza Theresa Batista-Navarro, Raheel Nawaz, Sophia Ananiadou
2011 J jnl
BMC Bioinform.
Paul Thompson, Raheel Nawaz, John McNaught, Sophia Ananiadou
2010 conf
NeSp-NLP@ACL
Raheel Nawaz, Paul Thompson, Sophia Ananiadou
2010 B conf
LREC
Raheel Nawaz, Paul Thompson, John McNaught, Sophia Ananiadou
redb/extractors/decompiler/_archive/DecompileGhidra.py
← Index redb/extractors/decompiler/_archive/DecompileGhidra.py python
from hashlib import sha256, md5
import inspect
import subprocess
import json
import os
import time
from datetime import datetime, timezone
from typing import Dict, List, Any, Optional

from dotenv import load_dotenv
from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor
import magic
import pefile
import ppdeep
import tlsh


class DecompileGhidra(Extractor):
    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        filetype=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.ghidra_path = os.getenv("GHIDRA_PATH", "/opt/ghidra")
        self.java_script_path = os.getenv(
            "GHIDRA_SCRIPT_PATH",
            "/opt/ghidra/Ghidra/Features/Base/ghidra_scripts/GhidraDecompilerScript.java",
        )
        self.analysis_results = None
        self.ghidra_process = None  # Track the current process
        self.project_path = None
        self.filetype = filetype

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.TIMEOUT = int(os.getenv("GHIDRA_TIMEOUT", "1200"))
        except ValueError:
            self.log.warning(
                "Invalid GHIDRA_TIMEOUT value, using default of 1200 seconds"
            )
            self.TIMEOUT = 1200

        self.initialize_project()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cleanup_run()

    def is_dotnet(self):
        try:
            if self.filetype == "pebin":
                file_type = magic.from_buffer(self.binary)
                if ".Net" in file_type:
                    return True
                pe = pefile.PE(self.filepath)
                for entry in pe.OPTIONAL_HEADER.DATA_DIRECTORY:
                    # IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR is typically 14
                    if (
                        entry.name == "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR"
                        and entry.Size > 0
                    ):
                        return True
                return False
        except AttributeError as e:
            self.log.error(
                f"AttributeError error dotnet file {self.hash.sha256} Full error : {e}"
            )
            return False

    def cleanup_run(self):
        """Clean up after analysis."""
        try:
            if self.ghidra_process and self.ghidra_process.poll() is None:
                self.ghidra_process.terminate()
                try:
                    self.ghidra_process.wait(timeout=5)
                except subprocess.TimeoutExpired:
                    self.ghidra_process.kill()

            # Clean up project directory
            if self.project_path and os.path.exists(self.project_path):
                import shutil

                shutil.rmtree(self.project_path)
                self.log.debug(f"Cleaned up project directory: {self.project_path}")

            # Force garbage collection
            import gc

            gc.collect()
        except Exception as e:
            self.log.error(f"Error in cleanup: {e}")

    # @classmethod
    # def cleanup_batch(cls):
    #     """Clean up the persistent project at the end of a batch."""
    #     print(f"Cleaning up Ghidra project for batch")
    #     if cls._project_path and os.path.exists(cls._project_path):
    #         try:
    #             import shutil
    #             shutil.rmtree(cls._project_path)
    #             cls._project_initialized = False
    #             cls._project_path = None
    #         except Exception as e:
    #             print(f"Error cleaning up project: {e}")

    def _get_environment(self):
        """Setup and return the environment for Ghidra."""
        env = os.environ.copy()
        java_home = os.getenv("GHIDRA_JAVA_HOME", "/usr/lib/jvm/java-17-openjdk-amd64")
        env.update(
            {
                "JAVA_HOME": java_home,
                "PATH": f"{java_home}/bin:{env['PATH']}",
                "LD_LIBRARY_PATH": f"{java_home}/lib:{env.get('LD_LIBRARY_PATH', '')}",
            }
        )
        # Print environment variables for debugging
        self.log.debug(f"JAVA_HOME: {env['JAVA_HOME']}")
        self.log.debug(f"PATH: {env['PATH']}")
        self.log.debug(f"LD_LIBRARY_PATH: {env['LD_LIBRARY_PATH']}")

        return env

    def initialize_project(self):
        """Initialize a temporary Ghidra project for this file."""
        # Create unique project directory
        self.project_path = f"/tmp/ghidra_{os.path.basename(self.filepath)}_{str(int(time.time()))}_{os.getpid()}"
        os.makedirs(self.project_path, exist_ok=True)
        self.log.debug(f"Created temporary project at {self.project_path}")

        # Create a minimal initialization file
        init_file = os.path.join(self.project_path, ".init")
        with open(init_file, "wb") as f:
            f.write(bytes([0x7F, 0x45, 0x4C, 0x46]))  # Valid ELF header magic bytes

        # Initialize project with minimal file
        env = self._get_environment()
        cmd = [
            f"{self.ghidra_path}/support/analyzeHeadless",
            self.project_path,
            "TempProject",
            "-import",
            init_file,
        ]

        try:
            result = subprocess.run(cmd, env=env, capture_output=True, text=True)
            if result.returncode != 0:
                self.log.error(f"Failed to initialize project: {result.stderr}")
                raise RuntimeError("Project initialization failed")

            # Clean up initialization file
            os.remove(init_file)
            self.log.debug("Project initialized successfully")

        except Exception as e:
            self.log.error(f"Error initializing project: {e}")
            raise

    def analyze_binary(self) -> Optional[Dict[str, Any]]:
        """Run Ghidra analysis and return results."""
        self.log.debug("Starting binary analysis")

        # # Check if packed
        # if self.check_binary_protection():
        #     self.log.warning("Skipping protected binary")
        #     return None

        # Check for .NET only if needed
        # if self.is_dotnet():
        #     self.MAX_NAMED_ARG_WARNINGS = 10000  # Higher threshold for .NET
        #     self.log.info("Adjusting parameters for .NET binary")
        # else:
        #     self.MAX_NAMED_ARG_WARNINGS = 1000  # Normal threshold

        if not os.path.exists(self.java_script_path):
            self.log.error(f"Java script not found: {self.java_script_path}")
            return None

        env = self._get_environment()

        try:
            base_cmd = [
                f"{self.ghidra_path}/support/analyzeHeadless",
                self.project_path,
                "TempProject",
                "-import",
                self.filepath,
                "-scriptPath",
                os.path.dirname(self.java_script_path),
                "-postScript",
                self.java_script_path,
                self.sha256,
                self.filepath,
            ]
            return self.run_ghidra(base_cmd, env)

        except Exception as e:
            self.log.error(f"Error in Ghidra analysis: {e}")
            return None

        finally:
            self.cleanup_run()

    def run_ghidra(
        self, cmd: list, env: Optional[Dict[str, str]] = None
    ) -> Optional[Dict[str, Any]]:
        """Run Ghidra process and capture JSON output with improved logging separation."""
        process = None
        try:
            self.log.info(f"Starting Ghidra analysis: {' '.join(cmd)}")
            start_time = time.time()

            process = subprocess.Popen(
                cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
            )
            self.ghidra_process = process

            warning_counter = 0
            named_arg_counter = 0
            # Read all output lines
            json_output = None
            while True:
                line = process.stdout.readline()
                if not line and process.poll() is not None:
                    break

                stripped_line = line.strip()
                if not stripped_line:
                    continue

                # if 'Invalid FieldOrProp value in NamedArg' in stripped_line:
                #     named_arg_counter += 1
                #     if named_arg_counter > self.MAX_NAMED_ARG_WARNINGS:
                #         self.log.error(f"Too many NamedArg warnings ({named_arg_counter}), possible protected file.")
                #         self.ghidra_process.kill()
                #         return None
                if (
                    stripped_line.startswith("{")
                    and '"sha256"' in stripped_line
                    and '"decompiled"' in stripped_line
                ):
                    # This is our actual JSON output from GhidraDecompilerScript
                    json_output = stripped_line
                elif any(level in stripped_line for level in ["INFO", "WARN", "ERROR"]):
                    # Ghidra framework logging
                    log_level = (
                        "debug"
                        if "INFO" in stripped_line
                        else "warning"
                        if "WARN" in stripped_line
                        else "error"
                    )
                    if log_level == "warning" and any(
                        expected in stripped_line
                        for expected in [
                            "Unable to disassemble EXTERNAL block",
                            "Failed to markup ELF Note",
                            "Invalid FieldOrProp value in NamedArg",
                            "Unable to resolve constructor",
                            "Could not follow disassembly flow into non-existing memory",
                            "Unable to read bytes at ram",
                        ]
                    ):
                        # Skip expected warnings
                        continue

                    getattr(self.log, log_level)(f"Ghidra info: {stripped_line}")

            # Process completion and stderr
            try:
                stderr = process.stderr.read()
                process.wait(timeout=self.TIMEOUT)

                if stderr:
                    for line in stderr.splitlines():
                        stripped_line = line.strip()
                        if not stripped_line:
                            continue
                        if "ERROR" in stripped_line:
                            self.log.error(f"Ghidra stderr: {stripped_line}")
                        elif "WARN" in stripped_line:
                            self.log.warning(f"Ghidra stderr: {stripped_line}")
                        else:
                            self.log.debug(f"Ghidra stderr: {stripped_line}")

            except subprocess.TimeoutExpired:
                process.kill()
                self.log.error("Ghidra analysis timed out")
                return None

            elapsed_time = time.time() - start_time
            self.log.debug(f"Ghidra analysis completed in {elapsed_time:.2f}s")

            # Parse JSON output if we found it
            if json_output:
                try:
                    result = json.loads(json_output)
                    # Validate the required structure
                    if not isinstance(result, dict) or not all(
                        k in result
                        for k in ["sha256", "decompiled", "disassembled", "cfg"]
                    ):
                        self.log.error("Invalid JSON structure from Ghidra")
                        return None
                    return result
                except json.JSONDecodeError as e:
                    self.log.error(f"Failed to parse Ghidra JSON output: {e}")
                    return None
            else:
                self.log.error("No JSON output received from Ghidra")
                return None

        except Exception as e:
            self.log.error(f"Error running Ghidra: {str(e)}")
            if hasattr(e, "__traceback__"):
                import traceback

                self.log.debug(
                    f"Traceback: {''.join(traceback.format_tb(e.__traceback__))}"
                )
            return None

        finally:
            if process:
                try:
                    # Ensure pipes are closed
                    if process.stdout:
                        process.stdout.close()
                    if process.stderr:
                        process.stderr.close()
                    # Terminate process if still running
                    if process.poll() is None:
                        process.terminate()
                        try:
                            process.wait(timeout=5)
                        except subprocess.TimeoutExpired:
                            process.kill()
                except Exception as e:
                    self.log.error(f"Error cleaning up Ghidra process: {e}")

    def extract(self) -> bool:
        """Extract and process all analysis results."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            results = self.analyze_binary()
            if not results:
                return False

            self.analysis_results = results
            return True

        except Exception as e:
            self.log.error(f"Error in extraction: {e}")
            return False

    def prepare_export_data(self, exporter_type: str) -> Any:
        """Prepare data for database export."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not self.analysis_results:
            return None

        if exporter_type == "ClickHouseExporter":
            now = datetime.now(timezone.utc)

            def prepare_array_field(value, array_type):
                """Helper to prepare array fields with proper null handling"""
                if value is None:
                    return []
                return value

            def ssdeep_disassembly(func):
                try:
                    if len(func) > 1:
                        return ppdeep.hash(func)
                    return ""
                except Exception as e:
                    self.log.error(f"Error in disassembly ssdeep hash calculation: {e}")
                    return ""

            def tlsh_disassembly(func):
                try:
                    if len(func) >= 50:
                        return tlsh.hash(func.encode("utf-8"))
                    return ""
                except Exception as e:
                    self.log.error(f"Error in disassembly tlsh hash calculation: {e}")
                    return ""

            return {
                "multi_table": True,
                "decompiled_content": {
                    "table": "decompiled_functions_content",
                    "data": [
                        [
                            f["decompiled_content_hash"],
                            f["decompiled_function"],
                            f["function_type"],
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "decompiled_content_hash",
                        "decompiled_function",
                        "function_type",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "DateTime64(3, 'UTC')",
                    ],
                },
                "decompiled_refs": {
                    "table": "decompiled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["decompiled_content_hash"],
                            f["decompiled_function_name"],
                            f["decompiled_function_address"],
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "sha256",
                        "decompiled_content_hash",
                        "decompiled_function_name",
                        "decompiled_function_address",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "LowCardinality(String)",
                        "String",
                        "DateTime64(3, 'UTC')",
                    ],
                },
                "disassembled_content": {
                    "table": "disassembled_functions_content",
                    "data": [
                        [
                            f["disassembled_content_hash"],
                            f["fully_normalized_content_hash"],
                            f["api_normalized_content_hash"],
                            f["category_normalized_content_hash"],
                            f.get("disassembled_function", ""),
                            f.get("fully_normalized_disassembly", ""),
                            f.get("api_normalized_disassembly", ""),
                            f.get("category_normalized_disassembly", ""),
                            ssdeep_disassembly(f.get("disassembled_function", "")),
                            tlsh_disassembly(f.get("disassembled_function", "")),
                            ssdeep_disassembly(
                                f.get("fully_normalized_disassembly", "")
                            ),
                            tlsh_disassembly(f.get("fully_normalized_disassembly", "")),
                            f.get("function_type", "UNKNOWN"),
                            f.get("instruction_count", 0),
                            prepare_array_field(
                                f.get("instruction_types"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern"), "LowCardinality(String)"
                            ),
                            prepare_array_field(
                                f.get("register_usage"), "LowCardinality(String)"
                            ),
                            f.get("data_references_count", 0),
                            # prepare_array_field(f.get('opcode_frequency_vector'), 'Float32'),
                            # prepare_array_field(f.get('api_calls_vector'), 'Float32'),
                            # prepare_array_field(f.get('minhash_signature'), 'UInt64'),
                            # f.get('pic_hash', ''),
                            f.get("max_block_size", 0),
                            f.get("num_calls", 0),
                            f.get("stack_size", 0),
                            # prepare_array_field(f.get('instruction_type_ratios'), 'Float32'),
                            # prepare_array_field(f.get('instruction_embedding'), 'Float32'),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "disassembled_content_hash",
                        "fully_normalized_content_hash",
                        "api_normalized_content_hash",
                        "category_normalized_content_hash",
                        "disassembled_function",
                        "fully_normalized_disassembly",
                        "api_normalized_disassembly",
                        "category_normalized_disassembly",
                        "ssdeep_disassembly",
                        "tlsh_disassembly",
                        "ssdeep_fully_normalized",
                        "tlsh_fully_normalized",
                        "function_type",
                        "instruction_count",
                        "instruction_types",
                        "control_flow_count",
                        "memory_access_pattern",
                        "register_usage",
                        "data_references_count",
                        # 'opcode_frequency_vector',
                        # 'api_calls_vector',
                        # 'minhash_signature',
                        # 'pic_hash',
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        # 'instruction_type_ratios',
                        # 'instruction_embedding',
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "FixedString(64)",
                        "FixedString(64)",
                        "String",
                        "String",
                        "String",
                        "String",
                        "Nullable(String)",
                        "Nullable(FixedString(72))",
                        "Nullable(String)",
                        "Nullable(FixedString(72))",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        # 'Array(Float32)',
                        # 'Array(Float32)',
                        # 'Array(UInt64)',
                        # 'Nullable(FixedString(16))',
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        # 'Array(Float32)',
                        # 'Array(Float32)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                "disassembled_refs": {
                    "table": "disassembled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["disassembled_content_hash"],
                            f["fully_normalized_content_hash"],
                            f["api_normalized_content_hash"],
                            f["category_normalized_content_hash"],
                            f["disassembled_function_name"],
                            f["disassembled_function_address"],
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "sha256",
                        "disassembled_content_hash",
                        "fully_normalized_content_hash",
                        "api_normalized_content_hash",
                        "category_normalized_content_hash",
                        "disassembled_function_name",
                        "disassembled_function_address",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "FixedString(64)",
                        "FixedString(64)",
                        "FixedString(64)",
                        "LowCardinality(String)",
                        "String",
                        "DateTime64(3, 'UTC')",
                    ],
                },
                "cfg_blocks": {
                    "table": "cfg_blocks",
                    "data": [
                        [
                            b["block_id"],
                            self.analysis_results["sha256"],
                            b["function_address"],
                            b["block_start_address"],
                            b["block_end_address"],
                            b["block_size"],
                            b["block_instructions"],
                            b["fully_normalized_instructions"],
                            b["api_normalized_instructions"],
                            b["category_normalized_instructions"],
                            b.get("predecessor_blocks", []),
                            b.get("successor_blocks", []),  # Use empty array as default
                            b.get("is_entry_block", False),
                            b.get("is_exit_block", False),
                            b.get("branch_type", "UNKNOWN"),
                            b.get("referenced_constants", []),
                            b.get("sign", 1),  # Use 1 as default for sign
                            now,
                        ]
                        for b in self.analysis_results["cfg"]
                    ],
                    "column_names": [
                        "block_id",
                        "sha256",
                        "function_address",
                        "block_start_address",
                        "block_end_address",
                        "block_size",
                        "block_instructions",
                        "fully_normalized_instructions",
                        "api_normalized_instructions",
                        "category_normalized_instructions",
                        "predecessor_blocks",
                        "successor_blocks",
                        "is_entry_block",
                        "is_exit_block",
                        "branch_type",
                        "referenced_constants",
                        "sign",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "String",
                        "String",
                        "String",
                        "UInt32",
                        "String",
                        "Nullable(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "Array(String)",
                        "Array(String)",
                        "Bool",
                        "Bool",
                        "Enum8('DIRECT'=1, 'CONDITIONAL'=2, 'CALL'=3, 'RETURN'=4, 'FALLTHROUGH'=5, 'UNKNOWN'=6)",
                        "Array(String)",
                        "Int8",
                        "DateTime64(3, 'UTC')",
                    ],
                },
                "function_analysis_errors": {
                    "table": "function_analysis_errors",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["function_name"],
                            f["function_address"],
                            f["error_location"],
                            f.get(
                                "error_message", ""
                            ),  # it could be empty, how to handle it?
                            f.get("error_details", ""),
                            f.get("error_type", "unknown"),
                            md5(
                                f"{f['error_message']}{f['function_name']}{f['function_address']}{f['error_location']}".encode()
                            ).hexdigest(),
                            "new",
                            now,
                        ]
                        for f in self.analysis_results["errors"]
                    ],
                    "column_names": [
                        "sha256",
                        "function_name",
                        "function_address",
                        "error_location",
                        "error_message",
                        "error_details",
                        "error_type",
                        "error_hash",
                        "status",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "String",
                        "LowCardinality(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "FixedString(32)",
                        "Enum8('new'=1, 'investigating'=2, 'fixed'=3, 'wontfix'=4)",
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.DECOMPILED.value

    def get_clickhouse_table(self) -> str:
        """Not used directly as we're handling multiple tables."""
        pass