Wei Peng

74 papers Journal 50Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Medical Imaging
Rui Yang, Lijun Liu, Xupeng Feng, Wei Peng, Xiaobing Yang
2026 ed.
ISBRA (1)
Jing Tang, Xin Lai, Zhipeng Cai, Wei Peng, Yanjie Wei
2026 ed.
ISBRA (2)
Jing Tang, Xin Lai, Zhipeng Cai, Wei Peng, Yanjie Wei
2026 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Wei Yin, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2026 J jnl
Biomed. Signal Process. Control.
Bing Liu, Lijun Liu, Xiaobing Yang, Wei Peng, Li Liu
2025 conf
ISBRA (2)
Xinyue Xu, Wei Peng, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu
2025 J jnl
Big Data Min. Anal.
Wei Lan, Wenyi Chen, Chunling Li, Qingfeng Chen, Wei Peng, Yi-Ping Phoebe Chen, Xiaoshu Zhu
2025 J jnl
Neural Networks
Wei Peng, Yanhan Ma, Chunshan Li, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Jin Liu
2025 J jnl
IEEE Trans. Comput. Biol. Bioinform.
Wei Peng, Zhipeng Cai, Alexander Zelikovsky
2025 J jnl
IEEE J. Biomed. Health Informatics
Wei Peng, Jiangzhen Lin, Wei Dai, Ning Yu, Jianxin Wang
2025 J jnl
IET Image Process.
Lanqing Ye, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2025 J jnl
Comput. Secur.
Yunfei Li, Xiaodong Fu, Li Liu, Jiaman Ding, Wei Peng, Lianyin Jia
2025 J jnl
IEEE Trans. Comput. Biol. Bioinform.
Wei Peng, Xinyue Xu, Jiangzhen Lin, Gong Chen, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2025 J jnl
IEEE J. Biomed. Health Informatics
Wei Peng, Chuyue Chen, Wei Dai, Ning Yu, Jianxin Wang
2025 J jnl
IEEE J. Biomed. Health Informatics
Wei Lan, Zhentao Tang, Mingyang Liu, Qingfeng Chen, Wei Peng, Yi-Ping Phoebe Chen, Yi Pan
2025 conf
BIBM
Ling Lin, Wei Peng, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2025 J jnl
Vis. Informatics
Li Liu, Jing Duan, Xiaodong Fu, Wei Peng, Lijun Liu
2025 J jnl
IEEE Trans. Comput. Biol. Bioinform.
Zhipeng Hu, Gaoshi Li, Xinlong Luo, Jiafei Liu, Jingli Wu, Wei Peng, Xiaoshu Zhu
2024 ed.
ISBRA (1)
Wei Peng, Zhipeng Cai, Pavel Skums
2024 ed.
ISBRA (2)
Wei Peng, Zhipeng Cai, Pavel Skums
2024 ed.
ISBRA (3)
Wei Peng, Zhipeng Cai, Pavel Skums
2024 conf
ISBRA (2)
Wei Peng, Zhengnan Zhou, Wei Dai, Xinping Xu, Xiaodong Fu, Li Liu, Lijun Liu
2024 conf
ISBRA (2)
Wei Peng, Jiangzhen Lin, Wei Dai, Gong Chen, Xiaodong Fu, Li Liu, Lijun Liu
2024 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Zhipeng Hu, Gaoshi Li, Xinlong Luo, Wei Peng, Jiafei Liu, Xiaoshu Zhu, Jingli Wu
2024 J jnl
Health Inf. Sci. Syst.
Gaoshi Li, Zhipeng Hu, Xinlong Luo, Jiafei Liu, Jingli Wu, Wei Peng, Xiaoshu Zhu
2024 J jnl
Briefings Bioinform.
Wei Peng, Zhichen He, Wei Dai, Wei Lan
2024 J jnl
IEEE Trans. Netw. Sci. Eng.
Wei Peng, Zhengnan Zhou, Wei Dai, Ning Yu, Jianxin Wang
2024 conf
ISBRA (3)
Wei Peng, Chuyue Chen, Wei Dai
2024 conf
BIBM
Wei Peng, Zhihao Ping, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2024 J jnl
Health Inf. Sci. Syst.
Fangxu Chen, Wei Peng, Wei Dai, Shoulin Wei, Xiaodong Fu, Li Liu, Lijun Liu
2024 J jnl
Big Data Min. Anal.
Wei Lan, Guohang He, Mingyang Liu, Qingfeng Chen, Junyue Cao, Wei Peng
2024 J jnl
CoRR
Wei Lan, Guohang He, Mingyang Liu, Qingfeng Chen, Junyue Cao, Wei Peng
2023 conf
BIBM
Wei Peng, Zhihao Zhang, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2023 J jnl
Mach. Vis. Appl.
Yong Wei, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2023 J jnl
Health Inf. Sci. Syst.
Gaoshi Li, Xinlong Luo, Zhipeng Hu, Jingli Wu, Wei Peng, Jiafei Liu, Xiaoshu Zhu
2023 conf
BIBM
Zhipeng Hu, Gaoshi Li, Jingli Wu, Xinlong Luo, Jiafei Liu, Wei Peng, Xiaoshu Zhu
2023 J jnl
Comput. Graph. Forum
Juncheng Pu, Li Liu, Xiaodong Fu, Zhuo Su, Lijun Liu, Wei Peng
2023 J jnl
BMC Bioinform.
Wei Peng, Rong Wu, Wei Dai, Ning Yu
2023 J jnl
Comput. Biol. Medicine
Wei Peng, Tielin Chen, Hancheng Liu, Wei Dai, Ning Yu, Wei Lan
2023 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Wei Peng, Ming Liu, Wei Dai, Tielin Chen, Yu Fu, Yi Pan
2023 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Wei Peng, Zicheng Che, Wei Dai, Shoulin Wei, Wei Lan
2023 J jnl
Comput. Biol. Medicine
Kaiqi Wang, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2022 conf
BlockSys
Xinxin Qi, Xiaodong Fu, Fei Dai, Li Liu, Lijun Liu, Jiaman Ding, Wei Peng
2022 J jnl
Neurocomputing
Wei Lan, Ximin Wu, Qingfeng Chen, Wei Peng, Jianxin Wang, Yi-Ping Phoebe Chen
2022 conf
BIBM
Wei Peng, Piaofang Yu, Wei Dai, Xiaodong Fu, Li Liu, Yi Pan
2022 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Junrong Song, Wei Peng, Feng Wang
2022 J jnl
Briefings Bioinform.
Wei Peng, Qi Tang, Wei Dai, Tielin Chen
2022 J jnl
IEEE J. Biomed. Health Informatics
Wei Peng, Tielin Chen, Wei Dai
2022 J jnl
Bioinform.
Wei Peng, Hancheng Liu, Wei Dai, Ning Yu, Jianxin Wang
2021 conf
ISBRA
Zicheng Che, Wei Peng, Wei Dai, Shoulin Wei, Wei Lan
2021 J jnl
J. Comput. Biol.
Wei Dai, Bingxi Chen, Wei Peng, Xia Li, Jiancheng Zhong, Jianxin Wang
2021 J jnl
BMC Bioinform.
Jiancheng Zhong, Chao Tang, Wei Peng, Minzhu Xie, Yusui Sun, Qiang Tang, Qiu Xiao, Jiahong Yang
2021 J jnl
Complex.
Wei Lan, Mingrui Zhu, Qingfeng Chen, Jianwei Chen, Jin Ye, Jin Liu, Wei Peng, Shirui Pan
2021 J jnl
Briefings Bioinform.
Jiancheng Zhong, Yusui Sun, Minzhu Xie, Wei Peng, Chushu Zhang, Fang-Xiang Wu, Jianxin Wang
2020 conf
BIBM
Ming Liu, Wei Dai, Wei Peng, Yu Fu, Yi Pan
2020 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Junrong Song, Wei Peng, Feng Wang
2020 J jnl
Comput. Biol. Chem.
Ximin Wu, Wei Lan, Qingfeng Chen, Yi Dong, Jin Liu, Wei Peng
2020 J jnl
Int. J. Data Min. Bioinform.
Wei Peng, Jielin Du, Lun Li, Wei Dai, Wei Lan
2019 J jnl
BMC Bioinform.
Junrong Song, Wei Peng, Feng Wang
2019 conf
ISBRA
Wei Dai, Qi Chang, Wei Peng, Jiancheng Zhong, Yongjiang Li
2019 conf
ISBRA
Wei Dai, Xia Li, Wei Peng, Jurong Song, Jiancheng Zhong, Jianxin Wang
2019 conf
BIBM
Wei Peng, Lun Li, Wei Dai, Jielin Du, Wei Lan
2017 J jnl
Int. J. Data Min. Bioinform.
Xiwei Tang, Wei Peng, Minzhu Xie
2017 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Wei Peng, Min Li, Lu Chen, Lusheng Wang
2017 J jnl
Briefings Bioinform.
Xiaoqing Peng, Jianxin Wang, Wei Peng, Fang-Xiang Wu, Yi Pan
2016 conf
ISBRA
Wei Peng, Wei Lan, Zeng Yu, Jianxin Wang, Yi Pan
2016 conf
BIBM
Wei Peng, Wei Lan, Jianxin Wang, Yi Pan
2015 J jnl
Algorithms Mol. Biol.
Wei Peng, Jianxin Wang, Fang-Xiang Wu, Yi Pan
2015 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Wei Peng, Jianxin Wang, Bihai Zhao, Lusheng Wang
2015 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Wei Peng, Jianxin Wang, Yingjiao Cheng, Yu Lu, Fang-Xiang Wu, Yi Pan
2014 J jnl
BMC Syst. Biol.
Wei Peng, Jianxin Wang, Juan Cai, Lu Chen, Min Li, Fang-Xiang Wu
2013 conf
BIBM
Wei Peng, Jianxin Wang, Fang-Xiang Wu
2013 conf
BIBM
Jianxin Wang, Wei Peng, Yingjiao Chen, Yu Lu, Yi Pan
2012 J jnl
BMC Syst. Biol.
Wei Peng, Jianxin Wang, Weiping Wang, Qing Liu, Fang-Xiang Wu, Yi Pan
redb/extractors/pe_extractors/pe_extra_findings.py
← Index redb/extractors/pe_extractors/pe_extra_findings.py python
from hashlib import md5, sha1, sha256
import inspect
import pefile
from magika import Magika
import json
from datetime import datetime, timezone
from typing import List, Optional, Any
from asn1crypto import cms, pem, x509, core
from dataclasses import asdict

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


