Mamoona Humayun

70 papers A 1C 2Journal 64Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
Clust. Comput.
Malak Alamri, Noshina Tariq, Mamoona Humayun, Menwa Alshammeri
2026 J jnl
Comput. Mater. Continua
Ghadah Naif Alwakid, Samabia Tehsin, Mamoona Humayun, Asad Farooq, Ibrahim Alrashdi, Amjad Alsirhani
2026 J jnl
Neurocomputing
Sijjad Ali, Dhani Bux Talpur, Mamoona Humayun, Maram Fahaad Almufareh, Ghadah Naif Alwakid, Jahanzaib Yaqoob
2025 J jnl
Comput. Mater. Continua
Menwa Alshammeri, Mamoona Humayun, Khalid Haseeb, Ghadah Naif Alwakid
2025 J jnl
Secur. Priv.
Ehtesham Safeer, Sidra Tahir, Asif Nawaz, Mamoona Humayun, Momina Shaheen, Maqbool Khan
2025 J jnl
IEEE Access
Maram Fahaad Almufareh, Samabia Tehsin, Mamoona Humayun, Sumaira Kausar, Asad Farooq
2025 J jnl
IET Commun.
Fatima Al-Quayed, Sana Rauf Awan, Noshina Tariq, Mamoona Humayun, Thanaa S. Alnusairi, Tayyab Rehman
2025 J jnl
Inf. Fusion
Sijjad Ali, Jia Wang, Victor C. M. Leung, Farhan Bashir, Uzair Aslam Bhatti, Shuaib Ahmed Wadho, Mamoona Humayun
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
Cogn. Comput.
Fatima Al-Quayed, Mamoona Humayun, Thanaa S. Alnusairi, Inam Ullah, Ali Kashif Bashir, Tariq Hussain
2025 conf
EASE Companion
Haifa Abdullah Al-Shammare, Rawan Alraddadi, Faten Al-Abdulwahhab, Mahmood Khan Niazi, Mamoona Humayun
2025 J jnl
Syst.
Wafa Naif Alwakid, Nisar Ahmed Dahri, Mamoona Humayun, Ghadah Naif Alwakid
2025 J jnl
Int. J. Intell. Syst.
Robin Kumar, Dalwinder Singh, Rahul Malik, Isha Batra, Mamoona Humayun, Javed Ali Khan
2025 J jnl
Comput. Mater. Continua
Khulud Salem S. Alshudukhi, Mamoona Humayun, Ghadah Naif Alwakid
2025 J jnl
IEEE Access
Maram Fahaad Almufareh, Noor Zaman Jhanjhi, Mamoona Humayun, Ghadah Alwakid, Danish Javed, Saleh Naif Almuayqil
2025 J jnl
Clust. Comput.
Amjad Alsirhani, Noshina Tariq, Mamoona Humayun, Ghadah Alwakid, Hassan Sanaullah
2025 conf
EASE Companion
Azzah AlGhamdi, Mahmood Khan Niazi, Lucas Carvalho Cordeiro, Mamoona Humayun, Andrew Stewart
2025 J jnl
Comput. Electr. Eng.
Sijjad Ali, Shuaib Ahmed Wadho, Kazim Raza Talpur, Bandeh Ali Talpur, Khulud Salem S. Alshudukhi, Mamoona Humayun, Samar Raza Talpur, Mohd Abdullah Al Mamun, Muhammad Naseem, Adeel Abro, Dhani Bux Talpur, Asadullah Shah
2025 J jnl
Computing
Ghadah Alwakid, Mamoona Humayun, Khalid Haseeb, Ayesha Shafique
2025 J jnl
Comput. Secur.
Sijjad Ali, Dhani Bux Talpur, Adeel Abro, Khulud Salem S. Alshudukhi, Ghadah Naif Alwakid, Mamoona Humayun, Farhan Bashir, Shuaib Ahmed Wadho, Asadullah Shah
2025 J jnl
IEEE Access
Ghadah Naif Alwakid, Mamoona Humayun, Zulfiqar Ahmad
2024 J jnl
IEEE Access
Ghadah Alwakid, Mamoona Humayun, Walaa Gouda
2024 conf
ICC Workshops
Noshina Tariq, Rabia Khan, Maram Fahaad Almufareh, Mamoona Humayun, Momina Shaheen
2024 J jnl
IEEE Access
Fatima Al-Quayed, Danish Javed, N. Z. Jhanjhi, Mamoona Humayun, Thanaa S. Alnusairi
2024 J jnl
Int. J. Intell. Syst.
Attique Ur Rehman, Wasi Haider Butt, Tahir Muhammad Ali, Sabeen Javaid, Maram Fahhad Almufareh, Mamoona Humayun, Hameedur Rahman, Azka Mir, Momina Shaheen
2024 J jnl
IEEE Access
Fatima Al-Quayed, Zulfiqar Ahmad, Mamoona Humayun
2024 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Madhusmita Sahu, Rasmita Dash, Sambit Kumar Mishra, Mamoona Humayun, Majed Alfayad, Mohammed Assiri
2024 J jnl
J. Cloud Comput.
Noshina Tariq, Amjad Alsirhani, Mamoona Humayun, Faeiz Alserhani, Momina Shaheen
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
IEEE Access
Maram Fahaad Almufareh, Mamoona Humayun, Zulfiqar Ahmad, Asfandyar Khan
2024 J jnl
IEEE Access
Maram Fahhad Almufareh, Muhammad Imran, Abdullah Khan, Mamoona Humayun, Muhammad Asim
2024 J jnl
IEEE Access
Maram Fahaad Almufareh, NZ Jhanjhi, Navid Ali Khan, Saleh Naif Almuayqil, Mamoona Humayun, Danish Javed
2024 J jnl
IEEE Access
Khulud Salem S. Alshudukhi, Farzeen Ashfaq, N. Z. Jhanjhi, Mamoona Humayun
2024 J jnl
IEEE Access
Mamoona Humayun, Noshina Tariq, Majed Alfayad, Muhammad Zakwan, Ghadah Alwakid, Mohammed Assiri
2024 J jnl
IEEE Access
Puneet Kumar, Dalwinder Singh, Mamoona Humayun, Ali Alqazzaz, Arun Malik, Ibrahim Alrashdi, Isha Batra, Ghadah Alwakid
2024 J jnl
IEEE Access
Ghadah Alwakid, Sidra Tahir, Mamoona Humayun, Walaa Gouda
2024 J jnl
IEEE Access
Mamoona Humayun, Noshina Tariq, Majed Alfayad, Muhammad Zakwan, Ghadah Alwakid, Mohammed Assiri
2024 J jnl
Comput. Mater. Continua
Irum Ilays, Yaser Hafeez, Nabil Almashfi, Sadia Ali, Mamoona Humayun, Muhammad Aqib, Ghadah Alwakid
2024 J jnl
J. Cloud Comput.
Mamoona Humayun, Amjad Alsirhani, Faeiz Alserhani, Momina Shaheen, Ghadah Alwakid
2023 J jnl
Comput. Syst. Sci. Eng.
Saurabh Adhikari, Tushar Kanti Gangopadhayay, Souvik Pal, D. Akila, Mamoona Humayun, Majed Alfayad, N. Z. Jhanjhi
2023 J jnl
Comput. Syst. Sci. Eng.
Mamoona Humayun, Danish Javed, N. Z. Jhanjhi, Maram Fahhad Almufareh, Saleh Naif Almuayqil
2023 J jnl
IEEE Access
Muhammad Hassan, Noshina Tariq, Amjad Alsirhani, Abdullah Alomari, Farrukh Aslam Khan, Mohammed Mujib Alshahrani, Muhammad Ashraf, Mamoona Humayun
2023 J jnl
Softw. Pract. Exp.
Mamoona Humayun, Mahmood Khan Niazi, Noor Zaman Jhanjhi, Sajjad Mahmood, Mohammad R. Alshayeb
2022 J jnl
Sensors
Syeda Mariam Muzammal, Raja Kumar Murugesan, Noor Zaman Jhanjhi, Mamoona Humayun, Ashraf Osman Ibrahim, Abdelzahir Abdelmaboud
2022 J jnl
Open Comput. Sci.
Rao Nadeem, Rana M. Amir Latif, Khalid Hussain, N. Z. Jhanjhi, Mamoona Humayun
2022 J jnl
Sensors
Mamoona Humayun, Noor Zaman Jhanjhi, Abdullah Almotilag, Maram Fahhad Almufareh
2022 J jnl
Appl. Artif. Intell.
Mamoona Humayun, Mohammed Saleh Alsaqer, NZ Jhanjhi
2022 J jnl
Appl. Artif. Intell.
Muhammad Attaullah, Mushtaq Ali, Maram Fahhad Almufareh, Muneer Ahmad, Lal Hussain, NZ Jhanjhi, Mamoona Humayun
2022 J jnl
Comput. Syst. Sci. Eng.
Vasaki Ponnusamy, Mamoona Humayun, N. Z. Jhanjhi, Aun Yichiet, Maram Fahhad Almufareh
2022 J jnl
Comput. Syst. Sci. Eng.
Vasaki Ponnusamy, Aun Yichiet, N. Z. Jhanjhi, Mamoona Humayun, Maram Fahhad Almufareh
2022 J jnl
Comput. Syst. Sci. Eng.
Mamoona Humayun, Ahmed Alsayat
2022 J jnl
Int. J. Web Grid Serv.
Sajid Latif, Mamoona Humayun, Abida Sharif, Seifedine Nimer Kadry
2022 J jnl
IEEE Internet Things J.
Ata Ullah, Muhammad Azeem, Humaira Ashraf, N. Z. Jhanjhi, Lewis Nkenyereye, Mamoona Humayun
2022 J jnl
Inf. Technol. Manag.
Sadia Ali, Yaser Hafeez, Mamoona Humayun, N. Z. Jhanjhi, Dac-Nhuong Le
2021 J jnl
IEEE Access
Ata Ullah, Nagina Ishaq, Muhammad Azeem, Humaira Ashraf, N. Z. Jhanjhi, Mamoona Humayun, Thamer A. Tabbakh, Zahrah A. Almusaylim
2021 J jnl
Comput. Syst. Sci. Eng.
N. Z. Jhanjhi, Mamoona Humayun, Saleh Naif Almuayqil
2021 J jnl
IEEE Access
Muhammad Azeem, Ata Ullah, Humaira Ashraf, N. Z. Jhanjhi, Mamoona Humayun, Sultan Aljahdali, Thamer A. Tabbakh
2021 J jnl
Wirel. Pers. Commun.
Syed Jawad Hussain, Muhammad Irfan, N. Z. Jhanjhi, Khalid Hussain, Mamoona Humayun
2021 J jnl
IEEE Access
Ata Ullah, Muhammad Azeem, Humaira Ashraf, Abdulellah A. Alaboudi, Mamoona Humayun, N. Z. Jhanjhi
2020 J jnl
IEEE Internet Things Mag.
Mamoona Humayun, N. Z. Jhanjhi, Bushra Hamid, Ghufran Ahmed
2020 J jnl
IEEE Access
Sambit Kumar Mishra, Sonali Mishra, Ahmed Alsayat, N. Z. Jhanjhi, Mamoona Humayun, Kshira Sagar Sahoo, Ashish Kumar Luhach
2020 J jnl
IEEE Access
Mamoona Humayun, N. Z. Jhanjhi, Madallah Alruwaili, Sagaya Sabestinal Amalathas, Venki Balasubramanian, Buvana Selvaraj
2020 J jnl
EAI Endorsed Trans. Energy Web
Azeem Khan, NZ Jhanjhi, Mamoona Humayun
2020 J jnl
IEEE Access
Sadia Ali, Yaser Hafeez, N. Z. Jhanjhi, Mamoona Humayun, Muhammad Imran, Anand Nayyar, Saurabh Singh, In-Ho Ra
2020 J jnl
Int. J. Grid Util. Comput.
Muneeb Ali Hamid, Yaser Hafeez, Bushra Hamid, Mamoona Humayun, N. Z. Jhanjhi
2016 J jnl
J. Softw.
Syed Asad Ali Shah, Raja Khaim Shahzad, Syed Shafique Ali Bukhari, Nasir Mehmood Minhas, Mamoona Humayun
2015 C conf
SNPD
Sajjad Rafique, Mamoona Humayun, Bushra Hamid, Ansar Abbas, Muhammad Akhtar, Kamil Iqbal
2013 J jnl
J. Softw.
Mamoona Humayun, Gang Cui
2013 A conf
EASE
Mamoona Humayun, Gang Cui, Isma Masood
2012 C conf
SEKE
Mamoona Humayun, Gang Cui
redb/ext/spoof_check.py
← Index redb/ext/spoof_check.py python
import copy
import struct
from enum import Enum

