Kai-Ming Li

30 papers C 4Journal 23Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Zhi-Hao Wang, Yuan-Peng Zhang, Kai-Ming Li, Ying Luo, Qun Zhang, Linghua Su
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Dan Xu, Siyuan Zhao, Kai-Ming Li, Jiang Qian, Mengdao Xing, Maria Sabrina Greco, Fulvio Gini
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Hang Yuan, Ying Luo, Yijun Chen, Jia Liang, Ying-Xi Liu, Kai-Ming Li
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Shichao Xiong, Ying Luo, Haobo Wang, Kai-Ming Li, Qun Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Shichao Xiong, Hongwei Zhang, Kai-Ming Li, Ying Luo, Qun Zhang
2024 J jnl
Remote. Sens.
Jianfei Ren, Jia Liang, Huan Wang, Kai-Ming Li, Ying Luo, Dongtao Zhao
2024 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Yuan-Peng Zhang, Yan Xie, Le Kang, Kai-Ming Li, Ying Luo, Qun Zhang
2024 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Xiaochen Zhao, Kai-Ming Li, Ying Luo, Dongtao Zhao, Qun Zhang
2024 J jnl
Remote. Sens.
Jianfei Ren, Huan Wang, Kai-Ming Li, Ying Luo, Qun Zhang, Zhuo Chen
2024 J jnl
IEEE Geosci. Remote. Sens. Lett.
Shichao Xiong, Kai-Ming Li, Haobo Wang, Siyuan Zhao, Ying Luo, Qun Zhang
2023 J jnl
Remote. Sens.
Yuan-Peng Zhang, Jingye Guan, Haobo Wang, Kai-Ming Li, Ying Luo, Qun Zhang
2023 J jnl
Remote. Sens.
Hongwei Zhang, Jiacheng Ni, Kai-Ming Li, Ying Luo, Qun Zhang
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Huan Wang, Kai-Ming Li, Yan-Xin Yuan, Ying Luo, Qun Zhang
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Huan Wang, Le Kang, Kai-Ming Li, Ying Luo, Qun Zhang
2022 J jnl
IEEE Trans. Instrum. Meas.
Yang Yang, Yanyan Ge, Beichen Li, Qing Wang, Yue Lang, Kai-Ming Li
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Huan Wang, Kai-Ming Li, Yuan-Peng Zhang, Ying Luo, Qun Zhang
2021 conf
ICCAIS
Zhidong Liu, Fuan Dong, Ying Luo, Qun Zhang, Kai-Ming Li, Dan Wang
2020 J jnl
IEEE Access
Dan Wang, Qun Zhang, Ying Luo, Kai-Ming Li, Xiaowen Liu
2019 C conf
IGARSS
Kai-Ming Li, Xiao-yu Qu, Yong Wu, Yu-he Xia, Wang-Yang Li
2018 C conf
IGARSS
Qi-Yong Liu, Kai-Ming Li, Wen-Jun Huo, Zhiqiang Ma, Fufei Gu
2018 J jnl
IEEE Geosci. Remote. Sens. Lett.
Fufei Gu, Min-Hui Fu, Bi-Shuai Liang, Kai-Ming Li, Qun Zhang
2017 conf
MLICOM (2)
Feng Zhu, Xiaofeng Hu, Xiaoyuan He, Kai-Ming Li, Lu Yang
2017 conf
MLICOM (2)
Yi-shuai Gong, Qun Zhang, Kai-Ming Li, Yi-Jun Chen
2012 J jnl
Sci. China Inf. Sci.
Feng Zhu, Qun Zhang, Ying Luo, Kai-Ming Li, Fufei Gu
2012 C conf
IGARSS
Qun Zhang, Feng Zhu, Donghu Deng, Fufei Gu, Kai-Ming Li
2011 C conf
ICCE
Ming-Yan Ngan, Kai-Ming Li
2011 J jnl
IEEE Geosci. Remote. Sens. Lett.
Kai-Ming Li, Xian-jiao Liang, Qun Zhang, Ying Luo, Hong-jing Li
2010 J jnl
Res. Pract. Technol. Enhanc. Learn.
Kai-Ming Li
2010 J jnl
IEEE Trans. Geosci. Remote. Sens.
Ying Luo, Qun Zhang, Cheng-Wei Qiu, Xian-jiao Liang, Kai-Ming Li
2008 J jnl
Appl. Math. Comput.
Ya-zhou Li, Kai-Ming Li, Chang Lin
tests/scripts/test_macho_extractors_local.py
← Index tests/scripts/test_macho_extractors_local.py python
#!/usr/bin/env python3
"""
Local MachO extractors test - test actual extractors without server connections
"""