class PEExtraFindings(PEExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.elastic_index = self.index_prefix + "-pe_extrafindings"
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.has_binary_overlay = False
        self.has_binary_resource = False
        self.findings = []

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

    """
    The section below triggers in case of a binary which is not signed.
    It trigger the scan for Certificates inside the binary, for example
    inside a resource or an overlay.
    """

    def _scan_for_certificates(self):
        """
        Comprehensive scan for certificate data in PE file.
        Returns list of tuples (location_description, certificate_data)
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # 1. Scan resources for embedded PE files
        self._scan_resources_for_certificates()

        # 3. Scan overlay
        overlay_data = self.pe.get_overlay()
        if overlay_data:
            self._scan_overlay_for_certificates(overlay_data)


    def _extract_certificate_info(self, 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(
            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_algorithm=None,
        )

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

        addr_8 = address + 8
        signature_data = bytes(
            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"]

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

        return certificates_list

    def _is_signed(self, pedata):
        address = pedata.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        if address == 0:
            return False
        return True

    def _scan_resources_for_certificates(self):
        """Scan resources for embedded PE files and their certificates"""
        self.log.debug(inspect.currentframe().f_code.co_name)

        try:
            if hasattr(self.pe, "DIRECTORY_ENTRY_RESOURCE"):
                for entry in self.pe.DIRECTORY_ENTRY_RESOURCE.entries:
                    for resource in self._get_resource_data(entry):
                        # Check if resource data might be a PE file
                        resource_magika = Magika().identify_bytes(resource).output.label
                        if resource.startswith(b"MZ") or resource_magika == "pebin":
                            try:
                                embedded_pe = pefile.PE(data=resource)
                                if self._is_signed(embedded_pe):
                                    cert_data = self._extract_standard_certificates(
                                        embedded_pe
                                    )
                                    if cert_data:
                                        # certificates.append(
                                        #     (f"Resource_{entry.id}", cert_data)
                                        # )
                                        self.findings.append(
                                            PEExtraFinding(
                                                context=f"Resource ({sha256(resource).hexdigest()}) is a PE file. Found Code Signing Certificates information inside.",
                                                finding=cert_data,
                                            )
                                        )
                            except Exception as e:
                                self.log.warning(
                                    f"Resource {sha256(resource).hexdigest()} is not a valid PE: {e}"
                                )

                        # Direct certificate pattern matching in resource
                        cert_data = self._find_certificate_patterns(resource)
                        if cert_data:
                            # certificates.append((f"Resource_{entry.id}", cert_data))
                            self.findings.append(
                                PEExtraFinding(
                                    context=f"Resource ({sha256(resource).hexdigest()}) is a PE file.\
                                    Found Code Signing Certificates information inside.",
                                    finding=cert_data,
                                )
                            )

        except Exception as e:
            self.log.error(f"Failed to scan resources: {e}")


    def _scan_overlay_for_certificates(self, overlay_data) -> List[bytes]:
        """Scan PE overlay for certificate data"""
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Check if overlay is a PE file
            overlay_magika = Magika().identify_bytes(overlay_data).output.ct_label
            if overlay_data.startswith(b"MZ") or overlay_magika == "pebin":
                try:
                    overlay_pe = pefile.PE(data=overlay_data)
                    if self._is_signed(overlay_pe):
                        cert_data = self._extract_standard_certificates(overlay_data)
                        if cert_data:
                            self.findings.append(
                                PEExtraFinding(
                                    context=f"Overlay data ({sha256(overlay_data).hexdigest()}) is a PE file.\
                                    Found Code Signing Certificates information inside.",
                                    finding=cert_data,
                                )
                            )
                except Exception as e:
                    self.log.warning(f"Error looking for certificates in Overlay: {e}")
                    pass

            # Direct certificate pattern matching in overlay
            cert_data = self._find_certificate_patterns(overlay_data)
            if cert_data:
                self.findings.append(
                    PEExtraFinding(
                        context=f"Overlay data ({sha256(overlay_data).hexdigest()}) is a PE file.\
                        Found Code Signing Certificates information inside.",
                        finding=cert_data,
                    )
                )
        except Exception as e:
            self.log.error(f"Failed to scan overlay: {e}")


    def _get_resource_data(self, entry) -> List[bytes]:
        """Recursively get resource data"""
        resources = []
        try:
            if hasattr(entry, "directory"):
                for subentry in entry.directory.entries:
                    resources.extend(self._get_resource_data(subentry))
            else:
                data = self.pe.get_data(
                    entry.data.struct.OffsetToData, entry.data.struct.Size
                )
                resources.append(data)
        except Exception as e:
            self.log.error(f"Failed to get resource data: {e}")
        return resources

    def _find_certificate_patterns(self, data: bytes) -> Optional[bytes]:
        """Find certificate patterns in binary data"""
        # PKCS#7 SignedData OID pattern
        PKCS7_PATTERN = b"\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x07\x02"

        try:
            idx = data.find(PKCS7_PATTERN)
            if idx != -1:
                # Search backwards for ASN.1 sequence marker
                for i in range(idx, max(0, idx - 50), -1):
                    if data[i] == 0x30:  # ASN.1 SEQUENCE
                        try:
                            # Try to parse as X.509 certificate
                            cert = x509.load_der_x509_certificate(
                                data[i:], default_backend()
                            )
                            return data[i:]
                        except Exception:
                            continue
        except Exception as e:
            self.log.error(f"Failed to find certificate patterns: {e}")
        return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)
        if exporter_type == "ElasticsearchExporter":
            return self.findings
        elif exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)
            
            data = [
                [
                    self.sha256,
                    self.md5,
                    self.sha1,
                    finding.context,
                    [asdict(cert) for cert in finding.finding] if finding.finding else None,
                    current_time
                ]
                for finding in self.findings
            ]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'context', 'finding', 'analysis_date'
            ]
            
            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'String', 'Array(JSON)', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_extra_findings"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            self._scan_for_certificates()
            if len(self.findings) > 0:
                return self.findings
            return None
        except Exception as e:
            self.log.error(f"Error extracting PE Extras: {e}")
            return None