Hailin Li

96 papers A* 1B 5C 3Misc 1Journal 74Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Process. Manag.
Hailin Li, Hufeng Li, Wenkai Shi, Yenchun Jim Wu
2026 J jnl
CoRR
Jiayin Sun, Caixia Sun, Boyu Yang, Hailin Li, Xiao Chen, Yi Zhang, Errui Ding, Liang Li, Chao Deng, Junlan Feng
2026 J jnl
Inf. Sci.
Hailin Li, Jie Wang
2025 J jnl
Kybernetes
Wenhao Zhou, Hailin Li, Hufeng Li, Liping Zhang, Weibin Lin
2025 J jnl
IEEE J. Biomed. Health Informatics
Hailin Li, Di Dong, Mengjie Fang, Bingxi He, Shengyuan Liu, Chaoen Hu, Zaiyi Liu, Hexiang Wang, Linglong Tang, Jie Tian
2025 J jnl
Entropy
Liping Zhang, Hailin Li, Wenhao Zhou, Hanhui Qiu, Yenchun Jim Wu
2025 J jnl
Inf. Syst. Frontiers
Ye Liang, Yalong Cao, Chonghui Guo, Hailin Li
2025 J jnl
J. Data Inf. Sci.
Zhiwei Zhang, Wenhao Zhou, Hailin Li
2025 J jnl
Ind. Manag. Data Syst.
Hailin Li, Huimin Tian, Hongqin Tang
2025 J jnl
Syst.
Liping Zhang, Hanhui Qiu, Jinyi Chen, Hailin Li, Xiaoji Wan
2025 J jnl
CoRR
Shenglin Zhang, Ziang Chen, Zijing Que, Yilun Liu, Yongqian Sun, Sicheng Wei, Dan Pei, Hailin Li
2025 B conf
IJCB
Hailin Li, Raghavendra Ramachandra, Narayan Vetrekar, Rajendra S. Gad
2025 J jnl
Enterp. Inf. Syst.
Hailin Li, Huimin Tian, Wenhao Zhou, Yenchun Jim Wu
2025 B conf
FG
Ria Shekhawat, Hailin Li, Raghavendra Ramachandra, Sushma Venkatesh
2025 J jnl
CoRR
Ria Shekhawat, Hailin Li, Raghavendra Ramachandra, Sushma Venkatesh
2024 J jnl
Technol. Anal. Strateg. Manag.
Wenhao Zhou, Hailin Li
2024 J jnl
Reliab. Eng. Syst. Saf.
Wenzhe Ding, Xiang Bai, Qingwei Wang, Fang Long, Hailin Li, Zhengrong Wu, Jian Liu, Huisheng Yao, Hong Yang
2024 J jnl
Health Inf. Sci. Syst.
Ye Liang, Chonghui Guo, Hailin Li
2024 conf
WACV (Workshops)
Hailin Li, Raghavendra Ramachandra
2024 conf
EMBC
Hailin Li, Mengjie Fang, Bingxi He, Di Dong, Jie Tian
2024 J jnl
IEEE Trans. Engineering Management
Hailin Li, Zhengwei Wang, Weibin Lin
2024 B conf
IJCB
Hailin Li, Raghavendra Ramachandra, Mohamed Ragab, Soumik Mondal, Yong Kiam Tan, Khin Mi Mi Aung
2024 J jnl
CoRR
Hailin Li, Raghavendra Ramachandra, Mohamed Ragab, Soumik Mondal, Yong Kiam Tan, Khin Mi Mi Aung
2023 J jnl
IEEE Access
Ke Wang, Hailin Li, Yuan Ding, Jing Tan, Xiao Dong
2023 J jnl
Neural Networks
Hailin Li, Siwen Wang, Bo Liu, Mengjie Fang, Runnan Cao, Bingxi He, Shengyuan Liu, Chaoen Hu, Di Dong, Ximing Wang, Hexiang Wang, Jie Tian
2023 J jnl
Soft Comput.
Wenhao Zhou, Bo Zeng, You Wu, Jianzhou Wang, Hailin Li, Zhiwei Zhang
2023 J jnl
Vis. Comput. Ind. Biomed. Art
Hailin Li, Weiyuan Huang, Siwen Wang, Priya S. Balasubramanian, Gang Wu, Mengjie Fang, Xuebin Xie, Jie Zhang, Di Dong, Jie Tian, Feng Chen
2023 J jnl
CoRR
Hailin Li, Raghavendra Ramachandra
2023 J jnl
CoRR
Hailin Li, Raghavendra Ramachandra
2023 J jnl
Grey Syst. Theory Appl.
Wenhao Zhou, Hailin Li, Liping Zhang, Huimin Tian, Meng Fu
2023 conf
WACV (Workshops)
Raghavendra Ramachandra, Hailin Li
2023 J jnl
Entropy
Liping Zhang, Hanhui Qiu, Jinyi Chen, Wenhao Zhou, Hailin Li
2023 J jnl
Remote. Sens.
Jie Geng, Bo Jiu, Kang Li, Yu Zhao, Hongwei Liu, Hailin Li
2023 J jnl
Expert Syst. Appl.
Hailin Li, Zechen Liu, Xiaoji Wan
2023 J jnl
Appl. Soft Comput.
Hailin Li, Manhua Chen
2023 J jnl
Expert Syst. Appl.
Hailin Li, Tian Du, Xiaoji Wan
2022 J jnl
Math. Comput. Simul.
Wenhao Zhou, Hailin Li, Zhiwei Zhang
2022 J jnl
IEEE Access
Yuanjin Tian, Jing Tan, Yanwei Zhang, Ke Wang, Xiao Dong, Hailin Li
2022 J jnl
J. Supercomput.
Xiaoji Wan, Hailin Li, Liping Zhang, Yenchun Jim Wu
2022 J jnl
CoRR
Raghavendra Ramachandra, Hailin Li
2022 J jnl
Entropy
Weibin Lin, Mengwen Jin, Feng Ou, Zhengwei Wang, Xiaoji Wan, Hailin Li
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Xinyou Lin, Kuncheng Zhou, Liping Mo, Hailin Li
2022 J jnl
Sensors
Bo Li, Binfeng Yang, Fenghua Xiang, Jiaojiao Guo, Hailin Li
2022 J jnl
Comput. Biol. Medicine
Lixin Gong, Min Xu, Mengjie Fang, Bingxi He, Hailin Li, Xiangming Fang, Di Dong, Jie Tian
2022 J jnl
Expert Syst. Appl.
Hailin Li, Ruiying Jia, Xiaoji Wan
2022 J jnl
Adv. Eng. Informatics
Hailin Li, Xianli Wu, Xiaoji Wan, Weibin Lin
2021 J jnl
IEEE J. Biomed. Health Informatics
Siwen Wang, Di Dong, Liang Li, Hailin Li, Yan Bai, Yahua Hu, Yuanyi Huang, Xiangrong Yu, Sibin Liu, Xiaoming Qiu, Ligong Lu, Meiyun Wang, Yunfei Zha, Jie Tian
2021 J jnl
IEEE Trans. Knowl. Data Eng.
Xin Hong, Hailin Li, Paul Miller, Jianjiang Zhou, Ling Li, Danny Crookes, Yonggang Lu, Xuelong Li, Huiyu Zhou
2021 conf
EMBC
Siwen Wang, Di Dong, Hailin Li, Caizhen Feng, Yi Wang, Jie Tian
2021 J jnl
Signal Image Video Process.
Zhimiao Fan, Weijie Xia, Xue Liu, Hailin Li
2021 J jnl
Wirel. Commun. Mob. Comput.
Xiaoji Wan, Hailin Li, Liping Zhang, Yenchun Jim Wu
2021 J jnl
Pattern Recognit.
Hailin Li, Zechen Liu
2021 J jnl
Expert Syst. Appl.
Hailin Li, Tian Du
2021 J jnl
Wirel. Commun. Mob. Comput.
Jing Tan, Jiawen Hu, Xikuan Dong, Hailin Li, Jianjiang Zhou
2021 J jnl
Inf. Sci.
Hailin Li
2020 J jnl
IEEE Access
Cheng Wang, Delei Chen, Yanxia Hu, Yu Ceng, Jianwei Chen, Hailin Li
2020 J jnl
Sci. China Inf. Sci.
Mengjie Fang, Bingxi He, Li Li, Di Dong, Xin Yang, Cong Li, Lingwei Meng, Lianzhen Zhong, Hailin Li, Hongjun Li, Jie Tian
2020 J jnl
Knowl. Based Syst.
Yewang Chen, Xiaoliang Hu, Wentao Fan, Lianlian Shen, Zheng Zhang, Xin Liu, Ji-Xiang Du, Haibo Li, Yi Chen, Hailin Li
2020 J jnl
Knowl. Based Syst.
Hailin Li, Miao Wei
2020 conf
SAM
Chenguang Shi, Yijie Wang, Fei Wang, Hailin Li
2020 conf
MICCAI (3)
Jinglu Zhang, Yinyu Nie, Yao Lyu, Hailin Li, Jian Chang, Xiaosong Yang, Jian-Jun Zhang
2020 J jnl
CoRR
Jinglu Zhang, Yinyu Nie, Yao Lyu, Hailin Li, Jian Chang, Xiaosong Yang, Jian-Jun Zhang
2020 J jnl
J. Comput. Appl. Math.
Hailin Li, Yenchun Jim Wu, Yewang Chen
2019 J jnl
IEEE Access
Chunpei Lin, Guanxi Zhao, Yen-Chun Jim Wu, Hailin Li
2019 J jnl
IEEE Access
Hailin Li, Chunpei Lin, Xiaoji Wan, Zhengxin Li
2019 J jnl
Neurocomputing
Hailin Li
2019 J jnl
Comput. Intell. Neurosci.
Baozhong Li, Yanming Liu, Hailin Li
2019 J jnl
IEEE Access
Hailin Li, Cheng Wang
2019 J jnl
IEEE Access
Zhengxin Li, Jiansheng Guo, Hailin Li, Tao Wu, Sheng Mao, Feiping Nie
2019 J jnl
J. Intell. Fuzzy Syst.
Zhengxin Li, Fengming Zhang, Feiping Nie, Hailin Li, Jian Wang
2018 J jnl
Pattern Recognit.
Yewang Chen, Shengyu Tang, Nizar Bouguila, Cheng Wang, Ji-Xiang Du, Hailin Li
2018 J jnl
IEEE Trans. Veh. Technol.
Yuan Ding, Vincent F. Fusco, Alexey Shitvov, Yue Xiao, Hailin Li
2018 J jnl
IEEE Access
Hailin Li, Yachao Jiang, Yuan Ding, Jing Tan, Jianjiang Zhou
2018 A* conf
ICDM
Yewang Chen, Lida Zhou, Nizar Bouguila, Bineng Zhong, Fei Wu, Zhen Lei, Ji-Xiang Du, Hailin Li
2017 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Feng Li, Shuyuan Li, Hailin Li
2017 J jnl
Entropy
Ji She, Jianjiang Zhou, Fei Wang, Hailin Li
2016 J jnl
Neurocomputing
Hailin Li
2016 conf
VTC Spring
Hailin Li, Feng Li, Shuyuan Li
2015 J jnl
Int. J. Mach. Learn. Cybern.
Hailin Li
2015 Misc conf
ICNC
Shoulei Ma, Hailin Li, Aihua Cao, Jing Tan, Jianjiang Zhou
2014 J jnl
Expert Syst. Appl.
Hailin Li
2014 conf
ICDM Workshops
Hailin Li, Xiaoji Wan, Ye Liang, Shile Gao
2014 J jnl
J. Intell. Inf. Syst.
Hailin Li, Libin Yang
2014 C conf
ENTER
Jianqing Huang, Yahui Li, Hailin Li
2013 conf
ADMA (1)
Hailin Li, Libin Yang
2013 J jnl
Knowl. Based Syst.
Hailin Li, Libin Yang
2012 conf
SERE (Companion)
Hailin Li, Yadi Wang, Jihong Han
2011 conf
PAKDD Workshops
Hailin Li, Chonghui Guo, Libin Yang
2011 J jnl
Expert Syst. Appl.
Wangren Qiu, Xiaodong Liu, Hailin Li
2011 J jnl
Knowl. Based Syst.
Hailin Li, Chonghui Guo
2011 J jnl
Expert Syst. Appl.
Hailin Li, Chonghui Guo, Wangren Qiu
2010 C conf
KSEM
Chonghui Guo, Hailin Li, Donghua Pan
2007 conf
CCTA
Hailin Li
2004 B conf
IJCNN
Hailin Li, Cihan H. Dagli, David Enke
2003 B conf
IJCNN
Hailin Li, Cihan H. Dagli
2003 C conf
IEA/AIE
Hailin Li, Cihan H. Dagli
redb/extractors/capa.py
← Index redb/extractors/capa.py python
from dataclasses import asdict
import inspect
import json
import subprocess
import magic
from magika import Magika
from typing import Any, Dict, List, Tuple
from datetime import datetime, timezone