"""
Checks that the metadata within a file's Rich header does not contradict the
other metadata contained within it.

References:
    https://gist.github.com/skochinsky/07c8e95e33d9429d81a75622b5d24c8b
    https://www.sec.in.tum.de/i20/publications/finding-the-needle-a-study-of-
    the-pe32-rich-header-and-respective-malware-triage
"""

KNOWN_PRODUCT_IDS = {
    0: "Unknown",
    1: "Import0",
    2: "Linker510",
    3: "Cvtomf510",
    4: "Linker600",
    5: "Cvtomf600",
    6: "Cvtres500",
    7: "Utc11_Basic",
    8: "Utc11_C",
    9: "Utc12_Basic",
    10: "Utc12_C",
    11: "Utc12_CPP",
    12: "AliasObj60",
    13: "VisualBasic60",
    14: "Masm613",
    15: "Masm710",
    16: "Linker511",
    17: "Cvtomf511",
    18: "Masm614",
    19: "Linker512",
    20: "Cvtomf512",
    21: "Utc12_C_Std",
    22: "Utc12_CPP_Std",
    23: "Utc12_C_Book",
    24: "Utc12_CPP_Book",
    25: "Implib700",
    26: "Cvtomf700",
    27: "Utc13_Basic",
    28: "Utc13_C",
    29: "Utc13_CPP",
    30: "Linker610",
    31: "Cvtomf610",
    32: "Linker601",
    33: "Cvtomf601",
    34: "Utc12_1_Basic",
    35: "Utc12_1_C",
    36: "Utc12_1_CPP",
    37: "Linker620",
    38: "Cvtomf620",
    39: "AliasObj70",
    40: "Linker621",
    41: "Cvtomf621",
    42: "Masm615",
    43: "Utc13_LTCG_C",
    44: "Utc13_LTCG_CPP",
    45: "Masm620",
    46: "ILAsm100",
    47: "Utc12_2_Basic",
    48: "Utc12_2_C",
    49: "Utc12_2_CPP",
    50: "Utc12_2_C_Std",
    51: "Utc12_2_CPP_Std",
    52: "Utc12_2_C_Book",
    53: "Utc12_2_CPP_Book",
    54: "Implib622",
    55: "Cvtomf622",
    56: "Cvtres501",
    57: "Utc13_C_Std",
    58: "Utc13_CPP_Std",
    59: "Cvtpgd1300",
    60: "Linker622",
    61: "Linker700",
    62: "Export622",
    63: "Export700",
    64: "Masm700",
    65: "Utc13_POGO_I_C",
    66: "Utc13_POGO_I_CPP",
    67: "Utc13_POGO_O_C",
    68: "Utc13_POGO_O_CPP",
    69: "Cvtres700",
    70: "Cvtres710p",
    71: "Linker710p",
    72: "Cvtomf710p",
    73: "Export710p",
    74: "Implib710p",
    75: "Masm710p",
    76: "Utc1310p_C",
    77: "Utc1310p_CPP",
    78: "Utc1310p_C_Std",
    79: "Utc1310p_CPP_Std",
    80: "Utc1310p_LTCG_C",
    81: "Utc1310p_LTCG_CPP",
    82: "Utc1310p_POGO_I_C",
    83: "Utc1310p_POGO_I_CPP",
    84: "Utc1310p_POGO_O_C",
    85: "Utc1310p_POGO_O_CPP",
    86: "Linker624",
    87: "Cvtomf624",
    88: "Export624",
    89: "Implib624",
    90: "Linker710",
    91: "Cvtomf710",
    92: "Export710",
    93: "Implib710",
    94: "Cvtres710",
    95: "Utc1310_C",
    96: "Utc1310_CPP",
    97: "Utc1310_C_Std",
    98: "Utc1310_CPP_Std",
    99: "Utc1310_LTCG_C",
    100: "Utc1310_LTCG_CPP",
    101: "Utc1310_POGO_I_C",
    102: "Utc1310_POGO_I_CPP",
    103: "Utc1310_POGO_O_C",
    104: "Utc1310_POGO_O_CPP",
    105: "AliasObj710",
    106: "AliasObj710p",
    107: "Cvtpgd1310",
    108: "Cvtpgd1310p",
    109: "Utc1400_C",
    110: "Utc1400_CPP",
    111: "Utc1400_C_Std",
    112: "Utc1400_CPP_Std",
    113: "Utc1400_LTCG_C",
    114: "Utc1400_LTCG_CPP",
    115: "Utc1400_POGO_I_C",
    116: "Utc1400_POGO_I_CPP",
    117: "Utc1400_POGO_O_C",
    118: "Utc1400_POGO_O_CPP",
    119: "Cvtpgd1400",
    120: "Linker800",
    121: "Cvtomf800",
    122: "Export800",
    123: "Implib800",
    124: "Cvtres800",
    125: "Masm800",
    126: "AliasObj800",
    127: "PhoenixPrerelease",
    128: "Utc1400_CVTCIL_C",
    129: "Utc1400_CVTCIL_CPP",
    130: "Utc1400_LTCG_MSIL",
    131: "Utc1500_C",
    132: "Utc1500_CPP",
    133: "Utc1500_C_Std",
    134: "Utc1500_CPP_Std",
    135: "Utc1500_CVTCIL_C",
    136: "Utc1500_CVTCIL_CPP",
    137: "Utc1500_LTCG_C",
    138: "Utc1500_LTCG_CPP",
    139: "Utc1500_LTCG_MSIL",
    140: "Utc1500_POGO_I_C",
    141: "Utc1500_POGO_I_CPP",
    142: "Utc1500_POGO_O_C",
    143: "Utc1500_POGO_O_CPP",
    144: "Cvtpgd1500",
    145: "Linker900",
    146: "Export900",
    147: "Implib900",
    148: "Cvtres900",
    149: "Masm900",
    150: "AliasObj900",
    151: "Resource900",
    152: "AliasObj1000",
    154: "Cvtres1000",
    155: "Export1000",
    156: "Implib1000",
    157: "Linker1000",
    158: "Masm1000",
    170: "Utc1600_C",
    171: "Utc1600_CPP",
    172: "Utc1600_CVTCIL_C",
    173: "Utc1600_CVTCIL_CPP",
    174: "Utc1600_LTCG_C ",
    175: "Utc1600_LTCG_CPP",
    176: "Utc1600_LTCG_MSIL",
    177: "Utc1600_POGO_I_C",
    178: "Utc1600_POGO_I_CPP",
    179: "Utc1600_POGO_O_C",
    180: "Utc1600_POGO_O_CPP",
    183: "Linker1010",
    184: "Export1010",
    185: "Implib1010",
    186: "Cvtres1010",
    187: "Masm1010",
    188: "AliasObj1010",
    199: "AliasObj1100",
    201: "Cvtres1100",
    202: "Export1100",
    203: "Implib1100",
    204: "Linker1100",
    205: "Masm1100",
    206: "Utc1700_C",
    207: "Utc1700_CPP",
    208: "Utc1700_CVTCIL_C",
    209: "Utc1700_CVTCIL_CPP",
    210: "Utc1700_LTCG_C ",
    211: "Utc1700_LTCG_CPP",
    212: "Utc1700_LTCG_MSIL",
    213: "Utc1700_POGO_I_C",
    214: "Utc1700_POGO_I_CPP",
    215: "Utc1700_POGO_O_C",
    216: "Utc1700_POGO_O_CPP",
    219: "Cvtres1200",
    220: "Export1200",
    221: "Implib1200",
    222: "Linker1200",
    223: "Masm1200",
    # Speculation
    224: "AliasObj1200",
    237: "Cvtres1210",
    238: "Export1210",
    239: "Implib1210",
    240: "Linker1210",
    241: "Masm1210",
    # Speculation
    242: "Utc1810_C",
    243: "Utc1810_CPP",
    244: "Utc1810_CVTCIL_C",
    245: "Utc1810_CVTCIL_CPP",
    246: "Utc1810_LTCG_C ",
    247: "Utc1810_LTCG_CPP",
    248: "Utc1810_LTCG_MSIL",
    249: "Utc1810_POGO_I_C",
    250: "Utc1810_POGO_I_CPP",
    251: "Utc1810_POGO_O_C",
    252: "Utc1810_POGO_O_CPP",
    255: "Cvtres1400",
    256: "Export1400",
    257: "Implib1400",
    258: "Linker1400",
    259: "Masm1400",
    260: "Utc1900_C",
    261: "Utc1900_CPP",
    # Speculation
    262: "Utc1900_CVTCIL_C",
    263: "Utc1900_CVTCIL_CPP",
    264: "Utc1900_LTCG_C ",
    265: "Utc1900_LTCG_CPP",
    266: "Utc1900_LTCG_MSIL",
    267: "Utc1900_POGO_I_C",
    268: "Utc1900_POGO_I_CPP",
    269: "Utc1900_POGO_O_C",
    270: "Utc1900_POGO_O_CPP",
}


