Hadi Amirpour

138 papers A* 10A 11B 14C 25Misc 5Journal 49Unranked 21
YearRankTypeTitle / Venue / Authors
2026 J jnl
Expert Syst. Appl.
Mohammad Ghasempour, Yuan Yuan, Hadi Amirpour, Hongjie He, Christian Timmerer
2026 J jnl
CoRR
Jingwen Zhu, Hadi Amirpour, Wei Zhou, Patrick Le Callet
2026 J jnl
CoRR
Wei Zhou, Yixiao Li, Hadi Amirpour, Xiaoshuai Hao, Jiang Liu, Peng Wang, Hantao Liu
2025 J jnl
Signal Process. Image Commun.
Ahmed Telili, Wassim Hamidouche, Ibrahim Farhat, Hadi Amirpour, Christian Timmerer, Ibrahim Khadraoui, Jiajie Lu, The Van Le, Jeonneung Baek, Jin Young Lee, Yiying Wei, Xiaopeng Sun, Yu Gao, Jiancheng Huang, Yujie Zhong
2025 conf
ICCVW
MohammadAli Hamidi, Hadi Amirpour, Luigi Atzori, Christian Timmerer
2025 J jnl
CoRR
MohammadAli Hamidi, Hadi Amirpour, Luigi Atzori, Christian Timmerer
2025 C conf
ISCAS
Yirui Zeng, Jun Fu, Hadi Amirpour, Huasheng Wang, Guanghui Yue, Hantao Liu, Ying Chen, Wei Zhou
2025 J jnl
CoRR
Yirui Zeng, Jun Fu, Hadi Amirpour, Huasheng Wang, Guanghui Yue, Hantao Liu, Ying Chen, Wei Zhou
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Ahmed Telili, Wassim Hamidouche, Hadi Amirpour, Sid Ahmed Fezza, Christian Timmerer, Luce Morin
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Fan Chen, Lingfeng Qu, Hadi Amirpour, Christian Timmerer, Hongjie He
2025 J jnl
CoRR
Yuqing Luo, Yixiao Li, Jiang Liu, Jun Fu, Hadi Amirpour, Guanghui Yue, Baoquan Zhao, Padraig Corcoran, Hantao Liu, Wei Zhou
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hadi Amirpour, M. Ghanbari, Christian Timmerer
2025 A* conf
ACM Multimedia
Hadi Amirpour, Doris Putzgruber-Adamitsch, Klaus Schoeffmann
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Christian Timmerer, Hadi Amirpour, Farzad Tashtarian, Samira Afzal, Amr Rizk, Michael Zink, Hermann Hellwagner
2025 C conf
ISCAS
Kamran Qureshi, Hadi Amirpour, Christian Timmerer
2025 J jnl
CoRR
Kamran Qureshi, Hadi Amirpour, Christian Timmerer
2025 C conf
VCIP
Afshin Gholami, Hadi Amirpour, Christian Timmerer
2025 C conf
VCIP
Jingwen Zhu, Hadi Amirpour, Wei Zhou, Patrick Le Callet
2025 J jnl
IEEE Trans. Multim.
Yuan Yuan, Hongjie He, Yaolin Yang, Hadi Amirpour, Christian Timmerer, Fan Chen
2025 A* conf
ACM Multimedia
Wei Zhou, Hadi Amirpour, Li Yu, Jungong Han, Richang Hong, Paul L. Rosin
2025 C conf
PCS
Kamran Qureshi, Hadi Amirpour, Christian Timmerer
2025 C conf
ISCAS
Kamran Qureshi, Hadi Amirpour, Christian Timmerer
2025 J jnl
CoRR
Kamran Qureshi, Hadi Amirpour, Christian Timmerer
2025 A* conf
ACM Multimedia
Mohammad Ghasempour, Hadi Amirpour, Christian Timmerer
2025 A conf
ICME
Yiying Wei, Hadi Amirpour, Christian Timmerer
2025 C conf
VCIP
MohammadAli Hamidi, Hadi Amirpour, Christian Timmerer, Luigi Atzori
2025 conf
IXR@MM
Afshin Gholami, Sara Baldoni, Federica Battisti, Wei Zhou, Christian Timmerer, Hadi Amirpour
2025 A* conf
ACM Multimedia
Wei Zhou, Hadi Amirpour
2025 J jnl
CoRR
Wei Zhou, Hadi Amirpour, Christian Timmerer, Guangtao Zhai, Patrick Le Callet, Alan C. Bovik
2025 ed.
MCHM@MM
Wei Zhou, Hadi Amirpour, Li Yu, Jungong Han, Richang Hong, Paul L. Rosin
2025 J jnl
IEEE J. Emerg. Sel. Topics Circuits Syst.
Mohammad Ghasempour, Hadi Amirpour, Christian Timmerer
2025 C conf
PCS
Ayman Alkhateeb, Hadi Amirpour, Christian Timmerer
2025 A* conf
ACM Multimedia
Milad Ghanbari, Wei Zhou, Cosmin Stejerean, Christian Timmerer, Hadi Amirpour
2025 C conf
VCIP
Milad Ghanbari, Hadi Amirpour, Christian Timmerer, M. H. Izadimehr, Wei Zhou, Cosmin Stejerean
2025 A* conf
ACM Multimedia
Mohammad Hossein Izadimehr, Milad Ghanbari, Guodong Chen, Wei Zhou, Xiaoshuai Hao, Mallesham Dasari, Christian Timmerer, Hadi Amirpour
2025 J jnl
CoRR
M. H. Izadimehr, Milad Ghanbari, Guodong Chen, Wei Zhou, Xiaoshuai Hao, Mallesham Dasari, Christian Timmerer, Hadi Amirpour
2025 J jnl
Displays
Yixiao Li, Xiaoyuan Yang, Yuqing Luo, Hadi Amirpour, Hantao Liu, Wei Zhou
2025 C conf
VCIP
Pengfei Chen, Wenqi Fei, Xinrui Xu, Yuhua Zhang, MohammadAli Hamidi, Hadi Amirpour, Erjia Xiao, Lingfeng Zhang, Zhenjie Su, Hao Cheng, Yu Liu, Wei Zhou, Yanbiao Ma, Renjing Xu, Long Chen, Xiaoshuai Hao, Yipo Huang, Tushar Shinde
2025 J jnl
IEEE Trans. Multim.
Hadi Amirpour, Jingwen Zhu, Wei Zhou, Patrick Le Callet, Christian Timmerer
2025 conf
ICCVW
Sizhuo Ma, Wei-Ting Chen, Qiang Gao, Jian Wang, Chris Wei Zhou, Wei Sun, Weixia Zhang, Linhan Cao, Jun Jia, Xiangyang Zhu, Dandan Zhu, Xiongkuo Min, Guangtao Zhai, Baoying Chen, Xiongwei Xiao, Jishen Zeng, Wei Wu, Tiexuan Lou, Yuchen Tan, Chunyi Song, Zhiwei Xu, MohammadAli Hamidi, Hadi Amirpour, Mingyin Bai, Jiawang Du, Zhenyu Jiang, Zilong Lu, Ziguan Cui, Zongliang Gan, Xinpeng Li, Shiqi Jiang, Chenhui Li, Changbo Wang, Weijun Yuan, Zhan Li, Yihang Chen, Yifan Deng, Ruting Deng, Zhanglu Chen, Boyang Yao, Shuling Zheng, Feng Zhang, Zhiheng Fu, Abhishek Joshi, Aman Agarwal, Rakhil Immidisetti, Ajay Narasimha Mopidevi, Vishwajeet Shukla, Hao Yang, Ruikun Zhang, Liyuan Pan, Kaixin Deng, Hang Ouyang, Fan Yang, Zhizun Luo, Zhuohang Shi, Songning Lai, Weilin Ruan, Yutao Yue
2025 J jnl
CoRR
Sizhuo Ma, Wei-Ting Chen, Qiang Gao, Jian Wang, Chris Wei Zhou, Wei Sun, Weixia Zhang, Linhan Cao, Jun Jia, Xiangyang Zhu, Dandan Zhu, Xiongkuo Min, Guangtao Zhai, Baoying Chen, Xiongwei Xiao, Jishen Zeng, Wei Wu, Tiexuan Lou, Yuchen Tan, Chunyi Song, Zhiwei Xu, MohammadAli Hamidi, Hadi Amirpour, Mingyin Bai, Jiawang Du, Zhenyu Jiang, Zilong Lu, Ziguan Cui, Zongliang Gan, Xinpeng Li, Shiqi Jiang, Chenhui Li, Changbo Wang, Weijun Yuan, Zhan Li, Yihang Chen, Yifan Deng, Ruting Deng, Zhanglu Chen, Boyang Yao, Shuling Zheng, Feng Zhang, Zhiheng Fu, Abhishek Joshi, Aman Agarwal, Rakhil Immidisetti, Ajay Narasimha Mopidevi, Vishwajeet Shukla, Hao Yang, Ruikun Zhang, Liyuan Pan, Kaixin Deng, Hang Ouyang, Fan Yang, Zhizun Luo, Zhuohang Shi, Songning Lai, Weilin Ruan, Yutao Yue
2025 conf
ICCVW
Yixiao Li, Xin Li, Chris Wei Zhou, Shuo Xing, Hadi Amirpour, Xiaoshuai Hao, Guanghui Yue, Baoquan Zhao, Weide Liu, Xiaoyuan Yang, Zhengzhong Tu, Xinyu Li, Chuanbiao Song, Chenqi Zhang, Jun Lan, Huijia Zhu, Weiqiang Wang, Xiaoyan Sun, Shishun Tian, Dongyang Yan, Weixia Zhang, Junlin Chen, Wei Sun, Zhihua Wang, Zhuohang Shi, Zhizun Luo, Hang Ouyang, Tianxin Xiao, Fan Yang, Zhaowang Wu, Kaixin Deng
2025 J jnl
CoRR
Yixiao Li, Xin Li, Chris Wei Zhou, Shuo Xing, Hadi Amirpour, Xiaoshuai Hao, Guanghui Yue, Baoquan Zhao, Weide Liu, Xiaoyuan Yang, Zhengzhong Tu, Xinyu Li, Chuanbiao Song, Chenqi Zhang, Jun Lan, Huijia Zhu, Weiqiang Wang, Xiaoyan Sun, Shishun Tian, Dongyang Yan, Weixia Zhang, Junlin Chen, Wei Sun, Zhihua Wang, Zhuohang Shi, Zhizun Luo, Hang Ouyang, Tianxin Xiao, Fan Yang, Zhaowang Wu, Kaixin Deng
2025 J jnl
CoRR
Xuecheng Wu, Dingkang Yang, Danlei Huang, Xinyi Yin, Yifan Wang, Jia Zhang, Jiayu Nie, Liangyu Fu, Yang Liu, Junxiao Xue, Hadi Amirpour, Wei Zhou
2024 Misc conf
ICASSP
Hadi Amirpour, Jingwen Zhu, Patrick Le Callet, Christian Timmerer
2024 J jnl
CoRR
Samira Afzal, Narges Mehran, Zoha Azimi Ourimi, Farzad Tashtarian, Hadi Amirpour, Radu Prodan, Christian Timmerer
2024 Misc conf
NSDI
Farzad Tashtarian, Abdelhak Bentaleb, Hadi Amirpour, Sergey Gorinsky, Junchen Jiang, Hermann Hellwagner, Christian Timmerer
2024 C conf
PCS
Jingwen Zhu, Hadi Amirpour, Raimund Schatz, Patrick Le Callet, Christian Timmerer
2024 A conf
MMSys
Farzad Tashtarian, Daniele Lorenzi, Hadi Amirpour, Samira Afzal, Christian Timmerer
2024 C conf
VCIP
Annalisa Gallina, Hadi Amirpour, Sara Baldoni, Giuseppe Valenzise, Federica Battisti
2024 conf
EUSIPCO
Mohammad Ghasempour, Yiying Wei, Hadi Amirpour, Christian Timmerer
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hadi Amirpour, Klaus Schoeffmann, Mohammad Ghanbari, Christian Timmerer
2024 J jnl
CoRR
Yiying Wei, Hadi Amirpour, Jong Hwan Ko, Christian Timmerer
2024 A conf
MMSys
Hadi Amirpour, Mohammad Ghasempour, Lingfeng Qu, Wassim Hamidouche, Christian Timmerer
2024 Misc conf
ICASSP
Mohammad Ghasempour, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2024 J jnl
IEEE Access
Mohammad Ghasempour, Hadi Amirpour, Christian Timmerer
2024 C conf
VCIP
Hadi Amirpour, Lingfeng Qu, Jong Hwan Ko, Cosmin Stejerean, Christian Timmerer
2024 B conf
DCC
Hadi Amirpour, Jingwen Zhu, Raimund Schatz, Patrick Le Callet, Christian Timmerer
2024 J jnl
IEEE Internet Things J.
Yuan Yuan, Hongjie He, Hadi Amirpour, Lingfeng Qu, Christian Timmerer, Fan Chen
2024 C conf
VCIP
Hadi Amirpour, Mohammad Ghasempour, Farzad Tashtarian, Ahmed Telili, Samira Afzal, Wassim Hamidouche, Christian Timmerer
2024 B conf
ICIP
Ahmed Telili, Ibrahim Farhat, Wassim Hamidouche, Hadi Amirpour
2024 J jnl
Multim. Tools Appl.
Minh Nguyen, Hadi Amirpour, Farzad Tashtarian, Christian Timmerer, Hermann Hellwagner
2024 J jnl
Signal Process.
Lingfeng Qu, Hui Lu, Peng Chen, Hadi Amirpour, Christian Timmerer
2024 A conf
MMSys
Sandro Linder, Samira Afzal, Christian Bauer, Hadi Amirpour, Radu Prodan, Christian Timmerer
2024 conf
EUSIPCO
Yiying Wei, Hadi Amirpour, Ahmed Telili, Wassim Hamidouche, Guo Lu, Christian Timmerer
2023 J jnl
IEEE Commun. Surv. Tutorials
Jeroen van der Hooft, Hadi Amirpour, Maria Torres Vega, Yago Sanchez, Raimund Schatz, Thomas Schierl, Christian Timmerer
2023 J jnl
IEEE Trans. Netw. Serv. Manag.
Alireza R. Erfanian, Hadi Amirpour, Farzad Tashtarian, Christian Timmerer, Hermann Hellwagner
2023 C conf
VCIP
Lingfeng Qu, Hongjie He, Hadi Amirpour, Mohammed Ghanbari, Christian Timmerer
2023 J jnl
IEEE Trans. Multim.
Haichao Yao, Rongrong Ni, Hadi Amirpour, Christian Timmerer, Yao Zhao
2023 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Vignesh V. Menon, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2023 conf
MHV
Jingwen Zhu, Hadi Amirpour, Vignesh V. Menon, Raimund Schatz, Patrick Le Callet
2023 C conf
VCIP
Jingwen Zhu, Hadi Amirpour, Raimund Schatz, Christian Timmerer, Patrick Le Callet
2023 A* conf
ACM Multimedia
Irene Viola, Hadi Amirpour, Stephanie Arévalo Arboleda, Maria Torres Vega
2023 A conf
ICME
Vignesh V. Menon, Jingwen Zhu, Prajit T. Rajendran, Hadi Amirpour, Patrick Le Callet, Christian Timmerer
2023 J jnl
CoRR
Vignesh V. Menon, Jingwen Zhu, Prajit T. Rajendran, Hadi Amirpour, Patrick Le Callet, Christian Timmerer
2023 B conf
NOMS
Farzad Tashtarian, Abdelhak Bentaleb, Hadi Amirpour, Babak Taraghi, Christian Timmerer, Hermann Hellwagner, Roger Zimmermann
2023 conf
MMM (2)
Daniele Lorenzi, Farzad Tashtarian, Hadi Amirpour, Christian Timmerer, Hermann Hellwagner
2023 A conf
ICME
Hadi Amirpour, Vignesh V. Menon, Samira Afzal, Radu Prodan, Christian Timmerer
2023 C conf
VCIP
Yiqun Liu, Hadi Amirpour, Mohsen Abdoli, Christian Timmerer, Thomas Guionnet
2023 J jnl
CoRR
Yiqun Liu, Hadi Amirpour, Mohsen Abdoli, Christian Timmerer, Thomas Guionnet
2023 ed.
IXR@MM
Hadi Amirpour, Irene Viola, Maria Torres Vega, Stephanie Arévalo Arboleda
2023 J jnl
Signal Process.
Ningxiong Mao, Hongjie He, Fan Chen, Lingfeng Qu, Hadi Amirpour, Christian Timmerer
2022 J jnl
IEEE Trans. Image Process.
Hadi Amirpour, Christine Guillemot, Mohammed Ghanbari, Christian Timmerer
2022 B conf
QoMEX
Hadi Amirpour, Raimund Schatz, Christian Timmerer
2022 B conf
DCC
Vignesh V. Menon, Hadi Amirpour, Mohammed Ghanbari, Christian Timmerer
2022 C conf
PCS
Vignesh V. Menon, Hadi Amirpour, Prajit T. Rajendran, Mohammed Ghanbari, Christian Timmerer
2022 J jnl
CoRR
Vignesh V. Menon, Hadi Amirpour, Prajit T. Rajendran, Mohammad Ghanbari, Christian Timmerer
2022 B conf
ICIP
Vignesh V. Menon, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2022 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Hadi Amirpour, António M. G. Pinheiro, Manuela Pereira, Fernando J. P. Lopes, Mohammed Ghanbari
2022 conf
MHV
Vignesh V. Menon, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2022 J jnl
CoRR
Hadi Amirpour, Vignesh V. Menon, Ekrem Çetinkaya, Adithyan Ilangovan, Christian Feldmann, Martin Smole, Christian Timmerer
2022 conf
EUVIP
Hadi Amirpour, Christine Guillemot, Christian Timmerer
2022 A* conf
ACM Multimedia
Irene Viola, Hadi Amirpour, Maria Torres Vega
2022 ed.
IXR@MM
Hadi Amirpour, Irene Viola, Maria Torres Vega
2022 conf
ICME Workshops
Ekrem Çetinkaya, Hadi Amirpour, Christian Timmerer
2022 C conf
MMSP
Hadi Amirpour, Prajit T. Rajendran, Vignesh V. Menon, Mohammed Ghanbari, Christian Timmerer
2022 A conf
MMSys
Babak Taraghi, Hadi Amirpour, Christian Timmerer
2022 conf
ICME Workshops
Vignesh V. Menon, Hadi Amirpour, Christian Feldmann, Mohammad Ghanbari, Christian Timmerer
2022 Misc conf
ICASSP
Vignesh V. Menon, Hadi Amirpour, Mohammed Ghanbari, Christian Timmerer
2022 A conf
ICME
Vignesh V. Menon, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2022 J jnl
IEEE Trans. Multim.
Hadi Amirpour, António M. G. Pinheiro, Elsa Susana Reis Fonseca, Mohammed Ghanbari, Manuela Pereira
2022 conf
MHV
Reza Farahani, Hadi Amirpour, Farzad Tashtarian, Abdelhak Bentaleb, Christian Timmerer, Hermann Hellwagner, Roger Zimmermann
2022 C conf
MMSP
Lingfeng Qu, Hadi Amirpour, Mohammed Ghanbari, Christian Timmerer, Hongjie He
2022 A conf
MMSys
Vignesh V. Menon, Christian Feldmann, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2022 A conf
MMSys
Hadi Amirpour, Vignesh V. Menon, Samira Afzal, Mohammad Ghanbari, Christian Timmerer
2022 conf
MHV
Alireza R. Erfanian, Hadi Amirpour, Farzad Tashtarian, Christian Timmerer, Hermann Hellwagner
2021 conf
ICICT (2)
Nakisa Shams, Hadi Amirpour, Christian Timmerer, Mohammad Ghanbari
2021 A* conf
MobiCom
Hannaneh Barahouei Pasandi, Tamer Nadeem, Hadi Amirpour, Christian Timmerer
2021 B conf
LCN
Reza Farahani, Farzad Tashtarian, Hadi Amirpour, Christian Timmerer, Mohammad Ghanbari, Hermann Hellwagner
2021 J jnl
CoRR
Ekrem Çetinkaya, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2021 J jnl
Signal Process. Image Commun.
Ekrem Çetinkaya, Hadi Amirpour, Mohammed Ghanbari, Christian Timmerer
2021 B conf
ICIP
Vignesh V. Menon, Hadi Amirpour, Mohammad Ghanbari, Christian Timmerer
2021 C conf
PCS
Vignesh V. Menon, Hadi Amirpour, Christian Timmerer, Mohammed Ghanbari
2021 C conf
MMSP
Vignesh V. Menon, Hadi Amirpour, Christian Timmerer, Mohammed Ghanbari
2021 C conf
VCIP
Hadi Amirpour, Hannaneh Barahouei Pasandi, Christian Timmerer, Mohammed Ghanbari
2021 J jnl
IEEE Access
Babak Taraghi, Minh Nguyen, Hadi Amirpour, Christian Timmerer
2021 conf
ViSNext@SIGCOMM
Hannaneh Barahouei Pasandi, Hadi Amirpour, Tamer Nadeem, Christian Timmerer
2021 conf
ViSNext@SIGCOMM
Alireza R. Erfanian, Hadi Amirpour, Farzad Tashtarian, Christian Timmerer, Hermann Hellwagner
2021 J jnl
IEEE Access
Alireza R. Erfanian, Hadi Amirpour, Farzad Tashtarian, Christian Timmerer, Hermann Hellwagner
2021 J jnl
CoRR
Hannaneh Barahouei Pasandi, Tamer Nadeem, Hadi Amirpour
2021 C conf
VCIP
Hadi Amirpour, Raimund Schatz, Christian Timmerer, Mohammad Ghanbari
2021 A conf
ICME
Hadi Amirpour, Christian Timmerer, Mohammad Ghanbari
2021 conf
3D Imaging and Applications
Hadi Amirpour, António M. G. Pinheiro, Manuela Pereira, Mohammed Ghanbari
2021 B conf
DCC
Hadi Amirpour, Christian Timmerer, Mohammad Ghanbari
2021 conf
MMM (1)
Hadi Amirpour, Ekrem Çetinkaya, Christian Timmerer, Mohammad Ghanbari
2020 C conf
VCIP
Ekrem Çetinkaya, Hadi Amirpour, Christian Timmerer, Mohammad Ghanbari
2020 B conf
DCC
Hadi Amirpour, Ekrem Çetinkaya, Christian Timmerer, Mohammed Ghanbari
2020 B conf
ICIP
Hadi Amirpour, António M. G. Pinheiro, Elsa Susana Reis Fonseca, Mohammad Ghanbari, Manuela Pereira
2020 A* conf
ACM Multimedia
Negin Ghamsarian, Hadi Amirpour, Christian Timmerer, Mario Taschwer, Klaus Schöffmann
2020 conf
EPIQ@SIGCOMM
Minh Nguyen, Hadi Amirpour, Christian Timmerer, Hermann Hellwagner
2020 conf
ICME Workshops
Hadi Amirpour, Christian Timmerer, Mohammad Ghanbari
2019 B conf
DCC
Hadi Amirpour, António M. G. Pinheiro, Manuela Pereira, Mohammad Ghanbari
2019 J jnl
CoRR
Hadi Amirpour, António M. G. Pinheiro, Manuela Pereira, Mohammad Ghanbari
2019 B conf
DCC
Hadi Amirpour, António M. G. Pinheiro, Manuela Pereira, Fernando J. P. Lopes, Mohammad Ghanbari
2019 J jnl
Multim. Tools Appl.
Hadi Amirpour, Mohammad Ghanbari, António M. G. Pinheiro, Manuela Pereira
2019 Misc conf
ICASSP
Hadi Amirpour, António M. G. Pinheiro, Manuela Pereira, Mohammad Ghanbari
2018 B conf
DCC
Hadi Amirpour, Manuela Pereira, António M. G. Pinheiro
2016 J jnl
Signal Image Video Process.
Hadi Amirpour, Amir Mousavinia
redb/extractors/elf_extractors/elf_features.py
← Index redb/extractors/elf_extractors/elf_features.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFFeatures


