Xiaofeng Li

169 papers C 63Journal 105Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Qixiang Li, Yuan Zhou, Shuwei Huo, Chong Wang, Xiaofeng Li
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yang Bai, Yubin Zhang, Xudong Zhang, Xiaofeng Li
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Jialong Ren, Yujia Qiu, Xiaoming Li, Xiaofeng Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yi Yang, Haoyu Wang, Xiaofeng Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Guo, Ferdinando Nunziata, Andrea Buono, Maurizio Migliaccio, Xiaofeng Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Mengjiao Wang, Haoyu Wang, Xiaofeng Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xin Luan, Huijie Fan, Qiang Wang, Nan Yang, Shiben Liu, Xiaofeng Li, Yandong Tang
2025 J jnl
Int. J. Digit. Earth
Yanjun Wang, Jinming Song, Xuegang Li, Guorong Zhong, Shuangqiang Zheng, Xiaofeng Li
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Barintag Saheya, Xia Ren, Maoguo Gong, Xiaofeng Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Barintag Saheya, Rui Cai, Hongyu Zhao, Maoguo Gong, Xiaofeng Li
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Jie Nie, Zijie Zuo, Xinyue Liang, Min Ye, Ning Song, Xiaofeng Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Zhou, Mingzhe Yang, Keran Chen, Xiaofeng Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yi Yang, Xiaolong Li, Xiaofeng Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Nan Yang, Xiaofeng Li
2024 J jnl
Int. J. Comput. Vis.
Nan Yang, Xin Luan, Huidi Jia, Zhi Han, Xiaofeng Li, Yandong Tang
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Wantai Chen, Xiaofeng Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Aiyue Liu, Yuhai Liu, Kuidong Xu, Feng Zhao, Yuan Zhou, Xiaofeng Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Zheng, Xiaofeng Li
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yuan Zhou, Tian Ren, Keran Chen, Le Gao, Xiaofeng Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shanshan Mu, Xiaofeng Li, Haoyu Wang, Gang Zheng, William Perrie, Chong Wang
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yanlei Du, Jianing Shao, Xiaofeng Yang, Robert Wang, Jian Yang, Xiaofeng Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yingjie Liu, Haoyu Wang, Fei Jiang, Yuan Zhou, Xiaofeng Li
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Keran Chen, Yuan Zhou, Shuoshi Li, Ping Wang, Xiaofeng Li
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Zhou, Qingren Yao, Shuwei Huo, Xiaofeng Li
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shuangshang Zhang, Xiaofeng Li, Xudong Zhang
2023 C conf
IGARSS
Shuangshang Zhang, Xiaofeng Li, Xudong Zhang
2023 C conf
IGARSS
Aiyue Liu, Xiaofeng Li, Kuidong Xu
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yibin Ren, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yibin Ren, Xiaofeng Li, Wenhao Zhang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Guo, Le Gao, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yibin Ren, Xiaofeng Li, Huan Xu
2022 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Le Gao, Xiaofeng Li, Fanzhou Kong, Rencheng Yu, Yuan Guo, Yibin Ren
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yan Wang, Gang Zheng, Xiaofeng Li, Lizhang Zhou, Bin Liu, Peng Chen, Lin Ren, Xiaohui Li
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Yibin Ren, Xiaofeng Li, Xiaofeng Yang, Huan Xu
2022 J jnl
CoRR
Yuan Zhou, Keran Chen, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Zhou, Keran Chen, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Guangyang Liu, Bin Liu, Gang Zheng, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Zhou, Yanjie Feng, Shuwei Huo, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuan Zhou, Chang Lu, Keran Chen, Xiaofeng Li
2022 C conf
IGARSS
Shanshan Mu, Xiaofeng Li
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Lizhang Zhou, Gang Zheng, JingSong Yang, Xiaofeng Li, Bin Zhang, He Wang, Peng Chen, Yan Wang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shanshan Mu, Xiaofeng Li, Haoyu Wang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Guosheng Zhang, Chao Xu, Xiaofeng Li, Ziqiang Zhu, William Perrie
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Chong Wang, Gang Zheng, Xiaofeng Li, Qing Xu, Bin Liu, Jun A. Zhang
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xudong Zhang, Xiaofeng Li, Quanan Zheng
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yanjun Wang, Xiaofeng Li, Jinming Song, Xuegang Li, Guorong Zhong, Bin Zhang
2021 C conf
IGARSS
Guangyang Liu, Bin Liu, Xiaofeng Li, Gang Zheng
2021 C conf
IGARSS
Yan Huang, Yibin Ren, Xiaofeng Li
2021 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xudong Zhang, Xiaofeng Li
2021 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yanlei Du, Xiaofeng Yang, Jian Yang, Shurun Tan, Wentao Ma, Ziwei Li, Xiaofeng Li
2021 J jnl
Remote. Sens.
Ferdinando Nunziata, Xiaofeng Li, Armando Marino, Weizeng Shao, Marcos Portabella, Xiaofeng Yang, Andrea Buono
2021 C conf
IGARSS
Yibin Ren, Xiaofeng Li
2021 C conf
IGARSS
Shanshan Mu, Xiaofeng Li
2020 C conf
IGARSS
Yingjie Liu, Xiaofeng Li, Yibin Ren
2020 J jnl
IEEE Access
Dongmei Song, Zongjin Zhen, Bin Wang, Xiaofeng Li, Le Gao, Ning Wang, Tao Xie, Ting Zhang
2020 C conf
IGARSS
Yanlei Du, Xiaofeng Yang, Jian Yang, Xiaofeng Li
2020 C conf
IGARSS
Shuangshang Zhang, Bin Liu, Xiaofeng Li, Qing Xu
2020 C conf
IGARSS
Bin Liu, Xiaofeng Li, Gang Zheng
2020 C conf
IGARSS
Chong Wang, Qing Xu, Xiaofeng Li, Yongcun Cheng
2020 C conf
IGARSS
Yibin Ren, Huan Xu, Bin Liu, Xiaofeng Li
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Changcheng Wang, Peng Shen, Xiaofeng Li, Jianjun Zhu, Zhiwei Li
2019 C conf
IGARSS
Gang Zheng, Xiaofeng Li, Bin Liu
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Zheng, Jianguo Liu, JingSong Yang, Xiaofeng Li
2019 C conf
IGARSS
Chong Wang, Qing Xu, Gang Zheng, Xiaofeng Li
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shaohui Jin, Xiaofeng Li, Xiaofeng Yang, Jun A. Zhang, Dongliang Shen
2019 J jnl
Remote. Sens.
Yongcun Cheng, Qing Xu, Le Gao, Xiaofeng Li, Bin Zou, Ting Liu
2019 C conf
IGARSS
Dongliang Shen, Bin Liu, Xiaofeng Li
2019 J jnl
Remote. Sens.
Changzhe Jiao, Xinlin Wang, Shuiping Gou, Wenshuai Chen, Debo Li, Chao Chen, Xiaofeng Li
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Tao Zhang, Jinsheng Ji, Xiaofeng Li, Wenxian Yu, Huilin Xiong
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Zheng, JingSong Yang, Xiaofeng Li, Lizhang Zhou, Lin Ren, Peng Chen, Huaguo Zhang, Xiulin Lou
2018 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yiru Lu, Biao Zhang, William Perrie, Alexis Aurelien Mouche, Xiaofeng Li, He Wang
2018 C conf
IGARSS
Lanqing Huang, Xiaofeng Li, Bin Liu, Jun A. Zhang, Dongliang Shen, Zenghui Zhang, Wenxian Yu
2018 J jnl
Remote. Sens.
Wenshuai Chen, Shuiping Gou, Xinlin Wang, Xiaofeng Li, Licheng Jiao
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Zheng, Xiaofeng Li, Lizhang Zhou, JingSong Yang, Lin Ren, Peng Chen, Huaguo Zhang, Xiulin Lou
2018 C conf
IGARSS
Yongcun Cheng, Qing Xu, Xiaofeng Li
2018 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Qing Xu, Yizhi Li, Xiaofeng Li, Zenghai Zhang, Yuenan Cao, Yongcun Cheng
2018 C conf
IGARSS
Andrea Buono, Ferdinando Nunziata, Maurizio Migliaccio, Xiaofeng Yang, Xiaofeng Li
2018 J jnl
Remote. Sens.
Hye-Jin Woo, Kyung-Ae Park, Xiaofeng Li, Eun-Young Lee
2018 J jnl
Remote. Sens.
Jianmin Lin, Yating Wang, Weitao Wang, Xiaofeng Li, Sunke Fang, Chao Chen, Hong Zheng
2018 J jnl
Remote. Sens.
Jianmin Lin, Sunke Fang, Xiaofeng Li, Renhao Wu, Hong Zheng
2018 J jnl
Remote. Sens.
Yongcun Cheng, Qing Xu, Xiaofeng Li
2018 J jnl
Remote. Sens.
Xinxin Yue, Biao Zhang, Guoqiang Liu, Xiaofeng Li, Han Zhang, Yijun He
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Wensheng Wang, Xiaofeng Yang, Xiaofeng Li, Kun-Shan Chen, Guihong Liu, Ziwei Li, Martin Gade
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Guosheng Zhang, William Perrie, Xiaofeng Li, Jun A. Zhang
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Guosheng Zhang, Xiaofeng Li, William Perrie, Paul A. Hwang, Biao Zhang, Xiaofeng Yang
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shaohui Jin, Shuang Wang, Xiaofeng Li, Licheng Jiao, Jun A. Zhang, Dongliang Shen
2017 C conf
IGARSS
Peng Wang, Wenshuai Chen, Shuiping Gou, Xiangrong Zhang, Xiaofeng Li, Licheng Jiao
2017 J jnl
Remote. Sens.
Weizeng Shao, Jing Wang, Xiaofeng Li, Jian Sun
2017 J jnl
Remote. Sens.
Lizhang Zhou, Gang Zheng, Xiaofeng Li, JingSong Yang, Lin Ren, Peng Chen, Huaguo Zhang, Xiulin Lou
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Biao Zhang, Xiaofeng Li, William Perrie, Oscar Garcia-Pineda
2017 J jnl
Remote. Sens.
Xiaoqin Lu, Hui Yu, Xiaoming Yang, Xiaofeng Li
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Chunyan Li, Xiaofeng Li, Guosheng Zhang, Kevin M. Boswell, Matthew E. Kimball, Dongliang Shen, Jun Lin
2017 C conf
IGARSS
Frank M. Monaldo, Christopher R. Jackson, Xiaofeng Li
2017 C conf
IGARSS
Dongliang Shen, Xiaofeng Li, Leonard J. Pietrafesa, Shaowu Bao
2017 J jnl
Remote. Sens.
Shuangshang Zhang, Qing Xu, Quanan Zheng, Xiaofeng Li
2017 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Tae-sung Kim, Kyung-Ae Park, Xiaofeng Li, Alexis Mouche, Bertrand Chapron, Moonjin Lee
2017 J jnl
Remote. Sens.
Dongmei Song, Yaxiong Ding, Xiaofeng Li, Biao Zhang, Mingyu Xu
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shaowu Bao, Xiaofeng Li, Dongliang Shen, Zizang Yang, Leonard J. Pietrafesa, Weizhong Zheng
2017 C conf
IGARSS
Frank M. Monaldo, Christopher R. Jackson, Xiaofeng Li
2017 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yangdong Li, Chunyan Li, Xiaofeng Li
2017 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Paul A. Hwang, Xiaofeng Li, Biao Zhang
2017 C conf
IGARSS
Xiaofeng Li
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiaofeng Li, Weizhong Zheng, Xiaofeng Yang, Leonard J. Pietrafesa
2017 J jnl
Remote. Sens.
Lanqing Huang, Bin Liu, Xiaofeng Li, Zenghui Zhang, Wenxian Yu
2017 C conf
IGARSS
Yu Liu, Quanan Zheng, Xiaofeng Li
2016 C conf
IGARSS
Qing Xu, Guosheng Zhang, Xiaofeng Li, Yongcun Cheng
2016 C conf
IGARSS
Xiaofeng Li, Christopher R. Jackson, Frank M. Monaldo, Qing Xu, Shaowu Bao
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Mingrun Mai, Biao Zhang, Xiaofeng Li, Paul A. Hwang, Jun A. Zhang
2016 J jnl
IEEE Geosci. Remote. Sens. Lett.
Shuiping Gou, Xiaofeng Li, Xiaofeng Yang
2016 C conf
IGARSS
Shuiping Gou, Peng Wang, Xiaofeng Li, Licheng Jiao
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Zheng, JingSong Yang, Antony K. Liu, Xiaofeng Li, William G. Pichel, Shuangyan He
2016 C conf
IGARSS
Paul A. Hwang, Xiaofeng Li, Biao Zhang, Edward J. Walsh
2016 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xiaofeng Li, Ronan Fablet
2016 C conf
IGARSS
Biao Zhang, Xiaofeng Li, William Perrie, Oscar Garcia-Pineda
2016 C conf
IGARSS
William Perrie, Guosheng Zhang, Biao Zhang, Xiaofeng Li
2016 C conf
IGARSS
Guosheng Zhang, Xiaofeng Li, Biao Zhang, William Perrie
2016 J jnl
Remote. Sens.
Weizeng Shao, Zheng Zhang, Xiaofeng Li, Huan Li
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Andrea Buono, Ferdinando Nunziata, Maurizio Migliaccio, Xiaofeng Li
2016 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Frank M. Monaldo, Christopher R. Jackson, Xiaofeng Li, William G. Pichel
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Qing Xu, Xiaofeng Li, Shaowu Bao, Leonard J. Pietrafesa
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Di Dong, Xiaofeng Yang, Xiaofeng Li, Ziwei Li
2016 C conf
IGARSS
L. J. Pietrafesa, Shaowu Bao, Xiaofeng Li, Zizang Yang, Dongliang Shen, Weizhong Zheng
2016 C conf
IGARSS
Xiaofeng Yang, Xiaofeng Li, Weizhong Zheng, Ziwei Li
2015 J jnl
IEEE Trans. Geosci. Remote. Sens.
Feng Xu, Xiaofeng Li, Peng Wang, JingSong Yang, William G. Pichel, Ya-Qiu Jin
2015 C conf
IGARSS
Francis M. Monaldo, Christopher R. Jackson, William Pichel, Xiaofeng Li
2015 C conf
IGARSS
Xiaofeng Li, Weizhong Zheng, Xiaofeng Yang, William Pichel
2015 C conf
IGARSS
William G. Pichel, Frank M. Monaldo, Christopher R. Jackson, Xiaofeng Li, John Sapper
2015 J jnl
Int. J. Digit. Earth
Kyung-Ae Park, Eun-Young Lee, Xiaofeng Li, Sung-Rae Chung, Eun-Ha Sohn, Sungwook Hong
2015 J jnl
Remote. Sens.
Weizeng Shao, Xiaofeng Li, Jian Sun
2015 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xianwen Ding, Ferdinando Nunziata, Xiaofeng Li, Maurizio Migliaccio
2015 C conf
IGARSS
Xiaofeng Yang, Di Dong, Xiaofeng Li, Ziwei Li
2015 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiaofeng Li, Xiaofeng Yang, Weizhong Zheng, Jun A. Zhang, Leonard J. Pietrafesa, William G. Pichel
2014 C conf
IGARSS
Giovanni Zeni, Antonio Pepe, Qing Zhao, Manuela Bonano, Wei Gao, Xiaofeng Li, Xianwen Ding
2014 J jnl
IEEE Geosci. Remote. Sens. Lett.
Ferdinando Nunziata, Maurizio Migliaccio, Xiaofeng Li, Xianwen Ding
2014 C conf
IGARSS
Xianwen Ding, Xiaofeng Li
2014 C conf
IGARSS
Hong Yang, Bingqing Liu, Zhongxiang Zhao, Xiaofeng Li
2014 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yongcun Cheng, Bingqing Liu, Xiaofeng Li, Ferdinando Nunziata, Qing Xu, Xianwen Ding, Maurizio Migliaccio, William G. Pichel
2014 C conf
IGARSS
Qing Xu, Hongyuan Zhang, Yongcun Cheng, Xiaofeng Li, Xianwen Ding
2014 C conf
IGARSS
Xianwen Ding, Xiaofeng Li, Peng Liu, Yongliang Wei, Shuolin Huang, Junsheng Zhong
2013 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Guihong Liu, Xiaofeng Yang, Xiaofeng Li, Biao Zhang, William Pichel, Ziwei Li, Xuan Zhou
2013 C conf
IGARSS
Shaohui Jin, Xiaofeng Li, Shuang Wang
2013 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Oscar Garcia-Pineda, Ian R. MacDonald, Xiaofeng Li, Christopher R. Jackson, William G. Pichel
2013 C conf
IGARSS
Biao Zhang, William Perrie, Xiaofeng Li, William Pichel, Zhongfeng Qiu, Yijun He
2013 C conf
IGARSS
Xuezhu Lv, Xiaofeng Li, Xiaofeng Yang, William Pichel, Xuan Zhou, Yuguang Liu
2013 C conf
IGARSS
Xiaofeng Yang, Xiaofeng Li, Yang Yu, Ziwei Li
2012 C conf
IGARSS
Ferdinando Nunziata, Maurizio Migliaccio, Xiaofeng Li
2012 J jnl
IEEE Trans. Geosci. Remote. Sens.
Biao Zhang, William Perrie, Paris W. Vachon, Xiaofeng Li, William Pichel, Jie Guo, Yijun He
2012 C conf
IGARSS
Xiaofeng Li, Jun A. Zhang, Xiaofeng Yang, William Pichel, Mark DeMaria, David G. Long, Ziwei Li
2012 C conf
IGARSS
Xiaofeng Yang, Xiaofeng Li, Ziwei Li, William Pichel, Yang Yu
2012 C conf
IGARSS
Xiaofeng Li, Xiaofeng Yang, William Pichel
2011 J jnl
IEEE Trans. Geosci. Remote. Sens.
Maurizio Migliaccio, Ferdinando Nunziata, Antonio Montuori, Xiaofeng Li, William Pichel
2011 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiaofeng Yang, Xiaofeng Li, William Pichel, Ziwei Li
2011 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xiaofeng Yang, Xiaofeng Li, Quanan Zheng, Xingfa Gu, William Pichel, Ziwei Li
2011 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xianwen Ding, Xiaofeng Li
2011 C conf
IGARSS
William Pichel, Frank M. Monaldo, Christopher R. Jackson, Xiaofeng Li, John Sapper, Xiaofeng Yang
2011 C conf
IGARSS
Xiaofeng Li, Weizhong Zheng, Xiaofeng Yang, William Pichel, Ziwei Li
2011 C conf
IGARSS
Xiaofeng Yang, Xiaofeng Li, Ziwei Li, William Pichel
2010 C conf
IGARSS
Ferdinando Nunziata, Xiaofeng Li, Maurizio Migliaccio, Antonio Montuori, William Pichel
2010 C conf
IGARSS
Xiaofeng Li, William Pichel, Xiaofeng Yang
2009 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiaofeng Li, Chunyan Li, Qing Xu, William Pichel
2008 C conf
GMP
Jun A. Zhang, Bangping Wang, Xiaofeng Li
2008 conf
IGARSS (2)
William Pichel, Xiaofeng Li, Frank M. Monaldo, Todd Sikora, Christopher R. Jackson
2004 C conf
IGARSS
Xiaofeng Li, Weizhong Zheng, William Pichel, Cheng-Zhi Zou, Pablo Clemente-Colon, Karen S. Friedman
2004 C conf
IGARSS
Karen S. Friedman, Xiaofeng Li, William Pichel, Pablo Clemente-Colon, Nan Walker, Tim Veenstra
2004 C conf
IGARSS
William Pichel, Xiaofeng Li, Karen S. Friedman, Pablo Clemente-Colon, Robert C. Beal, Frank M. Monaldo, Christopher C. Wackerman
2002 C conf
IGARSS
Karen S. Friedman, William G. Pichel, Pablo Clemente-Colon, Xiaofeng Li
2002 C conf
IGARSS
William G. Pichel, Pablo Clemente-Colon, Karen S. Friedman, Xiaofeng Li, William Tseng, Francis M. Monaldo, Robert C. Beal, Christopher C. Wackerman
2002 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiaofeng Li, William Pichel, Mingxia He, Sunny Y. Wu, Karen S. Friedman, Pablo Clemente-Colon, Chaofang Zhao
2002 C conf
IGARSS
Xiaofeng Li, Pablo Clemente-Colon, William G. Pichel, Karen S. Friedman
redb/extractors/pe_extractors/pe_dotnet.py
← Index redb/extractors/pe_extractors/pe_dotnet.py python
import inspect
import pefile
from dotnetfile import DotNetPE