class Result(Enum):
    VALID = 0
    INVALID = 1
    UNABLE_TO_PARSE = 2


def _rol(val, num):
    """Rotates val to the left by num bits."""
    return ((val << (num % 32)) & 0xFFFFFFFF) | (val >> (32 - (num % 32)))


def checksum_test(pe, rich_header):
    """Tests that the Rich header checksum is valid.

    Computes what the Rich header checksum should be. If the Rich header
    contains a different checksum value, this function returns INVALID
    This indicates that either the Rich header or MS-DOS stub has been modified

    The Rich header checksum is computed from the following:
        Length of the MS-DOS stub
        Contents of the MS-DOS stub, with e_lfanew zeroed out
        Rich header @Comp.IDs and lowest 5 bits of each count
    """
    if rich_header is None:
        rich_header = {}
    # Checksum stored in Rich header
    rich_checksum = rich_header.get("checksum", None)

    # Get DOS header data
    if pe.DOS_HEADER.e_lfanew > len(pe.__data__):
        return Result.UNABLE_TO_PARSE
    data = pe.__data__[: pe.DOS_HEADER.e_lfanew]

    # Get start marker
    mask = 0x536E6144  # DanS (little-endian)
    start_marker = struct.pack(
        "<LLLL", rich_checksum ^ mask, rich_checksum, rich_checksum, rich_checksum
    )
    if not len(start_marker):
        return Result.UNABLE_TO_PARSE

    # Get index of start marker
    start_index = data.find(start_marker)
    if start_index == -1:
        return Result.UNABLE_TO_PARSE

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.UNABLE_TO_PARSE

    # Compute cd as MS-DOS stub portion of checksum
    # Zero out e_lfanew from 0x3c to 0x3f
    cd = 0
    for i in range(start_index):
        if i >= 0x3C and i <= 0x3F:
            cd += _rol(0, i)
        else:
            cd += _rol(data[i], i)

    # Compute cd as Rich header portion of checksum
    cr = 0
    while len(rich_fields):
        compid = rich_fields.pop(0)
        count = rich_fields.pop(0)
        cr += _rol(compid, count & 0x1F)

    # Compute checksum from MS-DOS stub start index, cd, cr
    # Only keep lowest 32 bits
    checksum = (start_index + cd + cr) & 0xFFFFFFFF

    # Compare computed checksum with the checksum in the Rich header
    if checksum != rich_checksum:
        return Result.INVALID
    else:
        return Result.VALID