class ELFFeaturesExtractor(ELFExtractor):

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

    def _extract_header_data(self):
        """Extract ELF header data using pyelftools."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        def extract_header(elf):
            # Initialize result with safe defaults
            result = {
                'ei_class': 0, 'ei_data': 0, 'ei_version': 0, 'ei_osabi': 0, 'ei_abiversion': 0,
                'e_type': 0, 'e_machine': 0, 'e_version': 0, 'e_entry': 0, 'e_flags': 0,
                'ei_class_str': 'unknown', 'ei_data_str': 'unknown', 'ei_osabi_str': 'unknown',
                'e_type_str': 'unknown', 'e_machine_str': 'unknown'
            }

            # Try to get the main header - if this fails, we can't extract anything
            try:
                header = elf.header
            except Exception as e:
                self.log.warning(f"Could not access ELF header: {e}")
                return result

            # Try to get e_ident section
            ident = None
            try:
                ident = header.get('e_ident', {})
            except Exception as e:
                self.log.warning(f"Could not access e_ident: {e}")

            # Extract EI_CLASS (32/64 bit)
            try:
                if ident:
                    ei_class_raw = ident.get('EI_CLASS', 'ELFCLASSNONE')
                    result['ei_class'] = 2 if ei_class_raw == 'ELFCLASS64' else 1 if ei_class_raw == 'ELFCLASS32' else 0
                    result['ei_class_str'] = '64-bit' if ei_class_raw == 'ELFCLASS64' else '32-bit' if ei_class_raw == 'ELFCLASS32' else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_CLASS: {e}")

            # Extract EI_DATA (endianness)
            try:
                if ident:
                    ei_data_raw = ident.get('EI_DATA', 'ELFDATANONE')
                    result['ei_data'] = 1 if ei_data_raw == 'ELFDATA2LSB' else 2 if ei_data_raw == 'ELFDATA2MSB' else 0
                    result['ei_data_str'] = 'Little-endian' if ei_data_raw == 'ELFDATA2LSB' else 'Big-endian' if ei_data_raw == 'ELFDATA2MSB' else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_DATA: {e}")

            # Extract EI_VERSION
            try:
                if ident:
                    ei_version_raw = ident.get('EI_VERSION', 0)
                    # Convert string like 'EV_CURRENT' to integer
                    if isinstance(ei_version_raw, str):
                        version_map = {'EV_NONE': 0, 'EV_CURRENT': 1}
                        result['ei_version'] = version_map.get(ei_version_raw, 1)
                    else:
                        result['ei_version'] = ei_version_raw
            except Exception as e:
                self.log.warning(f"Could not extract EI_VERSION: {e}")

            # Extract EI_OSABI
            try:
                if ident:
                    ei_osabi_raw = ident.get('EI_OSABI', 'ELFOSABI_SYSV')
                    osabi_map = {
                        'ELFOSABI_SYSV': 0, 'ELFOSABI_HPUX': 1, 'ELFOSABI_NETBSD': 2,
                        'ELFOSABI_LINUX': 3, 'ELFOSABI_SOLARIS': 6, 'ELFOSABI_FREEBSD': 9
                    }
                    result['ei_osabi'] = osabi_map.get(ei_osabi_raw, 0)
                    result['ei_osabi_str'] = ei_osabi_raw.replace('ELFOSABI_', '') if ei_osabi_raw and ei_osabi_raw.startswith('ELFOSABI_') else str(ei_osabi_raw) if ei_osabi_raw else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_OSABI: {e}")

            # Extract EI_ABIVERSION
            try:
                if ident:
                    result['ei_abiversion'] = ident.get('EI_ABIVERSION', 0)
            except Exception as e:
                self.log.warning(f"Could not extract EI_ABIVERSION: {e}")

            # Extract e_type (file type)
            try:
                e_type_raw = header.get('e_type', 'ET_NONE')
                type_map = {
                    'ET_NONE': 0, 'ET_REL': 1, 'ET_EXEC': 2, 'ET_DYN': 3, 'ET_CORE': 4
                }
                result['e_type'] = type_map.get(e_type_raw, 0)
                result['e_type_str'] = e_type_raw.replace('ET_', '') if e_type_raw and e_type_raw.startswith('ET_') else str(e_type_raw) if e_type_raw else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract e_type: {e}")

            # Extract e_machine (architecture)
            try:
                e_machine_raw = header.get('e_machine', 0)
                # Map machine strings to integers and human-readable names
                # https://github.com/eliben/pyelftools/blob/main/elftools/elf/enums.py
                # https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf-em.h
                # https://refspecs.linuxfoundation.org/elf/elf.pdf
                machine_int_map = {
                    'EM_NONE': 0, 'EM_M32': 1, 'EM_SPARC': 2, 'EM_386': 3,
                    'EM_68K': 4, 'EM_88K': 5, 'EM_860': 7, 'EM_MIPS': 8,
                    'EM_S370': 9, 'EM_MIPS_RS3_LE': 10, 'EM_PARISC': 15,
                    'EM_VPP500': 17, 'EM_SPARC32PLUS': 18, 'EM_960': 19,
                    'EM_PPC': 20, 'EM_PPC64': 21, 'EM_S390': 22, 'EM_V800': 36,
                    'EM_FR20': 37, 'EM_RH32': 38, 'EM_RCE': 39, 'EM_ARM': 40,
                    'EM_ALPHA': 41, 'EM_SH': 42, 'EM_SPARCV9': 43, 'EM_TRICORE': 44,
                    'EM_ARC': 45, 'EM_H8_300': 46, 'EM_H8_300H': 47, 'EM_H8S': 48,
                    'EM_H8_500': 49, 'EM_IA_64': 50, 'EM_MIPS_X': 51, 'EM_COLDFIRE': 52,
                    'EM_68HC12': 53, 'EM_X86_64': 62, 'EM_AARCH64': 183, 'EM_RISCV': 243,
                }
                machine_str_map = {
                    'EM_386': 'x86', 'EM_X86_64': 'x86_64', 'EM_ARM': 'ARM', 'EM_AARCH64': 'ARM64',
                    'EM_MIPS': 'MIPS', 'EM_PPC': 'PowerPC', 'EM_PPC64': 'PowerPC64',
                    'EM_SPARC': 'SPARC', 'EM_SPARCV9': 'SPARC64', 'EM_RISCV': 'RISC-V',
                    'EM_IA_64': 'IA-64', 'EM_S390': 'S390', 'EM_SH': 'SuperH',
                }
                if isinstance(e_machine_raw, str):
                    result['e_machine'] = machine_int_map.get(e_machine_raw, 0)
                    result['e_machine_str'] = machine_str_map.get(e_machine_raw, e_machine_raw.replace('EM_', '') if e_machine_raw.startswith('EM_') else e_machine_raw)
                else:
                    result['e_machine'] = e_machine_raw
                    result['e_machine_str'] = str(e_machine_raw)
            except Exception as e:
                self.log.warning(f"Could not extract e_machine: {e}")

            # Extract e_version
            try:
                e_version_raw = header.get('e_version', 0)
                # Convert string like 'EV_CURRENT' to integer
                if isinstance(e_version_raw, str):
                    version_map = {'EV_NONE': 0, 'EV_CURRENT': 1}
                    result['e_version'] = version_map.get(e_version_raw, 1)
                else:
                    result['e_version'] = e_version_raw
            except Exception as e:
                self.log.warning(f"Could not extract e_version: {e}")

            # Extract e_entry (entry point)
            try:
                result['e_entry'] = header.get('e_entry', 0)
            except Exception as e:
                self.log.warning(f"Could not extract e_entry: {e}")

            # Extract e_flags
            try:
                result['e_flags'] = header.get('e_flags', 0)
            except Exception as e:
                self.log.warning(f"Could not extract e_flags: {e}")

            return result

        try:
            return self._with_elf_file(extract_header)
        except Exception as e:
            self.log.error(f"Error extracting header data {self.hash.sha256}: {e}")
            return None

    def _count_dynamic_symbols(self):
        """Count symbols in dynamic symbol table."""
        def count_dynsym(elf):
            dynsym_section = elf.get_section_by_name('.dynsym')
            if dynsym_section and hasattr(dynsym_section, 'num_symbols'):
                return dynsym_section.num_symbols()
            return 0

        try:
            result = self._with_elf_file(count_dynsym)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting dynamic symbols: {e}")
            return 0

    def _count_relocations(self):
        """Count total relocations across all sections."""
        def count_relocs(elf):
            reloc_count = 0
            for section in elf.iter_sections():
                if hasattr(section, 'iter_relocations'):
                    try:
                        reloc_count += section.num_relocations()
                    except:
                        # Some sections might not support num_relocations()
                        for _ in section.iter_relocations():
                            reloc_count += 1
            return reloc_count

        try:
            result = self._with_elf_file(count_relocs)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting relocations: {e}")
            return 0

    def _has_gnu_hash(self):
        """Check if GNU hash table is present."""
        def check_gnu_hash(elf):
            gnu_hash_section = elf.get_section_by_name('.gnu.hash')
            return gnu_hash_section is not None

        try:
            result = self._with_elf_file(check_gnu_hash)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking GNU hash: {e}")
            return False

    def _has_fortify(self):
        """Check if binary has fortify source protection."""
        def check_fortify(elf):
            # Look for fortified function symbols
            fortify_symbols = ['__printf_chk', '__sprintf_chk', '__snprintf_chk',
                             '__strcpy_chk', '__strcat_chk', '__memcpy_chk']

            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    for symbol in section.iter_symbols():
                        if symbol.name in fortify_symbols:
                            return True
            return False

        try:
            result = self._with_elf_file(check_fortify)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking fortify: {e}")
            return False

    def tag(self):
        return Tag.ELF_FEATURES.value if hasattr(Tag, 'ELF_FEATURES') else "elf_features"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            # Check if file is valid ELF
            if not self._is_elf_file():
                self.log.error(f"No valid ELF file for {self.hash.sha256}")
                return None

            # Extract header data (now always returns a result, even with defaults)
            header_data = self._extract_header_data()
            if not header_data:
                self.log.error(f"Complete failure to extract any header data for {self.hash.sha256}")
                return None

            # Extract binary properties
            is_64bit = 1 if self._is_64bit() else 0
            is_stripped = 1 if self._is_stripped() else 0
            is_pie = 1 if self._is_pie() else 0
            has_canary = 1 if self._has_stack_protection() else 0
            has_nx = 1 if self._has_nx_bit() else 0
            has_relro = 1 if self._has_relro() else 0
            has_fortify = 1 if self._has_fortify() else 0

            # Extract counts
            number_of_segments = self._count_segments()
            number_of_sections = self._count_sections()
            number_of_symbols = self._count_symbols()
            number_of_dynamic_symbols = self._count_dynamic_symbols()
            number_of_relocations = self._count_relocations()
            number_of_dependencies = len(self._get_dependencies())

            # Extract build information
            build_id = self._get_build_id()
            gnu_hash_present = 1 if self._has_gnu_hash() else 0
            has_debug_info = 1 if self._has_debug_info() else 0

            self.elf_features = ELFFeatures(
                # ELF Header data
                ei_class=header_data['ei_class'],
                ei_data=header_data['ei_data'],
                ei_version=header_data['ei_version'],
                ei_osabi=header_data['ei_osabi'],
                ei_abiversion=header_data['ei_abiversion'],
                e_type=header_data['e_type'],
                e_machine=header_data['e_machine'],
                e_version=header_data['e_version'],
                e_entry=header_data['e_entry'],
                e_flags=header_data['e_flags'],
                # Human readable values
                ei_class_str=header_data['ei_class_str'],
                ei_data_str=header_data['ei_data_str'],
                ei_osabi_str=header_data['ei_osabi_str'],
                e_type_str=header_data['e_type_str'],
                e_machine_str=header_data['e_machine_str'],
                # Binary properties
                is_64bit=is_64bit,
                is_stripped=is_stripped,
                is_pie=is_pie,
                has_canary=has_canary,
                has_nx=has_nx,
                has_relro=has_relro,
                has_fortify=has_fortify,
                # Counts
                number_of_segments=number_of_segments,
                number_of_sections=number_of_sections,
                number_of_symbols=number_of_symbols,
                number_of_dynamic_symbols=number_of_dynamic_symbols,
                number_of_relocations=number_of_relocations,
                number_of_dependencies=number_of_dependencies,
                # Build information
                build_id=build_id,
                gnu_hash_present=gnu_hash_present,
                has_debug_info=has_debug_info,
            )

            return self.elf_features

        except Exception as e:
            self.log.error(f"Error extracting ELF features {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_features
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_features:
                    return None

                # Prepare data array matching the schema
                data = [[
                    self.sha256,
                    self.md5,
                    self.sha1,

                    # ELF Header data
                    self.elf_features.ei_class,
                    self.elf_features.ei_data,
                    self.elf_features.ei_version,
                    self.elf_features.ei_osabi,
                    self.elf_features.ei_abiversion,
                    self.elf_features.e_type,
                    self.elf_features.e_machine,
                    self.elf_features.e_version,
                    self.elf_features.e_entry,
                    self.elf_features.e_flags,

                    # Human readable values
                    self.elf_features.ei_class_str,
                    self.elf_features.ei_data_str,
                    self.elf_features.ei_osabi_str,
                    self.elf_features.e_type_str,
                    self.elf_features.e_machine_str,

                    # Binary properties
                    self.elf_features.is_64bit,
                    self.elf_features.is_stripped,
                    self.elf_features.is_pie,
                    self.elf_features.has_canary,
                    self.elf_features.has_nx,
                    self.elf_features.has_relro,
                    self.elf_features.has_fortify,

                    # Counts
                    self.elf_features.number_of_segments,
                    self.elf_features.number_of_sections,
                    self.elf_features.number_of_symbols,
                    self.elf_features.number_of_dynamic_symbols,
                    self.elf_features.number_of_relocations,
                    self.elf_features.number_of_dependencies,

                    # Build information
                    self.elf_features.build_id,
                    self.elf_features.gnu_hash_present,
                    self.elf_features.has_debug_info,

                    # Analysis metadata
                    datetime.now(timezone.utc)
                ]]

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'ei_class', 'ei_data', 'ei_version', 'ei_osabi', 'ei_abiversion',
                    'e_type', 'e_machine', 'e_version', 'e_entry', 'e_flags',
                    'ei_class_str', 'ei_data_str', 'ei_osabi_str', 'e_type_str', 'e_machine_str',
                    'is_64bit', 'is_stripped', 'is_pie', 'has_canary', 'has_nx', 'has_relro', 'has_fortify',
                    'number_of_segments', 'number_of_sections', 'number_of_symbols',
                    'number_of_dynamic_symbols', 'number_of_relocations', 'number_of_dependencies',
                    'build_id', 'gnu_hash_present', 'has_debug_info',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('32-bit'=1, '64-bit'=2)",
                    "Enum8('Little-endian'=1, 'Big-endian'=2)",
                    'UInt8',
                    "Enum8('SYSV'=0, 'HPUX'=1, 'NETBSD'=2, 'LINUX'=3, 'SOLARIS'=6, 'FREEBSD'=9)",
                    'UInt8',
                    "Enum8('NONE'=0, 'REL'=1, 'EXEC'=2, 'DYN'=3, 'CORE'=4)",
                    'UInt16', 'UInt32', 'UInt64', 'UInt32',
                    'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)',
                    'LowCardinality(String)', 'LowCardinality(String)',
                    'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8',
                    'UInt16', 'UInt16', 'UInt32', 'UInt32', 'UInt32', 'UInt16',
                    'Nullable(String)', 'UInt8', 'UInt8',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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