Wei Xie

62 papers Misc 28Journal 34
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Hua Zheng, Wei Xie, Mingbin Ben Feng, Keilung Choy
2025 J jnl
CoRR
Keilung Choy, Wei Xie, Keqi Wang
2025 J jnl
CoRR
Hua Zheng, Wei Xie, Ilya O. Ryzhov, Keilung Choy
2025 J jnl
Asia Pac. J. Oper. Res.
Zixuan Bai, Jun Luo, Wei Xie, Junkai Zhao
2024 Misc conf
WSC
Keilung Choy, Wei Xie
2024 Misc conf
WSC
Fuqiang Cheng, Wei Xie, Hua Zheng
2024 J jnl
CoRR
Fuqiang Cheng, Wei Xie, Hua Zheng
2024 Misc conf
WSC
Wandi Xu, Wei Xie
2024 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Zicheng Wang, Wei Xie, Zhengchun Zhou, Hua Meng, Meng Yang
2024 Misc conf
WSC
Junkai Zhao, Jun Luo, Wei Xie, Zixuan Bai
2023 J jnl
INFORMS J. Comput.
Hua Zheng, Wei Xie, Ilya O. Ryzhov, Dongming Xie
2023 Misc conf
WSC
Junkai Zhao, Jun Luo, Wei Xie
2023 Misc conf
WSC
Keqi Wang, Wei Xie, Hua Zheng
2023 J jnl
Eur. J. Oper. Res.
Wei Xie, Russell R. Barton, Barry L. Nelson, Keqi Wang
2023 Misc conf
WSC
Hua Zheng, Wei Xie, Chunsheng Fang, Wandi Xu, Paul C. Whitford, Ailun Wang
2022 J jnl
J. Simulation
Qiong Zhang, Bo Wang, Wei Xie
2022 J jnl
CoRR
Wei Xie, Keqi Wang, Hua Zheng, Mingbin Ben Feng
2022 Misc conf
WSC
Wei Xie, Giulia Pedrielli
2022 Misc conf
WSC
Hua Zheng, Wei Xie
2022 J jnl
CoRR
Wei Xie, Giulia Pedrielli
2022 J jnl
CoRR
Hua Zheng, Wei Xie, Keqi Wang, Zheng Li
2022 Misc conf
WSC
Wei Xie, Keqi Wang, Hua Zheng, Mingbin Ben Feng
2022 J jnl
CoRR
Wei Xie, Russell R. Barton, Barry L. Nelson, Keqi Wang
2022 J jnl
CoRR
Hua Zheng, Wei Xie
2021 J jnl
SIAM/ASA J. Uncertain. Quantification
Wei Xie, Cheng Li, Yuefeng Wu, Pu Zhang
2021 J jnl
ACM Trans. Model. Comput. Simul.
Wei Xie, Yuan Yi, Hua Zheng
2021 J jnl
CoRR
Hua Zheng, Wei Xie, Mingbin Ben Feng
2021 J jnl
CoRR
Hua Zheng, Wei Xie, Ilya O. Ryzhov, Dongming Xie
2021 J jnl
CoRR
Hua Zheng, Jiahao Zhu, Wei Xie, Judy Zhong
2021 J jnl
CoRR
Bo Wang, Wei Xie, Tugce G. Martagan, Alp Akcay
2021 J jnl
BMC Medical Informatics Decis. Mak.
Hua Zheng, Jiahao Zhu, Wei Xie, Judy Zhong
2020 J jnl
CoRR
Keqi Wang, Wencen Wu, Wei Xie, Jinxiang Pei, Qi Zhou
2020 J jnl
CoRR
Yuan Yi, Wei Xie, Zhi Zhou, Keqi Wang
2020 Misc conf
WSC
Hua Zheng, Wei Xie, Mingbin Ben Feng
2020 J jnl
CoRR
Hua Zheng, Wei Xie, Mingbin Ben Feng
2020 J jnl
CoRR
Hua Zheng, Ilya O. Ryzhov, Wei Xie, Judy Zhong
2020 Misc conf
WSC
Keqi Wang, Wei Xie, Bo Wang, Jinxiang Pei, Wencen Wu, Mike Baker, Qi Zhou
2020 J jnl
CoRR
Keqi Wang, Wei Xie, Wencen Wu, Bo Wang, Jinxiang Pei, Mike Baker, Qi Zhou
2019 J jnl
CoRR
Wei Xie, Bo Wang, Cheng Li, Jared Auclair, Peter Baker
2019 J jnl
Eur. J. Oper. Res.
Bo Wang, Qiong Zhang, Wei Xie
2019 J jnl
CoRR
Wei Xie, Yuan Yi, Hua Zheng
2019 Misc conf
WSC
Wei Xie, Bo Wang, Pu Zhang
2019 Misc conf
WSC
Wei Xie, Bo Wang, Zehao Ye, Wencen Wu, Jie You, Qi Zhou
2019 Misc conf
WSC
Bo Wang, Wei Xie, Tugce G. Martagan, Alp Akcay, Canan G. Corlu
2018 Misc conf
WSC
Wei Xie, Pu Zhang, Ilya O. Ryzhov
2018 Misc conf
WSC
Wei Xie, Bo Wang, Qiong Zhang
2018 Misc conf
WSC
Yuan Yi, Wei Xie, Zhi Zhou
2017 J jnl
ACM Trans. Model. Comput. Simul.
Wei Xie, Cheng Li, Pu Zhang
2017 Misc conf
WSC
Wei Xie, Pu Zhang, Qiong Zhang
2017 J jnl
ACM Trans. Model. Comput. Simul.
Yuan Yi, Wei Xie
2017 Misc conf
WSC
Qiong Zhang, Wei Xie
2017 Misc conf
WSC
Bo Wang, Qiong Zhang, Wei Xie
2016 Misc conf
WSC
Wei Xie, Yuan Yi
2016 J jnl
ACM Trans. Model. Comput. Simul.
Wei Xie, Barry L. Nelson, Russell R. Barton
2015 Misc conf
WSC
Yuan Yi, Wei Xie, Enlu Zhou
2015 Misc conf
WSC
Wei Xie, Hongtan Sun, Cheng Li
2015 Misc conf
WSC
Enlu Zhou, Wei Xie
2014 J jnl
Oper. Res.
Wei Xie, Barry L. Nelson, Russell R. Barton
2014 J jnl
INFORMS J. Comput.
Russell R. Barton, Barry L. Nelson, Wei Xie
2014 Misc conf
WSC
Wei Xie, Barry L. Nelson, Russell R. Barton
2010 Misc conf
WSC
Russell R. Barton, Barry L. Nelson, Wei Xie
2010 Misc conf
WSC
Wei Xie, Barry L. Nelson, Jeremy Staum
redb/extractors/pe_extractors/pe_signature_old.py
← Index redb/extractors/pe_extractors/pe_signature_old.py python
import inspect
import pefile

