Kaijie Wu

43 papers A* 2B 3C 2Misc 2Journal 16Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Process. Manag.
Xiaofeng Zhang, Yuanchao Zhu, Chaochen Gu, Jiawei Cao, Hao Cheng, Kaijie Wu
2025 A* conf
ICML
Jiawei Cao, Chaochen Gu, Hao Cheng, Xiaofeng Zhang, Kaijie Wu, Changsheng Lu
2025 conf
MICCAI (15)
Dingrui Ma, Jiawei Cao, Hao Cheng, Dan Zhou, Jianping Liu, Xiaofeng Zhang, Kaijie Wu, Chaochen Gu, Xinping Guan
2025 A* conf
EMNLP
Xiaofeng Zhang, Yihao Quan, Chen Shen, Chaochen Gu, Xiaosong Yuan, Shaotian Yan, Jiawei Cao, Hao Cheng, Kaijie Wu, Jieping Ye
2024 J jnl
Biomed. Signal Process. Control.
Ling Chang, Kaijie Wu, Chaocheng Gu, Cailian Chen
2024 J jnl
Medical Biol. Eng. Comput.
Ling Chang, Kaijie Wu, Hao Cheng, Chaocheng Gu, Yudi Zhao, Cailian Chen
2024 J jnl
Sensors
Hao Cheng, Kaijie Wu, Chaochen Gu, Dingrui Ma
2024 J jnl
CoRR
Xiaofeng Zhang, Yihao Quan, Chaochen Gu, Chen Shen, Xiaosong Yuan, Shaotian Yan, Hao Cheng, Kaijie Wu, Jieping Ye
2024 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Xiaofeng Zhang, Chaochen Gu, Zishan Xu, Hao Tang, Hao Cheng, Kaijie Wu, Shanying Zhu
2023 B conf
IJCNN
Song Gong, Kaijie Wu, Zhiying Xia, Lihua Ran, Chaochen Gu, Changsheng Lu, Tongkun Guan, Yudi Zhao
2023 conf
RCAR
Feili Wei, Chaochen Gu, Kaijie Wu, Hao Cheng
2023 J jnl
Int. J. Robotics Autom.
Chaochen Gu, Qi Feng, Changsheng Lu, Changjian Gu, Xunjin Wu, Kaijie Wu
2022 conf
ICONIP (6)
Jiawei Cao, Changsheng Lu, Kaijie Wu, Chaochen Gu
2022 J jnl
Medical Biol. Eng. Comput.
Hao Cheng, Kaijie Wu, Jie Tian, Kai Ma, Chaocheng Gu, Xinping Guan
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Tongkun Guan, Chaochen Gu, Changsheng Lu, Jingzheng Tu, Qi Feng, Kaijie Wu, Xinping Guan
2021 conf
ICAIP
Ling Chang, Kaijie Wu, Chaochen Gu, Cailian Chen
2021 conf
ICCAIS
Xunjin Wu, Changsheng Lu, Chaochen Gu, Kaijie Wu, Shanying Zhu
2021 J jnl
CoRR
Tongkun Guan, Chaochen Gu, Changsheng Lu, Jingzheng Tu, Qi Feng, Kaijie Wu, Xinping Guan
2021 J jnl
Pattern Recognit.
Baoqing Yang, Xin-Ping Guan, Junwu Zhu, Chaochen Gu, Kaijie Wu, Jiajie Xu
2020 conf
ICCCV
Rui Xu, Chaochen Gu, Zhenghua He, Kaijie Wu
2020 conf
ICONIP (2)
Zhenghua He, Chaochen Gu, Rui Xu, Kaijie Wu
2020 J jnl
Neurocomputing
Changsheng Lu, Chaochen Gu, Kaijie Wu, Siyu Xia, Haotian Wang, Xinping Guan
2020 B conf
IJCNN
Hao Cheng, Kaijie Wu, Kai Ma, Jie Tian, Rui Xu, Chaochen Gu, Xinping Guan
2020 C conf
INDIN
Yunzhu Yu, Kaijie Wu, Qimin Xu, Xiang Chen, Cailian Chen
2019 J jnl
Int. J. Robotics Autom.
Changjian Gu, Chaochen Gu, Kaijie Wu, Liang-Jun Zhang, Xinping Guan
2019 conf
CISP-BMEI
Wei Ding, Ling Chang, Chaochen Gu, Kaijie Wu
2019 conf
ICONIP (4)
Jie Tian, Kaijie Wu, Kai Ma, Hao Cheng, Chaocheng Gu
2019 B conf
IJCNN
Shuxin Zhao, Chaochen Gu, Changsheng Lu, Ye Huang, Kaijie Wu, Xinping Guan
2018 J jnl
J. Sensors
Chaochen Gu, Hao Cheng, Kaijie Wu, Liang-Jun Zhang, Xin-Ping Guan
2018 conf
ICONIP (6)
Kai Ma, Kaijie Wu, Hao Cheng, Chaochen Gu, Rui Xu, Xinping Guan
2018 conf
SCDS
Qiuju Yang, Kaijie Wu, Hao Cheng, Chaochen Gu, Yuan Liu, Shawn Patrick Casey, Xinping Guan
2018 conf
PRCV (4)
Ye Huang, Chaochen Gu, Kaijie Wu, Xinping Guan
2018 conf
ICONIP (3)
Ye Huang, Chaochen Gu, Kaijie Wu, Xinping Guan
2018 C conf
ACC
Shuxin Zhao, Kaijie Wu, Chaochen Gu, Xiaoping P. Pu, Xinping Guan
2018 conf
ICONIP (1)
Changsheng Lu, Haotian Wang, Chaochen Gu, Kaijie Wu, Xinping Guan
2017 Misc conf
ICMLC
Du Wang, Chaochen Gu, Kaijie Wu, Xinping Guan
2017 conf
CASE
Liang-Jun Zhang, Chaochen Gu, Kaijie Wu, Ye Huang, Xin-Ping Guan
2017 conf
ASCC
Liang-Jun Zhang, Changjian Gu, Chaochen Gu, Kaijie Wu, Xinping Guan
2017 J jnl
Multim. Tools Appl.
Baoqing Yang, Chaochen Gu, Kaijie Wu, Tao Zhang, Xin-Ping Guan
2016 J jnl
Multim. Tools Appl.
Baoqing Yang, Tao Zhang, Chaochen Gu, Kaijie Wu, Xin-Ping Guan
2016 Misc conf
ICMLC
Baoqing Yang, Chaochen Gu, Kaijie Wu, Xin-Ping Guan
2015 conf
WCSP
Yafei Huang, Chaochen Gu, Kaijie Wu, Cailian Chen, Xin-Ping Guan
2014 conf
BMEI
Lei Zhao, Kaijie Wu, Xinyu Chai, Chaochen Gu
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