Hai (Helen) Li

62 papers A* 11A 4B 2C 4Misc 1Journal 25Unranked 11
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Zishan Shao, Yixiao Wang, Qinsi Wang, Ting Jiang, Zhixu Du, Hancheng Ye, Danyang Zhuo, Yiran Chen, Hai (Helen) Li
2026 J jnl
CoRR
Yiming Li, Yuhan Cheng, Mingchen Ma, Yihang Zou, Ningyuan Yang, Wei Cheng, Hai (Helen) Li, Yiran Chen, Tingjun Chen
2025 conf
NeuS
Tergel Molom-Ochir, Naman Saxena, JiWoo Kim, Yiran Chen, Zhangyang (Atlas) Wang, Miroslav Pajic, Hai (Helen) Li
2025 J jnl
CoRR
Chiyue Wei, Cong Guo, Junyao Zhang, Haoxuan Shan, Yifan Xu, Ziyue Zhang, Yudong Liu, Qinsi Wang, Changchun Zhou, Hai (Helen) Li, Yiran Chen
2025 C conf
ISCAS
Tergel Molom-Ochir, Brady Taylor, Hai (Helen) Li, Yiran Chen
2024 J jnl
AI Mag.
Yiran Chen, Suman Banerjee, Shaundra Daily, Jeffery Krolik, Hai (Helen) Li, Daniel B. Limbrick, Miroslav Pajic, Rajashi Runton, Lin Zhong
2024 J jnl
CoRR
Minxue Tang, Yitu Wang, Jingyang Zhang, Louis DiValentin, Aolin Ding, Amin Hass, Yiran Chen, Hai (Helen) Li
2024 C conf
ISCAS
Qilin Zheng, Shiyu Li, Yitu Wang, Ziru Li, Yiran Chen, Hai (Helen) Li
2024 A* conf
USENIX Security Symposium
Minxue Tang, Anna Dai, Louis DiValentin, Aolin Ding, Amin Hass, Neil Zhenqiang Gong, Yiran Chen, Hai (Helen) Li
2023 conf
ASPLOS (3)
Edward Hanson, Mark Horton, Hai (Helen) Li, Yiran Chen
2023 J jnl
CoRR
Yitu Wang, Shiyu Li, Qilin Zheng, Linghao Song, Zongwang Li, Andrew Chang, Hai (Helen) Li, Yiran Chen
2023 J jnl
IEEE Trans. Emerg. Top. Comput.
Biresh Kumar Joardar, Janardhan Rao Doppa, Hai (Helen) Li, Krishnendu Chakrabarty, Partha Pratim Pande
2023 J jnl
CoRR
Zhixu Du, Shiyu Li, Yuhao Wu, Xiangyu Jiang, Jingwei Sun, Qilin Zheng, Yongkai Wu, Ang Li, Hai (Helen) Li, Yiran Chen
2022 J jnl
ACM Trans. Embed. Comput. Syst.
Muhammad Shafique, Theocharis Theocharides, Hai (Helen) Li, Chun Jason Xue
2022 J jnl
CoRR
Zhixu Du, Jingwei Sun, Ang Li, Pin-Yu Chen, Jianyi Zhang, Hai (Helen) Li, Yiran Chen
2021 J jnl
ACM J. Emerg. Technol. Comput. Syst.
Qing Yang, Jiachen Mao, Zuoguan Wang, Hai (Helen) Li
2021 A* conf
MICRO
Shiyu Li, Edward Hanson, Xuehai Qian, Hai (Helen) Li, Yiran Chen
2020 J jnl
ACM J. Emerg. Technol. Comput. Syst.
Bing Li, Janardhan Rao Doppa, Partha Pratim Pande, Krishnendu Chakrabarty, Joe X. Qiu, Hai (Helen) Li
2020 ed.
MLCAD
Ulf Schlichtmann, Raviv Gal, Hussam Amrouch, Hai (Helen) Li
2020 conf
ACM Great Lakes Symposium on VLSI
Grace Li Zhang, Bing Li, Ying Zhu, Shuhang Zhang, Tianchen Wang, Yiyu Shi, Tsung-Yi Ho, Hai (Helen) Li, Ulf Schlichtmann
2019 conf
ASP-DAC
Bing Li, Bonan Yan, Chenchen Liu, Hai (Helen) Li
2019 ch.
Handbook of Memristor Networks
Amr Mahmoud Hassan, Chenchen Liu, Chaofei Yang, Hai (Helen) Li, Yiran Chen
2019 conf
ACM Great Lakes Symposium on VLSI
Fan Chen, Linghao Song, Hai (Helen) Li
2019 A* conf
CVPR
Nathan Inkawhich, Wei Wen, Hai (Helen) Li, Yiran Chen
2019 Misc conf
CODES+ISSS
Paul Bogdan, Fan Chen, Aryan Deshwal, Janardhan Rao Doppa, Biresh Kumar Joardar, Hai (Helen) Li, Shahin Nazarian, Linghao Song, Yao Xiao
2019 J jnl
ACM J. Emerg. Technol. Comput. Syst.
Bing Li, Mengjie Mao, Xiaoxiao Liu, Tao Liu, Zihao Liu, Wujie Wen, Yiran Chen, Hai (Helen) Li
2018 A* conf
DAC
Bonan Yan, Xiong Cao, Hai (Helen) Li
2018 J jnl
Integr.
Yiran Chen, Hai (Helen) Li, Chunpeng Wu, Chang Song, Sicheng Li, Chuhan Min, Hsin-Pai Cheng, Wei Wen, Xiaoxiao Liu
2018 A conf
ICCAD
Kent W. Nixon, Jiachen Mao, Juncheng Shen, Huanrui Yang, Hai (Helen) Li, Yiran Chen
2017 conf
NANOCOM
Chenchen Liu, Fuqiang Liu, Hai (Helen) Li
2017 J jnl
CoRR
Yandan Wang, Wei Wen, Linghao Song, Hai (Helen) Li
2017 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Krishnendu Chakrabarty, Massimo Alioto, Bevan M. Baas, Chirn Chye Boon, Meng-Fan Chang, Naehyuck Chang, Yao-Wen Chang, Chip-Hong Chang, Shih-Chieh Chang, Poki Chen, Masud H. Chowdhury, Pasquale Corsonello, Ibrahim Abe M. Elfadel, Said Hamdioui, Masanori Hashimoto, Tsung-Yi Ho, Houman Homayoun, Yuh-Shyan Hwang, Rajiv V. Joshi, Tanay Karnik, Mehran Mozaffari Kermani, Chulwoo Kim, Tae-Hyoung Kim, Jaydeep P. Kulkarni, Eren Kursun, Erik Larsson, Hai (Helen) Li, Huawei Li, Patrick P. Mercier, Prabhat Mishra, Makoto Nagata, Arun S. Natarajan, Koji Nii, Partha Pratim Pande, Ioannis Savidis, Mingoo Seok, Sheldon X.-D. Tan, Mark Tehranipoor, Aida Todri-Sanial, Miroslav N. Velev, Xiaoqing Wen, Jiang Xu, Wei Zhang, Zhengya Zhang, Stacey Weber Jackson
2017 J jnl
Integr.
Enes Eken, Ismail Bayram, Yaojun Zhang, Bonan Yan, Wenqing Wu, Hai (Helen) Li, Yiran Chen
2017 A* conf
DAC
Yandan Wang, Wei Wen, Beiye Liu, Donald M. Chiarulli, Hai (Helen) Li
2017 J jnl
IEEE Consumer Electron. Mag.
Hai (Helen) Li, Yiran Chen, Chenchen Liu, John Paul Strachan, Noraica Davila
2017 A* conf
DAC
Chenchen Liu, Miao Hu, John Paul Strachan, Hai (Helen) Li
2016 J jnl
J. Signal Process. Syst.
Qinru Qiu, Zhe Li, Khadeer Ahmed, Wei Liu, Syed Faisal Habib, Hai (Helen) Li, Miao Hu
2016 C conf
ISCAS
Bonan Yan, Amr Mahmoud Mahmoud, Jianhua Joshua Yang, Qing Wu, Yiran Chen, Hai (Helen) Li
2016 J jnl
IET Cyper-Phys. Syst.: Theory & Appl.
Chunpeng Wu, Hsin-Pai Cheng, Sicheng Li, Hai (Helen) Li, Yiran Chen
2016 J jnl
IEEE Trans. Computers
Zhenyu Sun, Xiuyuan Bi, Wenqing Wu, Sungjoo Yoo, Hai (Helen) Li
2016 A conf
ISLPED
Zheng Li, Xiuyuan Bi, Hai (Helen) Li, Yiran Chen, Jianying Qin, Peng Guo, Wenjie Kong, Wenshan Zhan, Xiufeng Han, Hong Zhang, Lingling Wang, Guanping Wu, Hanming Wu
2016 J jnl
IEEE Trans. Multi Scale Comput. Syst.
Hai (Helen) Li, Qinru Qiu, Yu Wang
2016 C conf
ISCAS
Sicheng Li, Xiaoxiao Liu, Mengjie Mao, Hai (Helen) Li, Yiran Chen, Boxun Li, Yu Wang
2016 J jnl
ACM Trans. Design Autom. Electr. Syst.
Fubing Mao, Yi-Chung Chen, Wei Zhang, Hai (Helen) Li, Bingsheng He
2016 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Jianlei Yang, Peiyuan Wang, Yaojun Zhang, Yuanqing Cheng, Weisheng Zhao, Yiran Chen, Hai (Helen) Li
2016 conf
SLIP
Enes Eken, Ismail Bayram, Yaojun Zhang, Bonan Yan, Wenqing Wu, Hai (Helen) Li, Yiran Chen
2015 ed.
ACM Great Lakes Symposium on VLSI
Alex K. Jones, Hai (Helen) Li, Ayse K. Coskun, Martin Margala
2015 conf
CISDA
Hai (Helen) Li, Chenchen Liu, Bonan Yan, Chaofei Yang, Linghao Song, Zheng Li, Yiran Chen, Weijie Zhu, Qing Wu, Hao Jiang
2015 conf
SoCC
Hai (Helen) Li, Xiuyuan Bi, Zhenyu Sun
2014 A* conf
DAC
Mengjie Mao, Wujie Wen, Yaojun Zhang, Yiran Chen, Hai (Helen) Li
2014 ed.
ACM Great Lakes Symposium on VLSI
Joseph R. Cavallaro, Tong Zhang, Alex K. Jones, Hai (Helen) Li
2014 A conf
DATE
Boxun Li, Yu Wang, Yiran Chen, Hai (Helen) Li, Huazhong Yang
2014 conf
SiPS
Qinru Qiu, Zhe Li, Khadeer Ahmed, Hai (Helen) Li, Miao Hu
2013 B conf
FPL
Yi-Chung Chen, Wei Zhang, Hai (Helen) Li
2013 A conf
ISLPED
Jianxing Wang, Yenni Tim, Weng-Fai Wong, Hai (Helen) Li
2013 conf
ACM Great Lakes Symposium on VLSI
Mengjie Mao, Hai (Helen) Li, Alex K. Jones, Yiran Chen
2013 A* conf
DAC
Zhenyu Sun, Wenqing Wu, Hai (Helen) Li
2013 B conf
IJCNN
Feng Ji, Hai (Helen) Li, Bryant T. Wysocki, Clare Thiem, Nathan R. McDonald
2012 A* conf
DAC
Robinson E. Pino, Hai (Helen) Li, Yiran Chen, Miao Hu, Beiye Liu
2011 A* conf
MICRO
Zhenyu Sun, Xiuyuan Bi, Hai (Helen) Li, Weng-Fai Wong, Zhong-Liang Ong, Xiaochun Zhu, Wenqing Wu
2011 J jnl
J. Low Power Electron.
Miao Hu, Hai (Helen) Li, Yiran Chen, Xiaobin Wang
2011 J jnl
IET Comput. Digit. Tech.
Xiangyu Dong, Xiaoxia Wu, Yuan Xie, Yiran Chen, Hai (Helen) Li
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