def duplicate_test(pe, rich_header):
    """Checks for duplicate @Comp.IDs in the Rich header.

    If the Rich header contains duplicate entries, returns INVALID
    This indicates that the Rich header has been modified
    """
    if rich_header is None:
        rich_header = {}

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.UNABLE_TO_PARSE

    # Get a list of @Comp.IDs in rich_fields
    compids = []
    for i in range(len(rich_fields)):
        if i % 2 == 0:
            compids.append(rich_fields[i])

    # Check if any @Comp.IDs are duplicates
    if len(compids) != len(set(compids)):
        return Result.INVALID

    return Result.VALID


def linker_test(pe, rich_header):
    """Checks that the Rich and PE header linker versions do not conflict.

    Certain Rich Header ProdIDs correspond to linker versions
    Although they are undocumented, we have used prior research as well as our
    own to determine many of them
    There are likely more linker version ProdIDs that we have not identified

    If the linker versions conflict, this function returns INVALID
    This indicates that the Rich header or PE header has been modified
    """
    if rich_header is None:
        rich_header = {}

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.UNABLE_TO_PARSE

    # Get list of ProdIDs from rich_fields
    prodids = []
    for i in range(len(rich_fields)):
        if i % 2 == 0:
            prodids.append(rich_fields[i] >> 16)

    # Parse major and minor linker versions from PE header
    pe_major = pe.OPTIONAL_HEADER.MajorLinkerVersion
    pe_minor = pe.OPTIONAL_HEADER.MinorLinkerVersion

    # Iterate over Rich header ProdIDs
    found_linker = False
    for prodid in prodids:

        # Only interested in ProdIDs that correspond to linker versions
        if KNOWN_PRODUCT_IDS.get(prodid) is None:
            continue
        prodid_name = KNOWN_PRODUCT_IDS[prodid]
        if not prodid_name.startswith("Linker"):
            continue

        found_linker = True

        # Parse major and minor linker version from ProdID
        prodid_name = prodid_name[6:]
        if prodid_name.endswith("p"):
            prodid_name = prodid_name[:-1]
        rich_major = int(prodid_name[:-2])
        rich_minor = int(prodid_name[-2:])

        # Check whether the Rich and PE linker versions match
        if pe_major == rich_major and pe_minor == rich_minor:
            return Result.VALID

    if not found_linker:
        return Result.UNABLE_TO_PARSE

    return Result.INVALID


def import_count_test(pe, rich_header):
    """Checks that import0 does not conflict with the IAT import count.

    The Rich header contains a ProdID called import0
    It is related to the number of imports in the IAT, but we are unsure how
    It is never less than the number of imports in the IAT

    If import0 is less than IAT import count, this function returns INVALID
    This indicates that the Rich header or IAT has been modified
    """
    if rich_header is None:
        rich_header = {}

    # Check whether the file has an IAT
    if not hasattr(pe, "DIRECTORY_ENTRY_IMPORT"):
        return Result.UNABLE_TO_PARSE

    # Get the number of imports in the IAT
    iat_count = 0
    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        for imported_function in entry.imports:
            iat_count += 1

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.INVALID

    # Get @Comp.ID 65536 (ProdID Import0)
    import0_count = None
    while len(rich_fields):
        compid = rich_fields.pop(0)
        count = rich_fields.pop(0)
        if compid == 65536:
            import0_count = count

    # Legitimate files never have import0_count < iat_count
    if import0_count is None:
        return Result.VALID

    if import0_count < iat_count:
        return Result.INVALID

    return Result.VALID