from hashlib import md5, sha1, sha256

from asn1crypto import cms, pem, x509, core

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PECertificate, PESigner


class PESignatureExtractor(PEExtractor):
    """
    RFC 3161 - Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)
    Section 2.4.2 defines the TSTInfo structure.
    https://tools.ietf.org/html/rfc3161#section-2.4.2

    Microsoft Authenticode Time Stamping Specification
    https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx
    """

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

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

    @staticmethod
    def _extract_certificate_info(cert_data):
        # self.log.debug(inspect.currentframe().f_code.co_name)

        certificate = x509.Certificate.load(cert_data)
        certificate_serial_number = format(certificate.serial_number, "x").upper()
        grouped_serial_number = ":".join(
            [
                certificate_serial_number[i : i + 2]
                for i in range(0, len(certificate_serial_number), 2)
            ]
        )
        return PECertificate(
            _id=format(certificate.serial_number, "x").upper(),
            certificate_serial_number=grouped_serial_number,
            certificate_issuer=certificate.issuer.human_friendly,
            certificate_subject=certificate.subject.human_friendly,
            certificate_valid_from=certificate["tbs_certificate"]["validity"][
                "not_before"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_valid_to=certificate["tbs_certificate"]["validity"][
                "not_after"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_thumbprint=sha1(cert_data).hexdigest().upper(),
            certificate_md5=md5(cert_data).hexdigest().upper(),
            certificate_sha256=sha256(cert_data).hexdigest().upper(),
        )

    @staticmethod
    def _parse_microsoft_time_stamp(ts_token):
        class TSTInfo(core.Sequence):
            _fields = [
                ("version", core.Integer),
                ("policy_id", core.ObjectIdentifier),
                ("message_imprint", core.Sequence),
                ("serial_number", core.Integer),
                ("gen_time", core.GeneralizedTime),
                ("accuracy", core.Sequence, {"optional": True}),
                ("ordering", core.Boolean, {"optional": True}),
                ("nonce", core.Integer, {"optional": True}),
                ("tsa", core.Sequence, {"optional": True}),
                ("extensions", core.Sequence, {"optional": True}),
            ]

        # The content should be SignedData
        signed_data = ts_token["content"]

        # The actual timestamp should be in the encapContentInfo
        encap_content_info = signed_data["encap_content_info"]
        tst_info = TSTInfo.load(encap_content_info["content"])

        # Extract the genTime field from TSTInfo, type(genTime): <class 'datetime.datetime'>
        gen_time = tst_info["gen_time"].native

        return gen_time

    def _extract_signer_info(self, signer):
        self.log.debug(inspect.currentframe().f_code.co_name)
        signing_time = None

        for attr_set in [signer["signed_attrs"], signer["unsigned_attrs"]]:
            if attr_set:
                for attribute in attr_set:
                    attr_type = attribute["type"].dotted
                    if attr_type == "1.2.840.113549.1.9.5":  # signingTime
                        signing_time = attribute["values"][0].native
                        break
                    elif (
                        attr_type == "1.3.6.1.4.1.311.3.2.1"
                        or attr_type == "1.3.6.1.4.1.311.3.3.1"
                    ):  # microsoft_time_stamp_token
                        try:
                            ts_token = attribute["values"][0].native
                            signing_time = self._parse_microsoft_time_stamp(ts_token)
                            self.log.debug(
                                f"Signing Time from Microsoft Time Stamp Token: {signing_time}"
                            )
                        except Exception as e:
                            self.log.error(
                                f"Error parsing Microsoft Time Stamp Token: {e}"
                            )
                            self.log.error("Token structure:", attribute["values"][0])
                    elif attr_type == "1.2.840.113549.1.9.6":  # counterSignature
                        counter_sig_values = attribute["values"]
                        for counter_sig_value in counter_sig_values:
                            try:
                                counter_sig_info = cms.SignerInfo.load(
                                    counter_sig_value.native
                                )
                                cs_signed_attrs = counter_sig_info["signed_attrs"]
                                for cs_attr in cs_signed_attrs:
                                    cs_attr_type = cs_attr["type"].dotted
                                    if (
                                        cs_attr_type == "1.2.840.113549.1.9.5"
                                    ):  # signingTime
                                        signing_time = cs_attr["values"][0].native
                                        self.log.debug(
                                            "Signing Time (from countersignature):",
                                            signing_time,
                                        )
                                        break
                                if signing_time:
                                    break
                            except Exception as e:
                                self.log.error(
                                    f"Error processing countersignature: {e}"
                                )
                    if signing_time:
                        break
            if signing_time:
                break
        signer_serial_number = format(
            signer["sid"].native["serial_number"], "x"
        ).upper()
        grouped_serial_number = " ".join(
            [
                signer_serial_number[i : i + 2]
                for i in range(0, len(signer_serial_number), 2)
            ]
        )
        return PESigner(
            # this is to avoid duplicate _id with the Signer certificate used to sign as they are in the same ES index
            _id=format(signer["sid"].native["serial_number"], "x").upper()
            + signer["digest_algorithm"]["algorithm"].native,
            signer_serial_number=grouped_serial_number,
            signer_digest_algorithm=signer["digest_algorithm"]["algorithm"].native,
            signer_signature_algorithm=signer["signature_algorithm"][
                "algorithm"
            ].native,
            signing_time=(
                signing_time.strftime("%Y-%m-%d %H:%M:%S") if signing_time else None
            ),
            # "countersigners": extract_countersigners(signer), # TODO: Implement this
        )

    def _extract_signature_info(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        address = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        size = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].Size

        addr_8 = address + 8
        signature_data = bytes(
            self.pe.write()[addr_8 : addr_8 + size]  # noqa E203
        )  # Ensure this is a bytes object
        if pem.detect(signature_data):
            signature_data = pem.unarmor(signature_data)

        content_info = cms.ContentInfo.load(signature_data)
        signed_data = content_info["content"]

        certificates = signed_data["certificates"]
        signers = signed_data["signer_infos"]

        certificates_list = []
        for cert in certificates:
            cert_info = self._extract_certificate_info(cert.chosen.dump())
            certificates_list.append(cert_info)

        signer_info_list = []
        for signer in signers:
            signer_info = self._extract_signer_info(signer)
            signer_info_list.append(signer_info)

        return certificates_list, signer_info_list

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            if self._is_signed():
                certificates_list, signers_list = self._extract_signature_info()
                # self.export_to_elastic([PECodeSigning(certificates_list, signers_list)])
                self.export_to_elastic(certificates_list, Tag.PE_CERTIFICATE.value)
                self.export_to_elastic(signers_list, Tag.PE_SIGNER.value)
            return True
        except Exception as e:
            self.log.error(f"Error extracting PE Signature: {e}")
            return None