Xiaofeng Han

60 papers A* 3A 4B 2Misc 2Journal 43Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Rongtao Xu, Mingming Yu, Xiaofeng Han, Yu Zhang, Kaiyi Hu, Zhe Feng, Zenghuang Fu, Changwei Wang, Weiliang Meng, Xiaopeng Zhang
2026 J jnl
Inf. Fusion
Xiaofeng Han, Shunpeng Chen, Zenghuang Fu, Zhe Feng, Lue Fan, Dong An, Changwei Wang, Li Guo, Weiliang Meng, Xiaopeng Zhang, Rongtao Xu, Shibiao Xu
2025 J jnl
CoRR
Xiaofeng Han, Xiaochen Chu, Tao Chao, Ming Yang, Miqing Li
2025 J jnl
CoRR
Xinpeng Chen, Xiaofeng Han, Kaihao Zhang, Guochao Ren, Yujie Wang, Wenhao Cao, Yang Zhou, Jianfeng Lu, Zhenbo Song
2025 J jnl
CoRR
Zenghuang Fu, Xiaofeng Han, Mingda Jia, Jin Ming Yang, Qi Zeng, Muyang Zahng, Changwei Wang, Weiliang Meng, Xiaopeng Zhang
2025 J jnl
Inf. Process. Manag.
Xiaofeng Han, Xiangwu Meng, Yujie Zhang
2025 J jnl
IEEE J. Biomed. Health Informatics
Xuyang Zhang, Shuaitong Zhang, Xuehuan Zhang, Jiang Xiong, Xiaofeng Han, Ziheng Wu, Dan Zhao, Youjin Li, Yao Xu, Duanduan Chen
2025 J jnl
Eng. Appl. Artif. Intell.
Tao Chao, Xiaofeng Han, Xiang Li, Ming Yang
2025 J jnl
CoRR
Xiaofeng Han, Shunpeng Chen, Zenghuang Fu, Zhe Feng, Lue Fan, Dong An, Changwei Wang, Li Guo, Weiliang Meng, Xiaopeng Zhang, Rongtao Xu, Shibiao Xu
2024 J jnl
Swarm Evol. Comput.
Xiaofeng Han, Tao Chao, Ming Yang, Miqing Li
2024 J jnl
Entertain. Comput.
Xiaofeng Han
2024 conf
LREC/COLING
Honglin Mu, Yang Xu, Yunlong Feng, Xiaofeng Han, Yitong Li, Yutai Hou, Wanxiang Che
2024 J jnl
CoRR
Honglin Mu, Yang Xu, Yunlong Feng, Xiaofeng Han, Yitong Li, Yutai Hou, Wanxiang Che
2024 A conf
GECCO
Miqing Li, Xiaofeng Han, Xiaochen Chu, Zimin Liang
2024 J jnl
Swarm Evol. Comput.
Xiaochen Chu, Xiaofeng Han, Maorui Zhang, Miqing Li
2023 J jnl
IEEE Trans. Knowl. Data Eng.
Xiangwu Meng, Yulu Du, Yujie Zhang, Xiaofeng Han
2023 A conf
GECCO
Miqing Li, Xiaofeng Han, Xiaochen Chu
2023 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Liying Zhu, Xiaofeng Han, Zhiguo Yan
2023 J jnl
CoRR
Yuyang Zhang, Xiaofeng Han, Baojun Wang
2022 J jnl
CoRR
Xiaofeng Han, Amjed Tahir, Peng Liang, Steve Counsell, Kelly Blincoe, Bing Li, Yajing Luo
2022 J jnl
Empir. Softw. Eng.
Xiaofeng Han, Amjed Tahir, Peng Liang, Steve Counsell, Kelly Blincoe, Bing Li, Yajing Luo
2022 J jnl
Autom. Softw. Eng.
Can Cheng, Bing Li, Zengyang Li, Peng Liang, Xiaofeng Han, Jiahua Zhang
2022 A conf
ESEM
Liming Fu, Peng Liang, Zeeshan Rasheed, Zengyang Li, Amjed Tahir, Xiaofeng Han
2022 J jnl
CoRR
Liming Fu, Peng Liang, Zeeshan Rasheed, Zengyang Li, Amjed Tahir, Xiaofeng Han
2022 J jnl
Brain Informatics
Shuxia Guo, Jie Xue, Jian Liu, Xiangqiao Ye, Yichen Guo, Di Liu, Xuan Zhao, Feng Xiong, Xiaofeng Han, Hanchuan Peng
2021 J jnl
KSII Trans. Internet Inf. Syst.
Jinsheng Hao, Guoping Su, Xiaofeng Han, Wei Nie
2021 A conf
ICPC
Xiaofeng Han, Amjed Tahir, Peng Liang, Steve Counsell, Yajing Luo
2021 J jnl
CoRR
Xiaofeng Han, Amjed Tahir, Peng Liang, Steve Counsell, Yajing Luo
2020 conf
AIAM
Jiahui Hu, Qing Zang, Xiaofeng Han, Ailan Hu, Shumei Xiao, Junyu Zhao
2020 J jnl
IEEE Geosci. Remote. Sens. Lett.
Jianchen Liu, Wei Xu, Tao Jiang, Xiaofeng Han
2020 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Xiaofeng Han, Tao Jiang, Zifei Zhao, Zhongteng Lei
2019 J jnl
IEEE Access
Zhijian Wang, Jie Zhou, Junyuan Wang, Wenhua Du, Jingtai Wang, Xiaofeng Han, Gaofeng He
2019 J jnl
Complex.
Zhijian Wang, Likang Zheng, Wenhua Du, Wenan Cai, Jie Zhou, Jingtai Wang, Xiaofeng Han, Gaofeng He
2019 J jnl
IEEE Access
Zhijian Wang, Gaofeng He, Wenhua Du, Jie Zhou, Xiaofeng Han, Jingtai Wang, Huihui He, Xiaoming Guo, Junyuan Wang, Yanfei Kou
2019 J jnl
Entropy
Wenhua Du, Xiaoming Guo, Xiaofeng Han, Junyuan Wang, Jie Zhou, Zhijian Wang, Xingyan Yao, Yanjun Shao, Guanjun Wang
2019 J jnl
Web Intell.
Xiaofeng Han, Liejun Wang, Jiwei Qin
2019 J jnl
CoRR
Huafeng Liu, Xiaofeng Han, Xiangrui Li, Yazhou Yao, Pu Huang, Zhenming Tang
2019 J jnl
Multim. Tools Appl.
Huafeng Liu, Xiaofeng Han, Xiangrui Li, Yazhou Yao, Pu Huang, Zhenmin Tang
2019 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Xiaofeng Han, Xianghui Cui, Lin Ding, Zengshun Li
2019 J jnl
Sensors
Junyuan Wang, Xiaofeng Han, Zhijian Wang, Wenhua Du, Jie Zhou, Jiping Zhang, Huihui He, Xiaoming Guo
2019 conf
ICSE (SEIP)
Muhammad Ali Gulzar, Yongkang Zhu, Xiaofeng Han
2019 J jnl
J. Vis. Commun. Image Represent.
Mingju Chen, Xiaofeng Han, Hua Zhang, Guojun Lin, M. M. Kamruzzaman
2019 J jnl
Entropy
Jie Zhou, Xiaoming Guo, Zhijian Wang, Wenhua Du, Junyuan Wang, Xiaofeng Han, Jingtai Wang, Gaofeng He, Huihui He, Huiling Xue, Yanfei Kou
2019 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Xiaofeng Han, Yan Li, Guodong Liu
2018 Misc conf
WISA
Rong Yang, Xiaofeng Han, Xingzhong Zhang
2018 J jnl
Entropy
Xiaofeng Han, Fei Li, Xinzhu Meng
2018 A* conf
ICRA
Xiaofeng Han, Jianfeng Lu, Chunxia Zhao, Hongdong Li
2018 J jnl
IEEE Signal Process. Lett.
Xiaofeng Han, Jianfeng Lu, Chunxia Zhao, Shaodi You, Hongdong Li
2018 conf
ECCV (6)
Xiaofeng Han, Chuong V. Nguyen, Shaodi You, Jianfeng Lu
2015 conf
ACPR
Xiaofeng Han, Jianfeng Lu, Ying Tai, Chunxia Zhao
2010 J jnl
IEEE Trans. Mob. Comput.
Xiaofeng Han, Xiang Cao, Errol L. Lloyd, Chien-Chung Shen
2008 B conf
SECON
Xiaofeng Han, Xiang Cao, Errol L. Lloyd, Chien-Chung Shen
2008 Misc conf
COCOON
Wei Ren, Guiying Yan, Guohui Lin, Caifeng Du, Xiaofeng Han
2007 conf
ROBOCOMM
Xiaofeng Han, Louis F. Rossi, Chien-Chung Shen
2007 A* conf
INFOCOM
Xiaofeng Han, Xiang Cao, Errol L. Lloyd, Chien-Chung Shen
2006 B conf
WCNC
Xiaofeng Han, Chien-Chung Shen, Zhuochuan Huang
2005 J jnl
J. Chem. Inf. Model.
Jianfeng Pei, Hao Chen, Zhenming Liu, Xiaofeng Han, Qi Wang, Bin Shen, Jiaju Zhou, Luhua Lai
1995 J jnl
SIAM J. Comput.
Xiaofeng Han, Pierre Kelsen, Vijaya Ramachandran, Robert Endre Tarjan
1993 J jnl
SIAM J. Comput.
Jiazhen Cai, Xiaofeng Han, Robert Endre Tarjan
1992 A* conf
SODA
Xiaofeng Han, Pierre Kelsen, Vijaya Ramachandran, Robert Endre Tarjan
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