import sys
import os
import logging
import hashlib
from datetime import datetime, timezone
from typing import Dict, Any, Optional
from unittest.mock import Mock, patch

# Add the redb directory to the path so we can import the extractors
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'redb'))

# Mock settings to avoid database connections
with patch.dict('os.environ', {'REDB_ENV': 'test'}):
    # Import the actual extractors
    from redb.extractors.macho_extractors.macho_features import MachOFeaturesExtractor
    from redb.extractors.macho_extractors.macho_segments import MachOSegmentExtractor
    from redb.extractors.macho_extractors.macho_imports import MachOImportExtractor
    from redb.extractors.macho_extractors.macho_exports import MachOExportExtractor
    from redb.extractors.macho_extractors.macho_dylibs import MachODylibExtractor
    from redb.extractors.macho_extractors.macho_signature import MachOSignatureExtractor
    from redb.extractors.macho_extractors.macho_universal import MachOUniversalExtractor

def setup_logging():
    """Setup basic logging configuration."""
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s'
    )
    return logging.getLogger(__name__)

class MockLogger:
    """Mock logger for testing without RedB dependencies."""
    def __init__(self):
        self.logger = logging.getLogger(__name__)
    
    def debug(self, msg):
        self.logger.debug(msg)
    
    def info(self, msg):
        self.logger.info(msg)
    
    def warning(self, msg):
        self.logger.warning(msg)
    
    def error(self, msg):
        self.logger.error(msg)

class MockExporter:
    """Mock exporter that does nothing."""
    def export(self, data):
        pass

def create_mock_extractor(extractor_class, filepath):
    """Create an extractor instance with mocked dependencies."""
    log = MockLogger()
    
    # Mock the exporters to avoid database connections
    mock_exporters = [MockExporter()]
    
    # Create the extractor with mocked dependencies
    extractor = extractor_class(
        filepath=filepath,
        log=log,
        exporters=mock_exporters,
        index_prefix="test",
        elastic_index="test_macho",
        known_benign=False,
        known_malicious=False
    )
    
    return extractor