from redb.extractors.enum import Tag
from redb.models.dataclasses import CAPA
from redb.extractors.extractor import Extractor
from dotenv import load_dotenv
import os

load_dotenv(override=True)

class CAPAExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
    ):
        super().__init__(
            filepath, 
            log, 
            exporters,
            index_prefix, 
            elastic_index, 
            known_benign, 
            known_malicious
        )
        self.capa = None
        self.elastic_index = self.index_prefix + "-capa"

    def _replace_empty_keys(self, dictionary, replacement="default_empty_key"):
        """
        Replace empty keys in a dictionary with a specified replacement.

        Args:
        dictionary (dict): The input dictionary
        replacement (str): The replacement for empty keys (default: 'empty_key')

        Returns:
        dict: A new dictionary with empty keys replaced
        """
        # tmp_dict = {}
        # for k, v in dictionary.items():
        #     if k == '':
        #         tmp_dict[replacement] = dictionary[k]
        #     else:
        #         tmp_dict[k] = dictionary[k]
        # return tmp_dict
        return {(replacement if k == "" else k): v for k, v in dictionary.items()}

    def _extract_capa(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        TIMEOUT = int(os.getenv("CAPA_TIMEOUT")) # 5 minutes in seconds
        capa_command = [os.getenv("CAPA_PATH"), "-j", self.filepath] # COMMENT FOR TESTING ON MAC

        import signal

        # try:
        #     result = subprocess.run(
        #         capa_command, capture_output=True, text=True, check=True, timeout=TIMEOUT
        #     )
        # except subprocess.TimeoutExpired:
        #     self.log.error(f"The capa command timed out after {TIMEOUT} seconds")
        #     return {}
        # except subprocess.CalledProcessError as e:
        #     self.log.error(f"Error running capa: {e}")
        #     return {}

        # try:
        #     capa_output = json.loads(result.stdout)
        # except json.JSONDecodeError as e:
        #     self.log.error("Error parsing capa output: {e}")
        #     return {}

        # Create a process group for easier termination of all child processes
        try:
            # Start the process in a new process group
            process = subprocess.Popen(
                capa_command,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid  # Use os.setsid() to create a new process group
            )
            
            # Implement timeout handling manually
            try:
                stdout, stderr = process.communicate(timeout=TIMEOUT)
                # Process completed within timeout
                if process.returncode != 0:
                    self.log.error(f"Error running capa, return code: {process.returncode}, stderr: {stderr}")
                    return {}
            except subprocess.TimeoutExpired:
                # Kill the entire process group on timeout
                self.log.warning(f"The capa command timed out after {TIMEOUT} seconds, terminating process group")
                
                try:
                    # Send SIGTERM to the entire process group
                    os.killpg(process.pid, signal.SIGTERM)
                    
                    # Give it a moment to terminate gracefully
                    try:
                        process.wait(timeout=3)
                    except subprocess.TimeoutExpired:
                        # If it's still running after 3 seconds, send SIGKILL
                        self.log.warning("Process didn't terminate with SIGTERM, sending SIGKILL")
                        os.killpg(process.pid, signal.SIGKILL)
                        
                    process.wait()  # Make sure process resources are fully cleaned up
                except (ProcessLookupError, OSError) as e:
                    self.log.warning(f"Error while killing process: {e}")
                    
                return {}
                
            try:
                capa_output = json.loads(stdout)
            except json.JSONDecodeError as e:
                self.log.error(f"Error parsing capa output: {e}")
                return {}

            capa_dump = {}  # dictionalry of capabilities
            capabilities = set()  # list of capabilities
            namespaces = set()  # list of namespaces
            attack_dump = {}  # dictionary of tuples [tactic](technique, technique_id)
            tactics = set()  # list of tactics
            techniques = set()  # list of techniques
            techniques_id = set()  # list of techniques_id
            mbc_dump = {}  # dictionary of tuples [objective](behavior, behavior_id)
            mbc_objectives = set()  # list of objectives
            mbc_behaviors = set()  # list of behaviors
            mbc_behaviors_id = set()  # list of behaviors_id

            if isinstance(capa_output, dict) and "rules" in capa_output:
                rules = capa_output["rules"]
                if isinstance(rules, dict):
                    for rule_name, rule_data in rules.items():
                        if isinstance(rule_data, dict) and "meta" in rule_data:
                            meta = rule_data["meta"]
                            if isinstance(meta, dict):
                                # Process capabilities
                                namespace = meta.get("namespace", "").lower()
                                # if namespace != 'lib':
                                if namespace not in capa_dump:
                                    capa_dump[namespace] = []
                                    namespaces.add(namespace)
                                capa_dump[namespace].append(rule_name)
                                capabilities.add(rule_name)

                                # Process ATTACK information
                                if "attack" in meta:
                                    for attack_entry in meta["attack"]:
                                        tactic = attack_entry.get("tactic", "")
                                        technique = attack_entry.get("technique", "")
                                        id = attack_entry.get("id", "")
                                        if tactic and technique:
                                            if tactic in attack_dump:
                                                attack_dump[tactic].append((technique, id))
                                            else:
                                                attack_dump[tactic] = [(technique, id)]
                                            tactics.add(tactic)
                                            techniques.add(technique)
                                            techniques_id.add(id)

                                # Process MBC information
                                if "mbc" in meta:
                                    for mbc_entry in meta["mbc"]:
                                        objective = mbc_entry.get("objective", "")
                                        behavior = mbc_entry.get("behavior", "")
                                        id = mbc_entry.get("id", "")
                                        if objective and behavior:
                                            if objective in mbc_dump:
                                                mbc_dump[objective].append((behavior, id))
                                            else:
                                                mbc_dump[objective] = [(behavior, id)]
                                            mbc_objectives.add(objective)
                                            mbc_behaviors.add(behavior)
                                            mbc_behaviors_id.add(id)

            # return {
            #     'capabilities_all': json.dumps(capabilities_all, indent=2),
            #     'capabilities': list(capabilities),
            #     'namespaces': list(namespaces),
            #     'attack': json.dumps(attack, indent=2),
            #     'tactics': list(tactics),
            #     'techniques': list(techniques),
            #     'techniques_id': list(techniques_id),
            #     'mbc': json.dumps(mbc, indent=2),
            #     'mbc_objectives': list(mbc_objectives),
            #     'mbc_behaviors': list(mbc_behaviors),
            #     'mbc_behaviors_id': list(mbc_behaviors_id)
            # }

            capa_dump = self._replace_empty_keys(capa_dump)
            attack_dump = self._replace_empty_keys(attack_dump)
            mbc_dump = self._replace_empty_keys(mbc_dump)
            self.capa = CAPA(
                json.dumps(capa_dump, indent=2),
                list(capabilities),
                list(namespaces),
                json.dumps(attack_dump, indent=2),
                list(tactics),
                list(techniques),
                list(techniques_id),
                json.dumps(mbc_dump, indent=2),
                list(mbc_objectives),
                list(mbc_behaviors),
                list(mbc_behaviors_id),
            )
            self.log.debug(f"CAPA dump: {self.capa})")
            
        except Exception as e:
            self.log.error(f"Unexpected error in CAPA extraction: {str(e)}")
            # Try to clean up any process if possible
            if 'process' in locals() and process.poll() is None:
                try:
                    os.killpg(process.pid, signal.SIGKILL)
                    process.wait()
                except:
                    pass
            return {}

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.capa
        elif exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)
            
            # Prepare data for multiple tables
            tables_data = {
                'multi_table': True,  # Flag for multi-table export
                
                # Raw data table
                'raw': {
                    'table': 'redb_capa',
                    'data': [[
                        self.sha256,
                        self.md5,
                        self.sha1,
                        current_time,
                        self.capa.capa_dump,  # capa_dump
                        self.capa.attack_dump,            # attack_dump
                        self.capa.mbc_dump                # mbc_dump
                    ]],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'capa_dump', 'attack_dump', 'mbc_dump'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'JSON', 'JSON', 'JSON'
                    ]
                },
                
                # Capabilities table
                'capabilities': {
                    'table': 'redb_capa_capabilities',
                    'data': [
                        [self.sha256, self.md5, self.sha1, current_time, namespace, capability]
                        for namespace, capabilities in json.loads(self.capa.capa_dump).items()
                        for capability in capabilities
                    ],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'namespace', 'capability'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'LowCardinality(String)', 'LowCardinality(String)'
                    ]
                },
                
                # MITRE ATT&CK table
                'attack': {
                    'table': 'redb_capa_attack',
                    'data': [
                        [self.sha256, self.md5, self.sha1, current_time, 
                         tactic, technique[0], technique[1]]  # technique[0] is the name, technique[1] is the ID
                        for tactic, techniques in json.loads(self.capa.attack_dump).items()
                        for technique in techniques
                    ],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'tactic', 'technique', 'technique_id'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'LowCardinality(String)', 'LowCardinality(String)', 
                        'LowCardinality(String)'
                    ]
                },
                
                # MBC table
                'mbc': {
                    'table': 'redb_capa_mbc',
                    'data': [
                        [self.sha256, self.md5, self.sha1, current_time,
                         objective, behavior[0], behavior[1]]  # behavior[0] is the name, behavior[1] is the ID
                        for objective, behaviors in json.loads(self.capa.mbc_dump).items()
                        for behavior in behaviors
                    ],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'objective', 'behavior', 'behavior_id'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'LowCardinality(String)', 'LowCardinality(String)',
                        'LowCardinality(String)'
                    ]
                }
            }
            
            return tables_data

    def get_clickhouse_table(self) -> str:
        return "redb_capa"  # Return the main table name

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_capa()
            return self.capa  # Return the extracted data instead of exporting directly
        except Exception as e:
            self.log.error(f"Error extracting CAPA: {e}")
            return None

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