Kai Huo

29 papers Journal 22Unranked 7
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Zhenhua Du, Binbin Xu, Haoyu Zhang, Kai Huo, Shuaifeng Zhi
2024 J jnl
IEEE Robotics Autom. Lett.
Zhenhua Du, Binbin Xu, Haoyu Zhang, Kai Huo, Shuaifeng Zhi
2024 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zixuan Sun, Shuaifeng Zhi, Kai Huo, Xuecong Liu, Weidong Jiang, Yongxiang Liu
2024 conf
ICCT
Haoyu Yi, Xinjin Lu, Zhi Lin, Weidong Jiang, Xinyu Zhang, Kai Huo
2023 conf
ICANN (1)
Lingyan Xue, Xinyu Zhang, Weidong Jiang, Kai Huo, Qinmu Shen
2023 J jnl
CoRR
Junjing Zheng, Xinyu Zhang, Yongxiang Liu, Weidong Jiang, Kai Huo, Li Liu
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yanbo Mai, Shuanghui Zhang, Weidong Jiang, Chi Zhang, Kai Huo, Yongxiang Liu
2023 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Yanbo Mai, Shuanghui Zhang, Weidong Jiang, Chi Zhang, Kai Huo, Yongxiang Liu
2023 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Xiangfeng Qiu, Xinyu Zhang, Kai Huo, Weidong Jiang
2023 conf
ICANN (7)
Liu Liu, Shuaifeng Zhi, Zhenhua Du, Li Liu, Xinyu Zhang, Kai Huo, Weidong Jiang
2023 J jnl
CoRR
Liu Liu, Shuaifeng Zhi, Zhenhua Du, Li Liu, Xinyu Zhang, Kai Huo, Weidong Jiang
2022 J jnl
CoRR
Lingyan Xue, Xinyu Zhang, Weidong Jiang, Kai Huo
2022 J jnl
IEEE Instrum. Meas. Mag.
Yi Yang, Hairong Fang, Kai Huo, Yufei Chen
2022 conf
ICCT
Haoyu Yi, Weidong Jiang, Xinyu Zhang, Kai Huo
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xiangfeng Qiu, Weidong Jiang, Xinyu Zhang, Kai Huo
2021 conf
ICCBD
Xiangfeng Qiu, Weidong Jiang, Xinyu Zhang, Kai Huo
2020 J jnl
IEEE Access
Jingjing Zhao, Yongxiang Liu, Kai Huo, Xinyu Zhang, Bo Xiao
2020 J jnl
Sensors
Xiaoqi Yang, Kai Huo, Jianwei Su, Xinyu Zhang, Weidong Jiang
2020 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Zheran Shang, Kai Huo, Weijian Liu, Yong-Liang Wang, Xiang Li
2020 J jnl
Digit. Signal Process.
Zheran Shang, Kai Huo, Weijian Liu, Yang Sun, Yongliang Wang
2020 J jnl
Knowl. Based Syst.
Yang Zhang, Kai Huo, Zhen Liu, Yu Zang, Yongxiang Liu, Xiang Li, Qianyu Zhang, Cheng Wang
2020 J jnl
IEEE Trans. Signal Process.
Xinyu Zhang, Weidong Jiang, Kai Huo, Yongxiang Liu, Xiang Li
2019 J jnl
Sensors
Xiaoqi Yang, Kai Huo, Xinyu Zhang, Weidong Jiang, Yong Chen
2019 J jnl
IEEE Access
Xinyu Zhang, Kai Huo, Yongxiang Liu, Xiang Li
2019 conf
EUSIPCO
Xinyu Zhang, Kai Huo, Shuanghui Zhang, Yongxiang Liu, Weidong Jiang, Xiang Li
2018 J jnl
Sensors
Feixiang Zhao, Yongxiang Liu, Kai Huo, Shuanghui Zhang, Zhongshuai Zhang
2017 conf
CSPS
Xiaoqi Yang, Weidong Jiang, Kai Huo, Jingjing Zhao
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Dekang Zhu, Yongxiang Liu, Kai Huo, Xiang Li
2011 J jnl
IEEE Trans. Geosci. Remote. Sens.
Kai Huo, Yongxiang Liu, Jiemin Hu, Weidong Jiang, Xiang Li
redb/extractors/pe_extractors/pe_sections.py
← Index redb/extractors/pe_extractors/pe_sections.py python
import base64
import hashlib
import inspect
from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PESection
from datetime import datetime, timezone
from typing import Any


class PESectionExtractor(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_sections"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_sections(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        sections = []
        for section in self.pe.sections:
            try:
                name = self.process_binary_string(section.Name)
            except Exception as e:
                name = "UnableToDecode"
                self.log.warning(
                    f'Unable to store section Name "{section.Name}" for {self.hash.sha256}'
                    f" exception {e}"
                )
            sec_sha256 = section.get_hash_sha256()
            sec_md5 = section.get_hash_md5()
            # sec_entropy = "%.2f" % section.get_entropy()
            sec_entropy = section.get_entropy()
            pe_section = PESection(
                _id=hashlib.sha256(
                    name.encode()
                ).hexdigest(),  # usecase 8e035beb02a411f8a9e92d4cf184ad34f52bbd0a81a50c222cdd4706e4e45104, all section have same sha256
                section_name=name,
                section_name_b64=base64.b64encode(
                    section.Name.rstrip(b'\x00')
                ).decode(),  # base64.b64decode(b64) to decode
                section_v_addr=section.VirtualAddress,
                section_v_addr_hex=hex(section.VirtualAddress),
                section_v_size=section.Misc_VirtualSize,
                section_size=section.SizeOfRawData,
                section_pointer_to_raw_data=hex(section.PointerToRawData),
                section_md5=sec_md5,
                section_sha256=sec_sha256,
                section_entropy=sec_entropy,
            )
            sections.append(pe_section)
        return sections

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            sections = self._extract_sections()
            # self.export_to_elastic(sections)  # Let the exporters handle this
            return sections
        except Exception as e:
            self.log.error(f"Error extracting PE sections: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            sections = self.extract()
            if sections is None:
                return None
            
            data = []
            current_time = datetime.now(timezone.utc)
            
            for section in sections:
                data.append([
                    self.sha256,                          # sha256
                    self.md5,                             # md5
                    self.sha1,                            # sha1
                    section.section_name,                 # section_name
                    section.section_name_b64,             # section_name_b64
                    section.section_entropy,              # section_entropy
                    section.section_sha256,               # section_sha256
                    section.section_md5,                  # section_md5
                    section.section_size,                 # section_size
                    section.section_v_addr,               # section_v_addr
                    section.section_v_size,               # section_v_size
                    int(section.section_pointer_to_raw_data, 16),  # section_pointer_to_raw_data - convert from hex
                    current_time                          # analysis_date
                ])
            
            column_names = [
                'sha256', 'md5', 'sha1', 'section_name', 'section_name_b64',
                'section_entropy', 'section_sha256', 'section_md5', 'section_size',
                'section_v_addr', 'section_v_size', 'section_pointer_to_raw_data',
                'analysis_date'
            ]
            
            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'LowCardinality(String)', 'LowCardinality(String)',
                'Float64', 'FixedString(64)', 'FixedString(32)', 'UInt64',
                'UInt64', 'UInt64', 'UInt64',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

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