Xiang Lu

27 papers A* 2B 3Journal 14Unranked 8
YearRankTypeTitle / Venue / Authors
2020 J jnl
Wirel. Commun. Mob. Comput.
Xiali Wang, Xiang Lu
2020 J jnl
BMC Medical Informatics Decis. Mak.
Jing Si, Rong Guo, Xiang Lu, Chao Han, Li Xu, Dan Xing, Caiping Chen
2017 conf
ICC
Xiaoshan Wang, Yao Liu, Xiang Lu, Shichao Lv, Zhiqiang Shi, Limin Sun
2017 J jnl
Peer-to-Peer Netw. Appl.
Haojin Zhu, Kuai Xu, Xiang Lu
2017 conf
MILCOM
Xiaoshan Wang, Yao Liu, Xiang Lu, Shichao Lv, Zhiqiang Shi, Limin Sun
2017 A* conf
MobiCom
Shangqing Zhao, Zhengping Luo, Zhuo Lu, Xiang Lu, Yao Liu
2017 J jnl
J. Supercomput.
Xiang Lu, Linlin Tu, Xinyun Zhou, Naixue Xiong, Limin Sun
2016 J jnl
J. Supercomput.
Qi Jiang, Muhammad Khurram Khan, Xiang Lu, Jianfeng Ma, Debiao He
2016 J jnl
Peer-to-Peer Netw. Appl.
Weidong Yang, Yunhua He, Limin Sun, Xiang Lu, Xinghua Li
2016 J jnl
Int. J. Grid Util. Comput.
Yichuan Wang, Jianfeng Ma, Xiang Lu, Di Lu, Liumei Zhang
2016 conf
ICC
Shichao Lv, Xiang Lu, Zhuo Lu, Xiaoshan Wang, Ning Wang, Limin Sun
2015 B conf
GLOBECOM
Xiaoshan Wang, Yao Liu, Zhiqiang Shi, Xiang Lu, Limin Sun
2015 J jnl
Peer-to-Peer Netw. Appl.
Qi Jiang, Jianfeng Ma, Xiang Lu, Youliang Tian
2015 conf
ICC
Yongming Jin, Hongsong Zhu, Zhiqiang Shi, Xiang Lu, Limin Sun
2015 conf
CCCV (1)
Kaixuan Xie, Shiming Ge, Rui Yang, Xiang Lu, Limin Sun
2015 B conf
GLOBECOM
Shuixian Chen, Xiang Lu, Limin Sun, Shiming Ge
2014 A* conf
INFOCOM
Hong Li, Limin Sun, Haojin Zhu, Xiang Lu, Xiuzhen Cheng
2014 J jnl
Clust. Comput.
Yichuan Wang, Jianfeng Ma, Di Lu, Xiang Lu, Liumei Zhang
2014 J jnl
J. Medical Syst.
Qi Jiang, Jianfeng Ma, Xiang Lu, Youliang Tian
2013 J jnl
IEEE Trans. Smart Grid
Xiang Lu, Wenye Wang, Jianfeng Ma
2013 J jnl
Smart Comput. Rev.
Xinghua Li, Xiang Lu, Jianfeng Ma
2013 conf
SmartGridComm
Xiang Lu, Wenye Wang, Jianfeng Ma, Limin Sun
2013 conf
INCoS
Yichuan Wang, Jianfeng Ma, Di Lu, Liumei Zhang, Xiang Lu
2012 J jnl
Int. J. Distributed Sens. Networks
Xiang Lu, Wenye Wang, Jianfeng Ma
2011 J jnl
Mob. Networks Appl.
Xinghua Li, Xiang Lu, Jianfeng Ma, Zhenfang Zhu, Li Xu, Youngho Park
2011 conf
MILCOM
Xiang Lu, Wenye Wang, Zhuo Lu, Jianfeng Ma
2011 B conf
GLOBECOM
Xiang Lu, Zhuo Lu, Wenye Wang, Jianfeng Ma
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOExport


class MachOExportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_exports"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'UInt32', 'Array(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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