def test_extractor(extractor_class, filepath, extractor_name):
    """Test a specific extractor."""
    log = setup_logging()
    log.info(f"Testing {extractor_name}...")
    
    try:
        # Create the extractor with mocked dependencies
        extractor = create_mock_extractor(extractor_class, filepath)
        
        if not extractor.macho:
            log.error(f"{extractor_name}: No MachO object created")
            return False

        # Test the actual extract method
        result = extractor.extract()
        
        if result:
            log.info(f"{extractor_name}: Successfully extracted data")
            print(f"\n{'='*60}")
            print(f"=== {extractor_name.upper()} RESULTS ===")
            print(f"{'='*60}")
            
            if isinstance(result, list):
                print(f"📊 Extracted {len(result)} items")
                print()
                for i, item in enumerate(result):
                    print(f"📦 Item {i+1}:")
                    print(f"   {'─'*40}")
                    # Handle dataclass objects in lists
                    if hasattr(item, '__dataclass_fields__'):
                        from dataclasses import asdict
                        item_dict = asdict(item)
                        for key, value in item_dict.items():
                            if isinstance(value, (list, dict)):
                                if isinstance(value, list):
                                    print(f"   🔹 {key}: List with {len(value)} items")
                                    print(f"      {value}")
                                elif isinstance(value, dict):
                                    print(f"   🔹 {key}: Dict with {len(value)} keys")
                                    for k, v in value.items():
                                        print(f"      {k}: {v}")
                            else:
                                print(f"   🔹 {key}: {value}")
                    else:
                        # Regular dict
                        for key, value in item.items():
                            if isinstance(value, (list, dict)):
                                if isinstance(value, list):
                                    print(f"   🔹 {key}: List with {len(value)} items")
                                    print(f"      {value}")
                                elif isinstance(value, dict):
                                    print(f"   🔹 {key}: Dict with {len(value)} keys")
                                    for k, v in value.items():
                                        print(f"      {k}: {v}")
                            else:
                                print(f"   🔹 {key}: {value}")
                    print()
            else:
                print("📊 Extracted data:")
                print()
                # Handle dataclass objects
                if hasattr(result, '__dataclass_fields__'):
                    # It's a dataclass, use dataclasses.asdict
                    from dataclasses import asdict
                    result_dict = asdict(result)
                    for key, value in result_dict.items():
                        if isinstance(value, (list, dict)):
                            if isinstance(value, list):
                                print(f"🔹 {key}: List with {len(value)} items")
                                print(f"   {value}")
                            elif isinstance(value, dict):
                                print(f"🔹 {key}: Dict with {len(value)} keys")
                                for k, v in value.items():
                                    print(f"   {k}: {v}")
                        else:
                            print(f"🔹 {key}: {value}")
                        print()
                else:
                    # It's a regular dict
                    for key, value in result.items():
                        if isinstance(value, (list, dict)):
                            if isinstance(value, list):
                                print(f"🔹 {key}: List with {len(value)} items")
                                print(f"   {value}")
                            elif isinstance(value, dict):
                                print(f"🔹 {key}: Dict with {len(value)} keys")
                                for k, v in value.items():
                                    print(f"   {k}: {v}")
                        else:
                            print(f"🔹 {key}: {value}")
                        print()
        else:
            log.warning(f"{extractor_name}: No data extracted")
            print(f"\n❌ {extractor_name}: No data extracted")
        
        return True
        
    except Exception as e:
        log.error(f"{extractor_name}: Error during extraction: {e}")
        import traceback
        traceback.print_exc()
        return False

def main():
    """Main function."""
    if len(sys.argv) < 2:
        print("Usage: python test_macho_extractors_local.py <macho_file> [extractor_name]")
        print("\nAvailable extractors:")
        print("  features    - Basic MachO header and metadata")
        print("  segments    - Segment information and analysis")
        print("  imports     - Imported functions and libraries")
        print("  exports     - Exported symbols")
        print("  dylibs      - Dynamic library dependencies")
        print("  signature   - Code signing information")
        print("  universal   - FAT/Universal binary information")
        print("  all         - Test all extractors")
        sys.exit(1)
    
    filepath = sys.argv[1]
    extractor_name = sys.argv[2] if len(sys.argv) > 2 else "all"
    
    if not os.path.exists(filepath):
        print(f"File not found: {filepath}")
        sys.exit(1)
    
    # Define extractors
    extractors = {
        'features': (MachOFeaturesExtractor, "MachO Features"),
        'segments': (MachOSegmentExtractor, "MachO Segments"),
        'imports': (MachOImportExtractor, "MachO Imports"),
        'exports': (MachOExportExtractor, "MachO Exports"),
        'dylibs': (MachODylibExtractor, "MachO Dylibs"),
        'signature': (MachOSignatureExtractor, "MachO Code Signature"),
        'universal': (MachOUniversalExtractor, "MachO Universal/FAT"),
    }
    
    if extractor_name == "all":
        print(f"Testing all extractors with file: {filepath}")
        success_count = 0
        for name, (extractor_class, display_name) in extractors.items():
            if test_extractor(extractor_class, filepath, display_name):
                success_count += 1
            print("-" * 50)
        
        print(f"\n✅ {success_count}/{len(extractors)} extractors completed successfully")
        
    elif extractor_name in extractors:
        extractor_class, display_name = extractors[extractor_name]
        success = test_extractor(extractor_class, filepath, display_name)
        
        if success:
            print(f"\n✅ {display_name} testing completed successfully")
        else:
            print(f"\n❌ {display_name} testing failed")
            sys.exit(1)
    else:
        print(f"Unknown extractor: {extractor_name}")
        print("Available extractors:", ", ".join(extractors.keys()) + ", all")
        sys.exit(1)

if __name__ == "__main__":
    main()