import base64
from hashlib import md5
from pprint import pprint

import magic
import pefile

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PEDotNet
from datetime import datetime, timezone
import json
from typing import Any


class PEDotNetExtractor(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.pe_features = None
        self.elastic_index = self.index_prefix + "-pe_dotnet"
        self.dotnet, self.error = self._generate_dotnetfile_object()
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _decode_assembly_flags(self, flag_value):
        self.log.debug(inspect.currentframe().f_code.co_name)
        ASSEMBLY_FLAGS = {
            0x00000001: "COMIMAGE_FLAGS_ILONLY",
            0x00000002: "COMIMAGE_FLAGS_32BITREQUIRED",
            0x00000004: "COMIMAGE_FLAGS_IL_LIBRARY",
            0x00000008: "COMIMAGE_FLAGS_STRONGNAMESIGNED",
            0x00000010: "COMIMAGE_FLAGS_NATIVE_ENTRYPOINT",
            0x00010000: "COMIMAGE_FLAGS_TRACKDEBUGDATA",
            0x00020000: "COMIMAGE_FLAGS_32BITPREFERRED",
        }
        flags = []
        for bit, name in ASSEMBLY_FLAGS.items():
            if flag_value & bit:
                flags.append(name)
        return flags

    def _normalize_data(self, data):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if isinstance(data, str):
            return {"value": data}
        return data

    def _compute_md5(self, data):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if isinstance(data, str):
            # If it's a string, encode it to first
            return md5(data.encode("raw_unicode_escape")).hexdigest()
        elif not isinstance(data, bytes):
            # If it's neither string nor bytes, convert it to string and then to bytes
            return md5(str(data).encode("raw_unicode_escape")).hexdigest()
        else:
            return md5(data).hexdigest()

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

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        metadata = {}

        if self.error:
            metadata["Corrupted"] = self.error.args[0]
            dotnet = PEDotNet(metadata)
            self.dotnet = dotnet  # Store for later use in prepare_export_data
            return dotnet  # Return the extracted data instead of exporting directly

        metadata["info"] = {}
        try:
            available_tables = self.dotnet.existent_metadata_tables()
        except Exception as e:
            self.log.error(f"Error getting metadata tables for {self.hash.sha256}: {e}")
            available_tables = []
            metadata["info"]["PotentiallyCorrupted"] = True

        # GUID extraction
        try:
            input_string = self.dotnet.guid_stream_guids[0].string_representation
            
            formatted_uuid = (
                f"{input_string[6:8]}{input_string[4:6]}{input_string[2:4]}{input_string[0:2]}"
                f"-{input_string[10:12]}{input_string[8:10]}"
                f"-{input_string[14:16]}{input_string[12:14]}"
                f"-{input_string[16:20]}"
                f"-{input_string[20:]}"
            )
            metadata["info"]["ModuleVersionID"] = formatted_uuid
        except Exception as e:
            self.log.error(f"Error extracting GUID for {self.hash.sha256}: {e}")

        # CLR Version
        try:
            metadata["info"]["CLRversion"] = self.dotnet.get_runtime_target_version()
        except Exception as e:
            self.log.error(f"Error getting CLR version for {self.hash.sha256}: {e}")

        # Module information
        try:
            if self.dotnet.metadata_table_exists("Module"):
                metadata["info"]["AssemblyModuleName"] = self.dotnet.Module.get_module_name()
        except Exception as e:
            self.log.error(f"Error getting module info for {self.hash.sha256}: {e}")

        # Basic properties
        try:
            metadata["info"].update({
                "IsNativeNgenImage": self.dotnet.is_native_image(),
                "IsMixedAssembly": self.dotnet.is_mixed_assembly(),
                "IsWindowsFormsApp": self.dotnet.is_windows_forms_app(),
                "EntryPointToken": self.dotnet.clr_header.EntryPointToken.value,
                "HasNativeEntryPoint": self.dotnet.has_native_entry_point(),
            })
        except Exception as e:
            self.log.error(f"Error getting basic properties for {self.hash.sha256}: {e}")

        # Assembly flags
        try:
            metadata["info"]["AssemblyFlags"] = self._decode_assembly_flags(
                self.dotnet.clr_header.Flags.value
            )
        except Exception as e:
            self.log.error(f"Error getting assembly flags for {self.hash.sha256}: {e}")

        # More Metadata/Info CLR Header
        try:
            metadata["info"]["NumOfStreams"] = self.dotnet.get_number_of_streams()
            # [TODO] The following two on VT are "RVA entry point"
            #  and "Resources va" respectively. To verify.
            metadata["info"][
                "ResourcesDirectoryAddress"
            ] = self.dotnet.clr_header.ResourcesDirectoryAddress.value
            metadata["info"][
                "ResourcesDirectorySize"
            ] = self.dotnet.clr_header.ResourcesDirectorySize.value
            metadata["info"][
                "StrongNameSignatureAddress"
            ] = self.dotnet.clr_header.StrongNameSignatureAddress.value
            metadata["info"][
                "StrongNameSignatureSize"
            ] = self.dotnet.clr_header.StrongNameSignatureSize.value
            metadata["info"][
                "CodeManagerTableAddress"
            ] = self.dotnet.clr_header.CodeManagerTableAddress.value
            metadata["info"][
                "CodeManagerTableSize"
            ] = self.dotnet.clr_header.CodeManagerTableSize.value
            metadata["info"][
                "VTableFixupsAddress"
            ] = self.dotnet.clr_header.VTableFixupsAddress.value
            metadata["info"][
                "VTableFixupsSize"
            ] = self.dotnet.clr_header.VTableFixupsSize.value
            metadata["info"][
                "ExportAddressTableJumpsAddress"
            ] = self.dotnet.clr_header.ExportAddressTableJumpsAddress.value
            metadata["info"][
                "ExportAddressTableJumpsSize"
            ] = self.dotnet.clr_header.ExportAddressTableJumpsSize.value
            metadata["info"][
                "ManagedNativeHeaderAddress"
            ] = self.dotnet.clr_header.ManagedNativeHeaderAddress.value
            metadata["info"][
                "ManagedNativeHeaderSize"
            ] = self.dotnet.clr_header.ManagedNativeHeaderSize.value
        except Exception as e:
            self.log.error(f"Error getting more metadata/info clr header for {self.hash.sha256}: {e}")

        # Streams section
        try:
            metadata["Streams"] = {}
            stream_names = self.dotnet.get_stream_names()
            for name in stream_names:
                indx = stream_names.index(name)
                stream_header = self.dotnet.dotnet_stream_headers[indx]
                stream_address = self.dotnet.dotnet_streams[indx].address
                metadata["Streams"][name] = {}
                metadata["Streams"][name]["raw_name"] = base64.b64encode(
                    stream_header.Name.value
                ).decode()
                # metadata["Streams"][name]["raw_name"] = name
                metadata["Streams"][name]["size"] = stream_header.Size.value
                # Retrieve the stream data directly using the given address and size
                stream_data = self.pe.get_data(stream_address, stream_header.Size.value)
                metadata["Streams"][name]["entropy"] = (
                    "%.2f" % pefile.SectionStructure.entropy_H(self.pe, stream_data)
                )
                metadata["Streams"][name]["md5"] = md5(stream_data).hexdigest()
        except Exception as e:
            self.log.error(f"Error getting streams for {self.hash.sha256}: {e}")

        # ManifestResource
        try:
            metadata["ManifestResource"] = ()
            if "ManifestResource" in available_tables:
                metadata["info"]["HasManifestResource"] = True
                metadata["ManifestResource"] = (
                    self.dotnet.ManifestResource.get_resource_names()
                )
        except Exception as e:
            self.log.error(f"Error getting manifest resource for {self.hash.sha256}: {e}")

        # ExternalAssemblyRef
        try:
            metadata["ExternalAssemblyRef"] = {}
            if "AssemblyRef" in available_tables:
                metadata["ExternalAssemblyRef"][
                    "names"
                ] = self.dotnet.AssemblyRef.get_assemblyref_names()
                metadata["ExternalAssemblyRef"][
                    "cultures"
                ] = self.dotnet.AssemblyRef.get_assemblyref_cultures()
        except Exception as e:
            self.log.error(f"Error getting external assembly ref for {self.hash.sha256}: {e}")

        # AssemblyData
        try:
            metadata["AssemblyData"] = {}
            if "Assembly" in available_tables:
                metadata["AssemblyData"][
                    "name"
                ] = self.dotnet.Assembly.get_assembly_name()
                # It's officially a one-row table, but there are ITW files with more than one row.
                # It stores information about the current assembly. It is documented in ECMA-335.
                assembly_table = self.dotnet.metadata_tables_lookup[
                    "Assembly"
                ].table_rows[0]
                metadata["AssemblyData"][
                    "MajorVersion"
                ] = assembly_table.MajorVersion.value
                metadata["AssemblyData"][
                    "MinorVersion"
                ] = assembly_table.MinorVersion.value
                metadata["AssemblyData"]["hashalgid"] = assembly_table.HashAlgId.value
                metadata["AssemblyData"][
                    "BuildNumber"
                ] = assembly_table.BuildNumber.value
                metadata["AssemblyData"][
                    "RevisionNumber"
                ] = assembly_table.RevisionNumber.value
                metadata["AssemblyData"][
                    "culture"
                ] = self.dotnet.Assembly.get_assembly_culture()
        except Exception as e:
            self.log.error(f"Error getting assembly data for {self.hash.sha256}: {e}")

        # TypeDef handling
        try:
            metadata["TypeDef"] = {}
            if "TypeDef" in available_tables:
                metadata["info"]["HasTypeDef"] = True
                # Get basic type definitions
                try:
                    # Get all types (ANY visibility)
                    type_defs = self.dotnet.TypeDef.get_type_names()
                    metadata["TypeDef"]["names"] = type_defs if type_defs else []
                    
                    # Get detailed type information with methods
                    types_with_methods = self.dotnet.TypeDef.get_type_names_with_methods()
                    if types_with_methods:
                        metadata["TypeDef"]["detailed"] = []
                        for type_info in types_with_methods:
                            type_data = {
                                "type": type_info.Type,
                                "namespace": type_info.Namespace,
                                "flags": type_info.Flags,
                                "methods": []
                            }
                            for method in type_info.Methods:
                                method_data = {
                                    "name": method.Name,
                                    "flags": method.Flags
                                }
                                if method.Signature:
                                    method_data["signature"] = {
                                        "parameters": method.Signature.get("parameter", []),
                                        "return_type": method.Signature.get("return", ""),
                                        "has_this": method.Signature.get("hasthis", False)
                                    }
                                type_data["methods"].append(method_data)
                            metadata["TypeDef"]["detailed"].append(type_data)
                except AttributeError as e:
                    self.log.warning(f"TypeDef table exists but attributes missing for {self.hash.sha256}: {e}")
                    # metadata["info"]["TypeDefParsingError"] = f"Missing attributes: {str(e)}"
                except Exception as e:
                    self.log.error(f"Error parsing TypeDef table for {self.hash.sha256}: {e}")
                    # metadata["info"]["TypeDefParsingError"] = str(e)
        except Exception as e:
            self.log.error(f"Error handling TypeDef section for {self.hash.sha256}: {e}")
            metadata["TypeDef"] = {"names": [], "detailed": []}
            # metadata["info"]["TypeDefParsingError"] = str(e)

        # ExternalUnmanagedModules
        try:
            metadata["ExternalUnmanagedModules"] = ()
            if "ModuleRef" in available_tables:
                metadata["info"]["HasModuleRef"] = True
                metadata["ExternalUnmanagedModules"] = (
                    self.dotnet.ModuleRef.get_unmanaged_module_names(
                        self.dotnet.Type.UnmanagedModules.RAW
                    )
                )
        except Exception as e:
            self.log.error(f"Error getting external unmanaged modules for {self.hash.sha256}: {e}")

        # ExternalUnmanagedMethods
        try:
            metadata["ExternalUnmanagedMethods"] = ()
            if "ImplMap" in available_tables:
                metadata["info"]["HasImplMap"] = True
                metadata["ExternalUnmanagedMethods"] = (
                    self.dotnet.ImplMap.get_unmanaged_functions()
                )
        except Exception as e:
            self.log.error(f"Error getting external unmanaged methods for {self.hash.sha256}: {e}")

        # Event
        try:
            metadata["Event"] = ()
            if "Event" in available_tables:
                metadata["info"]["HasEvent"] = True
                metadata["Event"] = self.dotnet.Event.get_event_names()
        except Exception as e:
            self.log.error(f"Error getting event for {self.hash.sha256}: {e}")

        # Resources
        try:
            metadata["Resources"] = []
            if self.dotnet.has_resources():
                tmp_resources_list = []
                resource_data = self.dotnet.get_resources()
                for data in resource_data:
                    tmp_dict = {}
                    for resource_item in data.items():
                        if resource_item[0] == "SubResources":
                            if resource_item[1]:
                                tmp_dict["SubResources"] = {}
                                for sub_resource in resource_item[1]:
                                    for sub_resource_item in sub_resource.items():
                                        if sub_resource_item[0] == "Data":
                                            # Check if data is a sequence type that supports len()
                                            if hasattr(sub_resource_item[1], '__len__') and len(sub_resource_item[1]) > 100:
                                                tmp_dict["SubResources"]["Data"] = {}
                                                try:
                                                    # tmp_dict["SubResources"]["Data"][
                                                    #     "md5"
                                                    # ] = md5(
                                                    #     sub_resource_item[1].encode()
                                                    # ).hexdigest()
                                                    tmp_dict["SubResources"]["Data"][
                                                        "md5"
                                                    ] = self._compute_md5(
                                                        sub_resource_item[1]
                                                    )
                                                except Exception as e:
                                                    self.log.error(
                                                        f"Error in dotnet resources"
                                                        f" extraction {self.hash.sha256}: {e}"
                                                    )
                                                guess = magic.from_buffer(
                                                    sub_resource_item[1], mime=True
                                                )
                                                tmp_dict["SubResources"]["Data"][
                                                    "MimeType"
                                                ] = (guess if guess else None)
                                            else:
                                                normalized_data = self._normalize_data(
                                                    sub_resource_item[1].decode()
                                                    if isinstance(
                                                        sub_resource_item[1], bytes
                                                    )
                                                    else sub_resource_item[1]
                                                )
                                                tmp_dict["SubResources"][
                                                    sub_resource_item[0]
                                                ] = normalized_data
                                        else:
                                            tmp_dict["SubResources"][
                                                sub_resource_item[0]
                                            ] = (
                                                sub_resource_item[1].decode()
                                                if isinstance(
                                                    sub_resource_item[1], bytes
                                                )
                                                else sub_resource_item[1]
                                            )
                        elif resource_item[0] == "Data":
                            # Check if data is a sequence type that supports len()
                            if hasattr(resource_item[1], '__len__') and len(resource_item[1]) > 100:
                                tmp_dict["Data"] = {}
                                tmp_dict["Data"]["md5"] = self._compute_md5(
                                    resource_item[1]
                                )
                                guess = magic.from_buffer(resource_item[1], mime=True)
                                tmp_dict["Data"]["MimeType"] = guess if guess else None
                            else:
                                normalized_data = self._normalize_data(
                                    resource_item[1].decode()
                                    if isinstance(resource_item[1], bytes)
                                    else resource_item[1]
                                )
                                tmp_dict["Data"] = normalized_data
                        else:
                            tmp_dict[resource_item[0]] = (
                                resource_item[1].decode()
                                if isinstance(resource_item[1], bytes)
                                else resource_item[1]
                            )
                    tmp_resources_list.append(tmp_dict)
                metadata["Resources"] = tmp_resources_list
        except Exception as e:
            self.log.error(f"Error getting resources for {self.hash.sha256}: {e}")
            metadata["Resources"] = []  # Ensure we always have a valid list even on error

        dotnet = PEDotNet(metadata)
        self.dotnet = dotnet  # Store for later use in prepare_export_data
        return dotnet  # Return the extracted data instead of exporting directly


    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.dotnet
        elif exporter_type == "ClickHouseExporter":
            # Convert metadata to JSON string
            metadata_json = json.dumps(self.dotnet.dotnet)
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                metadata_json,
                datetime.now(timezone.utc)
            ]]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'dotnet', 'analysis_date'
            ]
            
            if not data:
                return None

            column_type_names = [
                'String', 'String', 'String', 'JSON', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

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