Chang-An Yuan

61 papers B 1C 1Journal 38Unranked 21
YearRankTypeTitle / Venue / Authors
2025 J jnl
Artif. Intell. Rev.
Zhi-Peng Li, Siguo Wang, Qinhu Zhang, Yi-Jie Pan, Naian Xiao, Jiayang Guo, Chang-An Yuan, Wen-Jian Liu, De-Shuang Huang
2025 J jnl
IEEE Trans. Medical Imaging
Xiaosen Li, Linli Li, Xinlong Xing, Huixian Liao, Wenji Wang, Qiutong Dong, Xiao Qin, Chang-An Yuan
2025 J jnl
IEEE Trans. Signal Inf. Process. over Networks
Hailong Su, Zhipeng Li, Chang-An Yuan, Vladimir F. Filaretov, Deshuang Huang
2025 J jnl
Appl. Intell.
Hailong Su, Zhipeng Li, Chang-An Yuan, Vladimir F. Filaretov, De-Shuang Huang
2024 J jnl
Comput. Methods Programs Biomed.
Zipiao Zhu, Yang Liu, Chang-An Yuan, Xiao Qin, Feng Yang
2024 J jnl
Neurocomputing
Pengrui Teng, Wenjian Liu, Xuesong Wang, Di Wu, Chang-An Yuan, Yuhu Cheng, De-Shuang Huang
2024 J jnl
IEEE Trans. Artif. Intell.
Zhi-Peng Li, Hai-Long Su, Yong Wu, Qinhu Zhang, Chang-An Yuan, Valeriya V. Gribova, Vladimir Fedorovich Filaretov, De-Shuang Huang
2023 J jnl
Comput. Electr. Eng.
Zhiheng Yu, Jian Yuan, Yongsheng Li, Chang-An Yuan, Song Deng
2023 J jnl
Neurocomputing
Long Chen, Chang-An Yuan, Xiao Qin, Wei Sun, Xiaofeng Zhu
2023 J jnl
IEEE Trans. Biom. Behav. Identity Sci.
Yong Wu, Guo-Dui He, Li-Hua Wen, Xiao Qin, Chang-An Yuan, Valeriya V. Gribova, Vladimir Fedorovich Filaretov, De-Shuang Huang
2023 J jnl
BMC Bioinform.
Leon Wong, Lei Wang, Zhu-Hong You, Chang-An Yuan, Yu-An Huang, Mei-Yuan Cao
2023 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Zheng-Wei Li, Qiankun Wang, Chang-An Yuan, Pengyong Han, Zhu-Hong You, Lei Wang
2023 J jnl
Comput. Biol. Medicine
Xiaosen Li, Xiao Qin, Chengliang Huang, Yuer Lu, Jinyan Cheng, Liansheng Wang, Ou Liu, Jianwei Shuai, Chang-An Yuan
2023 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Qinhu Zhang, Youhong Xu, Siguo Wang, Yong Wu, Yuan-Nong Ye, Chang-An Yuan, Valeriya V. Gribova, Vladimir Fedorovich Filaretov, De-Shuang Huang
2022 J jnl
ACM Trans. Intell. Syst. Technol.
Nan Han, Shaojie Qiao, Kun Yue, Jianbin Huang, Qiang He, Tingting Tang, Faliang Huang, Chunlin He, Chang-An Yuan
2022 conf
ICIC (3)
Hamdan Taleb, Zhipeng Li, Chang-An Yuan, Hongjie Wu, Xingming Zhao, Fahd A. Ghanem
2022 conf
ICIC (2)
Xianbao Tan, Chang-An Yuan, Hongjie Wu, Xingming Zhao
2022 conf
ICIC (2)
Peng Lei, Chang-An Yuan, Hongjie Wu, Xingming Zhao
2022 conf
ICIC (3)
Anton S. Gubankov, Dmitry Yukhimets, Vladimir F. Filaretov, Chang-An Yuan
2022 J jnl
Appl. Intell.
Shaojie Qiao, Nan Han, Faliang Huang, Kun Yue, Tao Wu, Yugen Yi, Rui Mao, Chang-An Yuan
2022 J jnl
Appl. Intell.
Faliang Huang, Chang-An Yuan, Yingzhou Bi, Jianbo Lu, Liqiong Lu, Xing Wang
2022 J jnl
World Wide Web
Chang-An Yuan, Yonghua Zhu, Zhi Zhong, Wei Zheng, Xiaofeng Zhu
2021 J jnl
Inf. Process. Manag.
Chang-An Yuan, Zhi Zhong, Cong Lei, Xiaofeng Zhu, Rongyao Hu
2021 J jnl
Knowl. Based Syst.
Xiaoming Ye, Shaojie Qiao, Nan Han, Kun Yue, Tao Wu, Li Yang, Faliang Huang, Chang-An Yuan
2021 J jnl
IEEE Trans. Cogn. Dev. Syst.
Yong Wu, Kun Zhang, Di Wu, Chao Wang, Chang-An Yuan, Xiao Qin, Tao Zhu, Yuchuan Du, Hanli Wang, De-Shuang Huang
2021 J jnl
CAAI Trans. Intell. Technol.
Zhenfeng Huang, Shaojie Qiao, Nan Han, Chang-An Yuan, Xuejiang Song, Yueqiang Xiao
2021 conf
ICIC (3)
Youhong Xu, Qinghu Zhang, Zhanheng Chen, Chang-An Yuan, Xiao Qin, Hongjie Wu
2020 J jnl
IEEE Access
Xiao Qin, Jianhui Jiang, Chang-An Yuan, Shaojie Qiao, Wei Fan
2020 J jnl
CAAI Trans. Intell. Technol.
Liang Chen, Shaojie Qiao, Nan Han, Chang-An Yuan, Xuejiang Song, Ping Huang, Yueqiang Xiao
2020 J jnl
Appl. Soft Comput.
Song Deng, Xiangpeng Xie, Chang-An Yuan, Lechan Yang, Xindong Wu
2019 J jnl
Cogn. Syst. Res.
Di Wu, Si-Jia Zheng, Chang-An Yuan, De-Shuang Huang
2019 J jnl
Neurocomputing
Di Wu, Si-Jia Zheng, Wenzheng Bao, Xiao-Ping (Steven) Zhang, Chang-An Yuan, De-Shuang Huang
2019 J jnl
Neurocomputing
Di Wu, Si-Jia Zheng, Xiao-Ping (Steven) Zhang, Chang-An Yuan, Fei Cheng, Yang Zhao, Yong-Jun Lin, Zhong-Qiu Zhao, Yong-Li Jiang, De-Shuang Huang
2019 conf
ICIC (3)
Wei Qin, Xue Cui, Chang-An Yuan, Xiao Qin, Li Shang, Zhi-Kai Huang, Si-Zhe Wan
2019 conf
ICIC (2)
Wenbo Yu, Chang-An Yuan, Xiao Qin, Zhi-Kai Huang, Li Shang
2019 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Lin Yuan, Lehang Guo, Chang-An Yuan, Youhua Zhang, Kyungsook Han, Asoke K. Nandi, Barry Honig, De-Shuang Huang
2019 conf
ICIC (1)
Yang Zheng, Chang-An Yuan, Li Shang, Zhi-Kai Huang
2019 conf
ICIC (2)
Dailun Wang, Qinhu Zhang, Chang-An Yuan, Xiao Qin, Zhi-Kai Huang, Li Shang
2019 J jnl
IEEE Access
Di Wu, Hong-Wei Yang, De-Shuang Huang, Chang-An Yuan, Xiao Qin, Yang Zhao, Xin-Yong Zhao, Jian-Hong Sun
2019 conf
ICIC (1)
Zhihao Jiao, Lijun Zhang, Chang-An Yuan, Xiao Qin, Li Shang
2018 conf
ICIC (3)
Di Wu, Si-Jia Zheng, Fei Cheng, Yang Zhao, Chang-An Yuan, Xiao Qin, Yong-Li Jiang, De-Shuang Huang
2018 conf
ICIC (3)
Si-Jia Zheng, Di Wu, Fei Cheng, Yang Zhao, Chang-An Yuan, Xiao Qin, De-Shuang Huang
2018 conf
ICIC (3)
Dezhu Li, Hongwei Yang, Chang-An Yuan, Xiao Qin
2018 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Wenzheng Bao, Chang-An Yuan, Youhua Zhang, Kyungsook Han, Asoke K. Nandi, Barry Honig, De-Shuang Huang
2018 J jnl
Pattern Recognit. Lett.
Ruili Wang, Wanting Ji, Mingzhe Liu, Xun Wang, Jian Weng, Song Deng, Suying Gao, Chang-An Yuan
2017 B conf
IJCNN
Chong-Ya Li, Lin Zhu, Wenzheng Bao, Yong-Li Jiang, Chang-An Yuan, De-Shuang Huang
2017 J jnl
Complex.
Lin Yuan, Chang-An Yuan, De-Shuang Huang
2017 conf
ICIC (3)
Chong-Ya Li, Wenzheng Bao, Zhipeng Li, Youhua Zhang, Yong-Li Jiang, Chang-An Yuan
2017 J jnl
Int. J. Data Min. Bioinform.
Wenzheng Bao, Zhenhua Huang, Chang-An Yuan, De-Shuang Huang
2016 J jnl
Microprocess. Microsystems
Wenjing Li, Yingzhou Bi, Xiaofeng Zhu, Chang-An Yuan, Xiang-bo Zhang
2014 J jnl
Ad Hoc Networks
Yuan Rao, Jun Zhu, Chang-An Yuan, Zhao-Hui Jiang, Lei-yang Fu, Xing Shao, Ruchuan Wang
2014 J jnl
Neurocomputing
Yu-zhong Peng, Chang-An Yuan, Xiao Qin, Jiangtao Huang, Yabing Shi
2014 J jnl
J. Comput.
Yu-zhong Peng, Jie Li, Chang-An Yuan, Baoqin Hu
2010 C conf
CIS
Hong-guo Cai, Chang-An Yuan, Jin-Guang Luo, Jin-de Huang
2009 conf
WGEC
Chao Ding, Chang-An Yuan, Xiao Qin, Yu-zhong Peng
2009 conf
ICNC (3)
Yuan Rao, Ruchuan Wang, Chang-An Yuan
2008 conf
CSSE (1)
Yu-zhong Peng, Chang-An Yuan, Yan Wang, Xiao Qin
2005 conf
WAIM
Jianjun Hu, Changjie Tang, Jing Peng, Chuan Li, Chang-An Yuan, An-long Chen
2005 conf
ICNC (3)
Jing Peng, Changjie Tang, Jing Zhang, Chang-An Yuan
2005 conf
ASIAN
An-long Chen, Changjie Tang, Chang-An Yuan, Jing Peng, Jianjun Hu
2004 conf
WAIM
Jie Zuo, Changjie Tang, Chuan Li, Chang-An Yuan, An-long Chen
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