Mahmood Khan Niazi

71 papers A 7B 1Misc 1Journal 54Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
Pattern Recognit.
Reem AlJunaid, Qasim Umer, Sajjad Mahmood, Mahmood Khan Niazi, Muzammil Behzad
2025 J jnl
J. Softw. Evol. Process.
Malek Al zeibak, Mohammad R. Alshayeb, Malak Baslyman, Mahmood Khan Niazi
2025 conf
EASE Companion
Doaa Dalaq, Kaniz Fatima Daya, Alaa Dalaq, Muhammed Nazmul Arefin, Mahmood Khan Niazi
2025 J jnl
PeerJ Comput. Sci.
Reem Alshareef, Mohammad R. Alshayeb, Mahmood Khan Niazi, Sajjad Mahmood
2025 J jnl
J. Softw. Evol. Process.
Ghulam Murtaza Khan, Siffat Ullah Khan, Mahmood Khan Niazi, Muhammad Ilyas, Mamoona Humayun, Akash Ahmad, Javed Ali Khan, Sajjad Mahmood
2025 J jnl
Autom. Softw. Eng.
Arif Ali Khan, Muhammad Azeem Akbar, Valtteri Lahtinen, Marko Paavola, Mahmood Khan Niazi, Mohammed Naif Alatawi, Shoayee Dlaim Alotaibi
2025 conf
EASE Companion
Mohammad Shameem, Mahmood Khan Niazi, Sajjad Mahmood, Mohammad Nadeem
2025 conf
EASE Companion
Haifa Abdullah Al-Shammare, Rawan Alraddadi, Faten Al-Abdulwahhab, Mahmood Khan Niazi, Mamoona Humayun
2025 conf
EASE Companion
Azzah AlGhamdi, Mahmood Khan Niazi, Lucas Carvalho Cordeiro, Mamoona Humayun, Andrew Stewart
2025 J jnl
IEEE Access
Rana Al-Rawashdeh, Md Mahfuzur Rahman, Mahmood Khan Niazi
2025 J jnl
Inf. Softw. Technol.
Naeem Ullah, Siffat Ullah Khan, Mahmood Khan Niazi, Matteo Esposito, Arif Ali Khan, Jamal Abdul Nasir
2025 J jnl
Appl. Soft Comput.
Mohammad Shameem, Mohammad Nadeem, Mahmood Khan Niazi, Sajjad Mahmood, Ankur Kumar
2025 conf
ANT/EDI40
Rawan Alraddadi, Mohammad R. Alshayeb, Sajjad Mahmood, Mahmood Khan Niazi
2025 J jnl
Entertain. Comput.
Affan Yasin, Rubia Fatima, Lijie Wen, Jiangbin Zheng, Mahmood Khan Niazi
2024 J jnl
Wirel. Networks
Asif Iqbal, Siffat Ullah Khan, Mahmood Khan Niazi, Mamoona Humayun, Najm Us Sama, Arif Ali Khan, Aakash Ahmad
2024 J jnl
Autom. Softw. Eng.
Arif Ali Khan, Muhammad Azeem Akbar, Valtteri Lahtinen, Marko Paavola, Mahmood Khan Niazi, Mohammed Naif Alatawi, Shoayee Dlaim Alotaibi
2024 A conf
EASE
Reem Alshareef, Esra'a Alshabeeb, Noor Alakkas, Mahmood Khan Niazi
2024 J jnl
J. Softw. Evol. Process.
Gulzar Alam, Sajjad Mahmood, Mohammad R. Alshayeb, Mahmood Khan Niazi, Saad Zafar
2024 J jnl
Softw. Pract. Exp.
Azzah A. Alghamdi, Mahmood Khan Niazi, Mohammad R. Alshayeb, Sajjad Mahmood
2024 A conf
EASE
Mona Albinali, Mahmood Khan Niazi
2024 J jnl
Digit. Gov. Res. Pract.
Grace Billiris, Asif Gill, Ian J. Oppermann, Mahmood Khan Niazi
2023 J jnl
IEEE Trans. Comput. Soc. Syst.
Arif Ali Khan, Muhammad Azeem Akbar, Mahdi Fahmideh, Peng Liang, Muhammad Waseem, Aakash Ahmad, Mahmood Khan Niazi, Pekka Abrahamsson
2023 A conf
EASE
Azzah A. Alghamdi, Mahmood Khan Niazi
2023 J jnl
Softw. Pract. Exp.
Mamoona Humayun, Mahmood Khan Niazi, Noor Zaman Jhanjhi, Sajjad Mahmood, Mohammad R. Alshayeb
2023 J jnl
Inf. Softw. Technol.
Faisal Alnaseef, Mahmood Khan Niazi, Sajjad Mahmood, Mohammad R. Alshayeb, Irfan Ahmad
2022 J jnl
Intell. Autom. Soft Comput.
Islam Ali, Syed Muhammad Ali, Waqar Mehmood, Wasif Nisar, Muhammad Qaiser Saleem, Majzoob K. Omer, Mahmood Khan Niazi, Muhammad Shafiq, Jin-Ghoo Choi
2022 A conf
EASE
Azzah A. Alghamdi, Mahmood Khan Niazi
2022 conf
QP4SE@ESEC/SIGSOFT FSE
Arif Ali Khan, Mahdi Fahmideh, Aakash Ahmad, Muhammad Waseem, Mahmood Khan Niazi, Valtteri Lahtinen, Tommi Mikkonen
2022 A conf
EASE
Arif Ali Khan, Sher Badshah, Peng Liang, Muhammad Waseem, Bilal Khan, Aakash Ahmad, Mahdi Fahmideh, Mahmood Khan Niazi, Muhammad Azeem Akbar
2022 J jnl
Inf. Softw. Technol.
Arif Ali Khan, Pekka Abrahamsson, Mahmood Khan Niazi
2021 J jnl
IEEE Access
Habib Ullah Khan, Mahmood Khan Niazi, Mohamed El-Attar, Naveed Ikram, Siffat Ullah Khan, Asif Qumer Gill
2020 J jnl
IEEE Access
Hassan Al-Matouq, Sajjad Mahmood, Mohammad R. Alshayeb, Mahmood Khan Niazi
2020 J jnl
Comput. Secur.
Mahmood Khan Niazi, Ashraf Mohammed Saeed, Mohammad R. Alshayeb, Sajjad Mahmood, Saad Zafar
2020 conf
IMIS
Asif Qumer Gill, Ghassan Beydoun, Mahmood Khan Niazi, Habib Ullah Khan
2020 J jnl
J. Softw. Evol. Process.
Mahmood Khan Niazi, Sajjad Mahmood, Mohammad R. Alshayeb
2020 J jnl
IEEE Access
Lanjing Wang, Yasir Ali, Shah Nazir, Mahmood Khan Niazi
2020 J jnl
IEEE Access
Mohammad R. Alshayeb, Haris Mumtaz, Sajjad Mahmood, Mahmood Khan Niazi
2020 J jnl
IET Softw.
Ismail Mohamed Keshta, Mahmood Khan Niazi, Mohammad R. Alshayeb
2019 J jnl
J. Softw. Evol. Process.
Ahmad Abdellatif, Mohammad R. Alshayeb, Sami Zahran, Mahmood Khan Niazi
2019 J jnl
J. Softw. Evol. Process.
Haris Mumtaz, Mohammad R. Alshayeb, Sajjad Mahmood, Mahmood Khan Niazi
2019 J jnl
J. Softw. Evol. Process.
Arif Ali Khan, Jacky Keung, Mahmood Khan Niazi, Shahid Hussain, Mohammad Shameem
2019 J jnl
Inf. Softw. Technol.
Jawad Javed Akbar Baig, Sajjad Mahmood, Mohammad R. Alshayeb, Mahmood Khan Niazi
2018 J jnl
IEEE Access
Yusuf Mufti, Mahmood Khan Niazi, Mohammad R. Alshayeb, Sajjad Mahmood
2018 J jnl
Inf. Softw. Technol.
Haris Mumtaz, Mohammad R. Alshayeb, Sajjad Mahmood, Mahmood Khan Niazi
2018 J jnl
Requir. Eng.
Talat Ambreen, Naveed Ikram, Muhammad Usman, Mahmood Khan Niazi
2018 J jnl
Inf. Syst. Frontiers
Asif Qumer Gill, Brian Henderson-Sellers, Mahmood Khan Niazi
2018 J jnl
IET Softw.
Arif Ali Khan, Jacky Keung, Shahid Hussain, Mahmood Khan Niazi, Suzanne Kieffer
2018 J jnl
IEEE Access
Ismail Mohamed Keshta, Mahmood Khan Niazi, Mohammad R. Alshayeb
2017 J jnl
Comput. Stand. Interfaces
Nabil M. Mohammed, Mahmood Khan Niazi, Mohammad R. Alshayeb, Sajjad Mahmood
2017 J jnl
Inf. Softw. Technol.
Sajjad Mahmood, Sajid Anwer, Mahmood Khan Niazi, Mohammad R. Alshayeb, Ita Richardson
2017 J jnl
J. Softw. Evol. Process.
Mahmood Khan Niazi, Sajjad Mahmood, Mohammad R. Alshayeb, Abdulrahman Ahmed Bobakr Baqais, Asif Qumer Gill
2017 B conf
EuroSPI
Arif Ali Khan, Jacky Keung, Mahmood Khan Niazi, Shahid Hussain, He Zhang
2017 J jnl
Inf. Softw. Technol.
Arif Ali Khan, Jacky Keung, Mahmood Khan Niazi, Shahid Hussain, Awais Ahmad
2017 J jnl
IEEE Access
Ismail Mohamed Keshta, Mahmood Khan Niazi, Mohammad R. Alshayeb
2017 Misc conf
SAC
Arif Ali Khan, Jacky W. Keung, Mahmood Khan Niazi, Shahid Hussain
2016 J jnl
Inf. Softw. Technol.
Mahmood Khan Niazi, Sajjad Mahmood, Mohammad R. Alshayeb, Mohammed Rehan Riaz, Kanaan Faisal, Narciso Cerpa, Siffat Ullah Khan, Ita Richardson
2016 J jnl
Softw. Qual. J.
Javed Iqbal, Rodina Binti Ahmad, Mohd Hairul Nizam Md. Nasir, Mahmood Khan Niazi, Shahaboddin Shamshirband, Muhammad Asim Noor
2015 J jnl
J. Softw. Evol. Process.
Mahmood Khan Niazi
2015 J jnl
IET Softw.
Mahmood Khan Niazi, Sajjad Mahmood, Mohammad R. Alshayeb, Ayman Hroub
2015 conf
MISNC
Amer Rasheed, Uffe Kock Wiil, Mahmood Khan Niazi
2015 A conf
EASE
Sajjad Mahmood, Sajid Anwer, Mahmood Khan Niazi, Mohammad R. Alshayeb, Ita Richardson
2015 J jnl
IET Softw.
Mahmood Khan Niazi
2014 J jnl
Inf. Softw. Technol.
June M. Verner, O. Pearl Brereton, Barbara A. Kitchenham, Mahmood Turner, Mahmood Khan Niazi
2014 J jnl
IET Softw.
Muneera Bano, Didar Zowghi, Naveed Ikram, Mahmood Khan Niazi
2013 A conf
EASE
Salma Imtiaz, Muneera Bano, Naveed Ikram, Mahmood Khan Niazi
2013 J jnl
IET Softw.
Mahmood Khan Niazi, Naveed Ikram, Asif Qumer Gill, Mohammed Rafi Ul Hassan
2013 J jnl
IET Softw.
Mahmood Khan Niazi, Naveed Ikram, Muneera Bano, Salma Imtiaz, Siffat Ullah Khan
2011 J jnl
Inf. Softw. Technol.
Siffat Ullah Khan, Mahmood Khan Niazi, Rashid Ahmad
2011 J jnl
J. Syst. Softw.
Siffat Ullah Khan, Mahmood Khan Niazi, Rashid Ahmad
2011 J jnl
Inf. Softw. Technol.
Mahmood Khan Niazi, Mark Turner
2010 J jnl
Inf. Softw. Technol.
Mahmood Khan Niazi, Muhammad Ali Babar, June M. Verner
redb/extractors/macho_extractors/macho_imports.py
← Index redb/extractors/macho_extractors/macho_imports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOImport


class MachOImportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_imports"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_IMPORT.value

    def _extract_imports(self, arch_name=None):
        """Extract import information from the MachO binary for a specific architecture.

        Handles machofile v2026.2.4+ API where get_imported_functions() returns:
        Dict[str, List[Dict]] where each dict has {'name': str, 'sources': [str, ...]}
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get imported functions using API for specific architecture
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            if not imported_functions:
                return None

            # Keep the library→functions mapping (like PE does)
            library_names = []
            imports_with_mapping = []  # List of {library: [(name, source), ...]}

            for dylib_name, functions in imported_functions.items():
                # v2026.2.4+: dylib_name is already str, but handle bytes for compatibility
                if isinstance(dylib_name, bytes):
                    dylib_name = dylib_name.decode('utf-8', errors='replace')
                library_names.append(dylib_name)

                # Process function entries
                func_list = []
                for func_entry in functions:
                    # v2026.2.4+: func_entry is {'name': str, 'sources': [str, ...]}
                    if isinstance(func_entry, dict):
                        func_name = func_entry.get('name', '')
                        # Join sources if multiple, take first if single
                        sources = func_entry.get('sources', [])
                        import_source = sources[0] if sources else None
                        func_list.append((func_name, import_source))
                    else:
                        # Legacy format: func_entry is str or bytes
                        if isinstance(func_entry, bytes):
                            func_entry = func_entry.decode('utf-8', errors='replace')
                        func_list.append((func_entry, None))

                imports_with_mapping.append({dylib_name: func_list})

            # Count total functions
            total_functions = sum(len(list(d.values())[0]) for d in imports_with_mapping)

            # Create import dataclass with mapping preserved
            macho_import = MachOImport(
                macho_imports_total=total_functions,
                macho_import_libraryName=library_names if library_names else None,
                macho_import_functions=imports_with_mapping if imports_with_mapping else None
            )

            return macho_import

        except Exception as e:
            self.log.error(f"Error extracting MachO imports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of imports for each architecture
                results = []
                for arch_name in architectures:
                    imports = self._extract_imports(arch_name)
                    if imports:
                        imports.arch_identifier = arch_name
                        results.append(imports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_imports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO imports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            # Flatten the data - one row per function import (like PE imports)
            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get imports for this architecture
                macho_import = self._extract_imports(arch_name)
                if not macho_import or not macho_import.macho_import_functions:
                    continue

                # Flatten to one row per (library, function) pair
                for lib_funcs in macho_import.macho_import_functions:
                    for lib, funcs in lib_funcs.items():
                        for func_name, import_source in funcs:
                            data.append([
                                arch_sha256,        # sha256 (arch-specific)
                                lib,                # library_name
                                func_name,          # function_name
                                import_source,      # import_source (chained_fixups, bind_opcodes, symtab)
                                current_time,       # analysis_date
                            ])

            column_names = [
                'sha256',
                'library_name', 'function_name', 'import_source',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def get_clickhouse_table(self) -> str:
        return "redb_macho_imports"