Mahardhika Pratama

220 papers A* 8A 6B 19C 7Journal 147Unranked 31
YearRankTypeTitle / Venue / Authors
2026 J jnl
Appl. Soft Comput.
Goran Andonovski, Daniel Leite, Radu-Emil Precup, Fernando A. C. Gomide, Mahardhika Pratama, Igor Skrjanc
2026 J jnl
CoRR
Naeem Paeedeh, Mahardhika Pratama, Ary Mazharuddin Shiddiqi, Zehong Cao, Mukesh Prasad, Wisnu Jatmiko
2026 J jnl
IEEE Access
Monirul Islam Pavel, Siyi Hu, Mahardhika Pratama, Ryszard Kowalczyk
2025 J jnl
CoRR
Siyi Hu, Mohamad A. Hady, Jianglin Qiao, Jimmy Cao, Mahardhika Pratama, Ryszard Kowalczyk
2025 J jnl
CoRR
Muhammad Tanzil Furqon, Mahardhika Pratama, Igor Skrjanc, Lin Liu, Habibullah Habibullah, Kutluyil Dogancay
2025 J jnl
CoRR
Naeem Paeedeh, Mahardhika Pratama, Weiping Ding, Jimmy Cao, Wolfgang Mayer, Ryszard Kowalczyk
2025 J jnl
CoRR
Naeem Paeedeh, Mahardhika Pratama, Wolfgang Mayer, Jimmy Cao, Ryszard Kowlczyk
2025 J jnl
Knowl. Based Syst.
Yanzhan Chen, Fan Yu, Qian Zhang, Mahardhika Pratama
2025 A* conf
ICLR
Muhammad Anwar Ma'sum, Mahardhika Pratama, Lin Liu, Habibullah, Ryszard Kowalczyk
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Muhammad Anwar Ma'sum, Mahardhika Pratama, Edwin Lughofer, Lin Liu, Habibullah, Ryszard Kowalczyk
2025 J jnl
CoRR
M. Anwar Ma'sum, Mahardhika Pratama, Igor Skrjanc
2025 J jnl
CoRR
Mohamad A. Hady, Siyi Hu, Mahardhika Pratama, Jimmy Cao, Ryszard Kowalczyk
2025 J jnl
CoRR
Mohamad A. Hady, Siyi Hu, Mahardhika Pratama, Zehong Cao, Ryszard Kowalczyk
2025 J jnl
CoRR
Mohamad A. Hady, Siyi Hu, Mahardhika Pratama, Jimmy Cao, Ryszard Kowalczyk
2025 J jnl
Artif. Intell. Rev.
Mohamad A. Hady, Siyi Hu, Mahardhika Pratama, Zehong Cao, Ryszard Kowalczyk
2025 J jnl
CoRR
Monirul Islam Pavel, Siyi Hu, Mahardhika Pratama, Ryszard Kowalczyk
2025 J jnl
CoRR
M. Anwar Ma'sum, Mahardhika Pratama, Savitha Ramasamy, Lin Liu, Habibullah Habibullah, Ryszard Kowalczyk
2025 J jnl
CoRR
Muhammad Tanzil Furqon, Mahardhika Pratama, Igor Skrjanc, Lin Liu, Habibullah Habibullah, Kutluyil Dogancay
2025 J jnl
Inf. Sci.
Muhammad Tanzil Furqon, Mahardhika Pratama, Ary Mazharuddin Shiddiqi, Lin Liu, Habibullah Habibullah, Kutluyil Dogancay
2025 A* conf
ICLR
Muhammad Anwar Ma'sum, Mahardhika Pratama, Savitha Ramasamy, Lin Liu, Habibullah, Ryszard Kowalczyk
2024 J jnl
IEEE Access
Ayuningtyas Hari Fristiana, Syukron Abu Ishaq Alfarozi, Adhistya Erna Permanasari, Mahardhika Pratama, Sunu Wibirama
2024 J jnl
CoRR
Weiwei Weng, Mahardhika Pratama, Jie Zhang, Chen Chen, Edward Kien Yee Yapp, Savitha Ramasamy
2024 J jnl
CoRR
Naeem Paeedeh, Mahardhika Pratama, Muhammad Anwar Ma'sum, Wolfgang Mayer, Zehong Cao, Ryszard Kowalczyk
2024 J jnl
Inf. Sci.
Weiwei Weng, Mahardhika Pratama, Jie Zhang, Chen Chen, Edward Kien Yee Yapp, Ramasamy Savitha
2024 J jnl
Knowl. Based Syst.
Naeem Paeedeh, Mahardhika Pratama, Muhammad Anwar Ma'sum, Wolfgang Mayer, Zehong Cao, Ryszard Kowalczyk
2024 J jnl
CoRR
Muhammad Anwar Ma'sum, Md. Rasel Sarkar, Mahardhika Pratama, Savitha Ramasamy, Sreenatha G. Anavatti, Lin Liu, Habibullah, Ryszard Kowalczyk
2024 J jnl
IEEE Trans. Artif. Intell.
Muhammad Anwar Ma'sum, Md. Rasel Sarkar, Mahardhika Pratama, Savitha Ramasamy, Sreenatha G. Anavatti, Lin Liu, Habibullah Habibullah, Ryszard Kowalczyk
2024 J jnl
CoRR
Naeem Paeedeh, Mahardhika Pratama, Sunu Wibirama, Wolfgang Mayer, Zehong Cao, Ryszard Kowalczyk
2024 J jnl
Inf. Sci.
Naeem Paeedeh, Mahardhika Pratama, Sunu Wibirama, Wolfgang Mayer, Zehong Cao, Ryszard Kowalczyk
2024 J jnl
Expert Syst. Appl.
Md. Rasel Sarkar, Sreenatha G. Anavatti, Tanmoy Dam, Md Meftahul Ferdaus, Murat Tahtali, Savitha Ramasamy, Mahardhika Pratama
2024 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Weiping Ding, Mohamed Abdel-Basset, Hossam Hawash, Mahardhika Pratama, Witold Pedrycz
2024 B conf
IJCNN
Appan Rakaraddi, Siew-Kei Lam, Mahardhika Pratama, Marcus de Carvalho
2024 J jnl
CoRR
Appan Rakaraddi, Siew-Kei Lam, Mahardhika Pratama, Marcus de Carvalho
2024 J jnl
CoRR
Muhammad Tanzil Furqon, Mahardhika Pratama, Lin Liu, Habibullah, Kutluyil Dogancay
2024 J jnl
Knowl. Based Syst.
Muhammad Tanzil Furqon, Mahardhika Pratama, Lin Liu, Habibullah Habibullah, Kutluyil Dogancay
2024 A conf
CIKM
Muhammad Anwar Ma'sum, Mahardhika Pratama, Savitha Ramasamy, Lin Liu, Habibullah Habibullah, Ryszard Kowalczyk
2024 J jnl
CoRR
Muhammad Anwar Ma'sum, Mahardhika Pratama, Savitha Ramasamy, Lin Liu, Habibullah Habibullah, Ryszard Kowalczyk
2024 J jnl
CoRR
Muhammad Tanzil Furqon, Mahardhika Pratama, Ary Mazharuddin Shiddiqi, Lin Liu, Habibullah Habibullah, Kutluyil Dogancay
2024 A* conf
ICDE
Marcus de Carvalho, Mahardhika Pratama, Jie Zhang, Haoyan Chua, Edward Kien Yee Yapp
2024 J jnl
CoRR
Marcus de Carvalho, Mahardhika Pratama, Jie Zhang, Haoyan Chua, Edward Kien Yee Yapp
2024 J jnl
CoRR
Muhammad Anwar Ma'sum, Mahardhika Pratama, Ramasamy Savitha, Lin Liu, Habibullah, Ryszard Kowalczyk
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Muhammad Anwar Ma'sum, Mahardhika Pratama, Ramasamy Savitha, Lin Liu, Habibullah, Ryszard Kowalczyk
2023 J jnl
CoRR
Muhammad Anwar Ma'sum, Mahardhika Pratama, Edwin Lughofer, Weiping Ding, Wisnu Jatmiko
2023 J jnl
Inf. Sci.
Muhammad Anwar Ma'sum, Mahardhika Pratama, Edwin Lughofer, Weiping Ding, Wisnu Jatmiko
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Weiwei Weng, Mahardhika Pratama, Choiru Za'in, Marcus de Carvalho, Appan Rakaraddi, Andri Ashfahani, Edward Kien Yee Yapp
2023 B conf
IJCNN
Md. Rasel Sarkar, Sreenatha G. Anavatti, Tanmoy Dam, Mahardhika Pratama, Berlian Al Kindhi
2023 J jnl
CoRR
Md. Rasel Sarkar, Sreenatha G. Anavatti, Tanmoy Dam, Mahardhika Pratama, Berlian Al Kindhi
2023 J jnl
Inf. Fusion
Edwin Lughofer, Mahardhika Pratama
2023 J jnl
CoRR
Muhammad Anwar Ma'sum, Mahardhika Pratama, Lin Liu, Edwin Lughofer, Habibullah, Ryszard Kowalczyk
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Andri Ashfahani, Mahardhika Pratama
2022 J jnl
Knowl. Based Syst.
Marcus de Carvalho, Mahardhika Pratama, Jie Zhang, Edward Kien Yee Yapp
2022 conf
SSCI
Abhay M. S. Aradhya, Gaurav Sharma, Mahardhika Pratama, Suresh Sundaram
2022 J jnl
Inf. Sci.
Renchunzi Xie, Mahardhika Pratama
2022 J jnl
Inf. Sci.
Abhay M. S. Aradhya, Andri Ashfahani, Fienny Angelina, Mahardhika Pratama, Rodrigo Fernandes de Mello, Suresh Sundaram
2022 J jnl
CoRR
Weiwei Weng, Mahardhika Pratama, Choiru Za'in, Marcus de Carvalho, Appan Rakaraddi, Andri Ashfahani, Edward Kien Yee Yapp
2022 conf
ECML/PKDD (3)
Marcus de Carvalho, Mahardhika Pratama, Jie Zhang, Yajuan Sun
2022 J jnl
CoRR
Marcus de Carvalho, Mahardhika Pratama, Jie Zhang, Yajuan Sun
2022 J jnl
Inf. Sci.
Mahardhika Pratama, Edwin Lughofer, Plamen P. Angelov
2022 conf
IWBIS
Naufal Muhammad Hirzi, Muhammad Anwar Ma'sum, Mahardhika Pratama, Wisnu Jatmiko
2022 B conf
ICIP
Tanmoy Dam, Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Senthilnath Jayavelu, Hussein A. Abbass
2022 J jnl
CoRR
Tanmoy Dam, Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Senthilnath Jayavelu, Hussein A. Abbass
2022 J jnl
Evol. Syst.
Edwin Lughofer, Mahardhika Pratama
2022 A conf
CIKM
Appan Rakaraddi, Siew-Kei Lam, Mahardhika Pratama, Marcus de Carvalho
2022 J jnl
CoRR
Appan Rakaraddi, Siew Kei Lam, Mahardhika Pratama, Marcus de Carvalho
2022 conf
ECML/PKDD (3)
Tanmoy Dam, Mahardhika Pratama, Md Meftahul Ferdaus, Sreenatha G. Anavatti, Hussein A. Abbass
2022 J jnl
CoRR
Tanmoy Dam, Mahardhika Pratama, Md Meftahul Ferdaus, Sreenatha G. Anavatti, Hussein A. Abbass
2021 conf
IWBIS
William Gates, Grafika Jati, P. Riskyana Dewi Intan, Mahardhika Pratama, Wisnu Jatmiko
2021 J jnl
CoRR
Marcus de Carvalho, Mahardhika Pratama, Jie Zhang, Edward Kien Yee Yapp
2021 J jnl
CoRR
Renchunzi Xie, Mahardhika Pratama
2021 B conf
IJCNN
Andri Ashfahani, Mahardhika Pratama, Edwin Lughofer, Edward Kien Yee Yapp
2021 J jnl
CoRR
Andri Ashfahani, Mahardhika Pratama, Edwin Lughofer, Edward Kien Yee Yapp
2021 J jnl
IEEE Trans. Fuzzy Syst.
Subhrajit Samanta, Mahardhika Pratama, Suresh Sundaram
2021 J jnl
CoRR
Fubing Mao, Weiwei Weng, Mahardhika Pratama, Edward Kien Yee Yapp
2021 J jnl
Knowl. Based Syst.
Fubing Mao, Weiwei Weng, Mahardhika Pratama, Edward Kien Yee Yapp
2021 conf
IWBIS
Achmad Fatchuttamam Abka, Mahardhika Pratama, Wisnu Jatmiko
2021 A* conf
ICRA
Basaran Bahadir Kocer, Mohamad Abdul Hady, Harikumar Kandath, Mahardhika Pratama, Mirko Kovac
2021 J jnl
Complex.
Weiwei Weng, Mahardhika Pratama, Andri Ashfahani, Edward Kien Yee Yapp
2021 J jnl
Inf. Sci.
Edwin Lughofer, Mahardhika Pratama, Igor Skrjanc
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Qing Cai, Sameer Alam, Mahardhika Pratama, Jiming Liu
2021 J jnl
CoRR
Mahardhika Pratama, Choiru Za'in, Edwin Lughofer, Eric Pardede, Dwi A. P. Rahayu
2021 J jnl
Inf. Sci.
Mahardhika Pratama, Choiru Za'in, Edwin Lughofer, Eric Pardede, Dwi A. P. Rahayu
2021 J jnl
Appl. Intell.
Murtadha Talib AL-Sharuee, Fei Liu, Mahardhika Pratama
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Ahmad Jobran Al-Mahasneh, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2021 J jnl
CoRR
Andri Ashfahani, Mahardhika Pratama
2021 J jnl
CoRR
Mahardhika Pratama, Andri Ashfahani, Edwin Lughofer
2021 conf
CSSL
Mahardhika Pratama, Andri Ashfahani, Edwin Lughofer
2021 conf
IEEE BigData
Appan Rakaraddi, Mahardhika Pratama
2021 J jnl
CoRR
Appan Rakaraddi, Mahardhika Pratama
2020 B conf
IJCNN
Subhrajit Samanta, Mahardhika Pratama, Suresh Sundaram, Narasimalu Srikanth
2020 A* conf
KDD
Monidipa Das, Mahardhika Pratama, Tegoeh Tjahjowidodo
2020 A* conf
AAAI
Monidipa Das, Mahardhika Pratama, Jie Zhang, Yew-Soon Ong
2020 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Witold Pedrycz, Geoffrey I. Webb
2020 J jnl
Int. J. Bus. Intell. Data Min.
Kurnianingsih, Lukito Edi Nugroho, Widyawan, Lutfan Lazuardi, Anton Satria Prabuwono, Mahardhika Pratama
2020 J jnl
IEEE Trans. Netw. Sci. Eng.
Qing Cai, Mahardhika Pratama, Sameer Alam, Chunyao Ma, Jiming Liu
2020 J jnl
Neurocomputing
Andri Ashfahani, Mahardhika Pratama, Edwin Lughofer, Yew-Soon Ong
2020 J jnl
IEEE Trans. Fuzzy Syst.
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt, Yongping Pan
2020 J jnl
Neurocomputing
Subhrajit Samanta, Mahardhika Pratama, Suresh Sundaram, Narasimalu Srikanth
2020 conf
EMBC
Abhay M. S. Aradhya, Suresh Sundaram, Mahardhika Pratama
2020 J jnl
Inf. Sci.
Edwin Lughofer, Alexandru-Ciprian Zavoianu, Robert Pollak, Mahardhika Pratama, Pauline Meyer-Heye, Helmut Zörrer, Christian Eitzinger, Thomas Radauer
2020 conf
EAIS
Edwin Lughofer, Mahardhika Pratama
2020 J jnl
IEEE Trans. Cybern.
Mahardhika Pratama, Eric Dimla, Tegoeh Tjahjowidodo, Witold Pedrycz, Edwin Lughofer
2020 J jnl
Inf. Sci.
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt, Edwin Lughofer
2020 J jnl
Complex.
Qing Cai, Sameer Alam, Mahardhika Pratama, Zhen Wang
2020 J jnl
ACM Trans. Spatial Algorithms Syst.
Monidipa Das, Mahardhika Pratama, Soumya K. Ghosh
2020 conf
EAIS
Choiru Za'in, Andri Ashfahani, Mahardhika Pratama, Edwin Lughofer, Eric Pardede
2020 conf
EMBC
Khairul Anam, Saiful Bukhori, Faruq Sandi Hanggara, Mahardhika Pratama
2020 J jnl
Artif. Intell. Rev.
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Mahardhika Pratama, Matthew A. Garratt
2019 J jnl
Inf. Sci.
Subhrajit Samanta, Mahardhika Pratama, Suresh Sundaram
2019 A conf
CIKM
Mahardhika Pratama, Marcus de Carvalho, Renchunzi Xie, Edwin Lughofer, Jie Lu
2019 J jnl
CoRR
Mahardhika Pratama, Marcus de Carvalho, Renchunzi Xie, Edwin Lughofer, Jie Lu
2019 A conf
IROS
Basaran Bahadir Kocer, Mehmet Efe Tiryaki, Mahardhika Pratama, Tegoeh Tjahjowidodo, Gerald Gim Lee Seet
2019 J jnl
CoRR
Basaran Bahadir Kocer, Mehmet Efe Tiryaki, Mahardhika Pratama, Tegoeh Tjahjowidodo, Gerald Gim Lee Seet
2019 A conf
CIKM
Mahardhika Pratama, Choiru Za'in, Andri Ashfahani, Yew-Soon Ong, Weiping Ding
2019 J jnl
CoRR
Mahardhika Pratama, Choiru Za'in, Andri Ashfahani, Yew-Soon Ong, Weiping Ding
2019 A conf
SDM
Andri Ashfahani, Mahardhika Pratama
2019 J jnl
CoRR
Andri Ashfahani, Mahardhika Pratama, Edwin Lughofer, Yew-Soon Ong
2019 A* conf
AAAI
Abhay M. S. Aradhya, Aditya Joglekar, Suresh Sundaram, Mahardhika Pratama
2019 J jnl
Inf. Sci.
Mahardhika Pratama, Dianhui Wang
2019 J jnl
J. Artif. Intell. Soft Comput. Res.
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2019 J jnl
Knowl. Based Syst.
Choiru Za'in, Mahardhika Pratama, Eric Pardede
2019 B conf
IJCNN
Monidipa Das, Mahardhika Pratama, Andri Ashfahani, Subhrajit Samanta
2019 J jnl
IEEE Access
Weiping Ding, Gary G. Yen, Gleb Beliakov, Isaac Triguero, Mahardhika Pratama, Xiangliang Zhang, Hongjun Li
2019 J jnl
Complex.
Qing Cai, Mahardhika Pratama, Sameer Alam
2019 J jnl
Knowl. Based Syst.
Nguyen Anh, Suresh Sundaram, Mahardhika Pratama, Narasimalu Srikanth
2019 A* conf
ICDM
Monidipa Das, Mahardhika Pratama, Septiviana Savitri, Jie Zhang
2019 J jnl
J. Intell. Manuf.
Mahardhika Pratama, Eric Dimla, Chow Yin Lai, Edwin Lughofer
2019 J jnl
Appl. Soft Comput.
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt
2019 J jnl
IEEE Trans. Fuzzy Syst.
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt
2019 B conf
IJCNN
Subhrajit Samanta, Andre Hartanto, Mahardhika Pratama, Suresh Sundaram, Narasimalu Srikanth
2019 J jnl
CoRR
Mohamad Abdul Hady, Basaran Bahadir Kocer, Harikumar Kandath, Mahardhika Pratama
2019 conf
SSCI
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2019 B conf
FUZZ-IEEE
Md Meftahul Ferdaus, Mohamad Abdul Hady, Mahardhika Pratama, Harikumar Kandath, Sreenatha G. Anavatti
2019 B conf
FUZZ-IEEE
Harikumar Kandath, Mohamad Abdul Hady, Mahardhika Pratama, Bing Feng Ng
2019 J jnl
CoRR
Jiun Fatt Chow, Basaran Bahadir Kocer, John Henawy, Gerald Seet, Zhengguo Li, Wei-Yun Yau, Mahardhika Pratama
2019 conf
IEEE BigData
Mahardhika Pratama, Andri Ashfahani, Mohamad Abdul Hady
2019 J jnl
CoRR
Mahardhika Pratama, Andri Ashfahani, Mohamad Abdul Hady
2019 C conf
ICMLA
Sheng Huang, Andri Ashfahani, Mahardhika Pratama
2018 B conf
SMC
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew Garratt
2018 J jnl
CoRR
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt
2018 conf
SSCI
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Mahardhika Pratama, Matthew A. Garratt
2018 J jnl
CoRR
Mahardhika Pratama, Witold Pedrycz, Geoffrey I. Webb
2018 J jnl
CoRR
Andri Ashfahani, Mahardhika Pratama, Edwin Lughofer, Qing Cai, Sheng Huang
2018 J jnl
CoRR
Andri Ashfahani, Mahardhika Pratama
2018 J jnl
CoRR
Mahardhika Pratama, Andri Ashfahani, Yew-Soon Ong, Savitha Ramasamy, Edwin Lughofer
2018 B conf
SMC
Choiru Za'in, Mahardhika Pratama, Andri Ashfahani, Eric Pardede, Sheng Huang
2018 J jnl
CoRR
Choiru Za'in, Mahardhika Pratama, Andri Ashfahani, Eric Pardede, Sheng Huang
2018 conf
INNS Conference on Big Data
Choiru Za'in, Mahardhika Pratama, Edwin Lughofer, Md Meftahul Ferdaus, Qing Cai, Mukesh Prasad
2018 J jnl
CoRR
Mahardhika Pratama, Dianhui Wang
2018 J jnl
CoRR
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2018 J jnl
Appl. Soft Comput.
Mahardhika Pratama, Edwin Lughofer, Suresh Sundaram, Moamar Sayed-Mouchaweh, Igor Skrjanc, Fahed Mostafa
2018 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Witold Pedrycz, Edwin Lughofer
2018 conf
SSCI
Ahmad Jobran Al-Mahasneh, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2018 J jnl
CoRR
Mahardhika Pratama, Choiru Za'in, Eric Pardede
2018 conf
EAIS
Edwin Lughofer, Robert Pollak, Pauline Meyer-Heye, Helmut Zörrer, Christian Eitzinger, Jasmin Lehner, Thomas Radauer, Mahardhika Pratama
2018 J jnl
CoRR
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt, Yongping Pan
2018 ed.
INNS Conference on Big Data
Seiichi Ozawa, Ah-Hwee Tan, Plamen P. Angelov, Asim Roy, Mahardhika Pratama
2018 conf
SSCI
Marcus de Carvalho, Mahardhika Pratama
2018 J jnl
IEEE Trans. Fuzzy Syst.
Edwin Lughofer, Mahardhika Pratama, Igor Skrjanc
2018 J jnl
IEEE Trans. Fuzzy Syst.
Edwin Lughofer, Mahardhika Pratama
2018 conf
INNS Conference on Big Data
Mukesh Prasad, Liang-Cheng Chang, Deepak Gupta, Mahardhika Pratama, Suresh Sundaram, Chin-Teng Lin
2018 J jnl
CoRR
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt, Edwin Lughofer
2018 J jnl
CoRR
Mahardhika Pratama, Md Meftahul Ferdaus, Sreenatha G. Anavatti, Matthew A. Garratt
2018 J jnl
CoRR
Wahyu Caesarendra, Mahardhika Pratama, Tegoeh Tjahjowidodo, Kiet Tieu, Buyung Kosasih
2018 J jnl
Inf. Sci.
Mahardhika Pratama, Plamen P. Angelov, Edwin Lughofer, Meng Joo Er
2018 J jnl
Eng. Appl. Artif. Intell.
Edwin Lughofer, Robert Pollak, Alexandru-Ciprian Zavoianu, Mahardhika Pratama, Pauline Meyer-Heye, Helmut Zörrer, Christian Eitzinger, Julia Haim, Thomas Radauer
2018 J jnl
Data Knowl. Eng.
Murtadha Talib AL-Sharuee, Fei Liu, Mahardhika Pratama
2018 C conf
ICARCV
Sheng Huang, Syed Shoaib, Andri Ashfahani, Mahardhika Pratama
2018 C conf
ICARCV
Sheng Huang, Sudeep Mohanty, Andri Ashfahani, Mahardhika Pratama
2018 J jnl
CoRR
Basaran Bahadir Kocer, Volkan Kumtepeli, Tegoeh Tjahjowidodo, Mahardhika Pratama, Anshuman Tripathi, Gerald Seet Gim Lee, Youyi Wang
2017 J jnl
Evol. Syst.
Rajasekar Venkatesan, Meng Joo Er, Mihika Dave, Mahardhika Pratama, Shiqian Wu
2017 B conf
IJCNN
Mahardhika Pratama, Plamen P. Angelov, Jie Lu, Edwin Lughofer, Manjeevan Seera, Chee Peng Lim
2017 J jnl
CoRR
Murtadha Talib AL-Sharuee, Fei Liu, Mahardhika Pratama
2017 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Jie Lu, Edwin Lughofer, Guangquan Zhang, Meng Joo Er
2017 J jnl
IEEE Trans. Cybern.
Mahardhika Pratama, Guangquan Zhang, Meng Joo Er, Sreenatha G. Anavatti
2017 J jnl
Neurocomputing
Mahardhika Pratama, Edwin Lughofer, Meng Joo Er, Sreenatha G. Anavatti, Chee Peng Lim
2017 J jnl
CoRR
Mahardhika Pratama, Witold Pedrycz, Edwin Lughofer
2017 conf
SSCI
Md Meftahul Ferdaus, Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt
2017 J jnl
Appl. Soft Comput.
Choiru Za'in, Mahardhika Pratama, Edwin Lughofer, Sreenatha G. Anavatti
2017 conf
SSCI
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2017 conf
ICACI
Md Meftahul Ferdaus, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2017 conf
SSCI
Jagendra Singh, Mukesh Prasad, Yousef-Awwad Daraghmi, Prayag Tiwari, Pranay Yadav, Neha Bharill, Mahardhika Pratama, Amit Saxena
2017 conf
EAIS
Edwin Lughofer, Mahardhika Pratama, Igor Skrjanc
2017 J jnl
CoRR
Mahardhika Pratama, Eric Dimla, Chow Yin Lai, Edwin Lughofer
2017 J jnl
IEEE Trans. Cybern.
Yong Zhang, Meng Joo Er, Rui Zhao, Mahardhika Pratama
2017 J jnl
CoRR
Mahardhika Pratama, Eric Dimla, Edwin Lughofer, Witold Pedrycz, Tegoeh Tjahjowidodo
2017 J jnl
Neurocomputing
Mahardhika Pratama, Edwin Lughofer, Dianhui Wang
2017 J jnl
CoRR
Mahardhika Pratama
2017 J jnl
CoRR
Mahardhika Pratama, Plamen P. Angelov, Edwin Lughofer, Meng Joo Er
2017 conf
ICONIP (3)
Kuang-Pen Chou, Dong-Lin Li, Mukesh Prasad, Mahardhika Pratama, Sheng-Yao Su, Haiyan Lu, Chin-Teng Lin, Wen-Chieh Lin
2017 J jnl
Int. J. Fuzzy Syst.
Edwin Lughofer, Stefan Kindermann, Mahardhika Pratama, José de Jesús Rubio
2017 J jnl
Int. J. Fuzzy Syst.
Mahardhika Pratama, Edwin Lughofer, Chee Peng Lim, Wenny Rahayu, Tharam S. Dillon, Agus Budiyono
2016 J jnl
CoRR
Rajasekar Venkatesan, Meng Joo Er, Shiqian Wu, Mahardhika Pratama
2016 C conf
ICARCV
Sreenatha G. Anavatti, Sumana Biswas, Jedd T. Colvin, Mahardhika Pratama
2016 J jnl
CoRR
Rajasekar Venkatesan, Meng Joo Er, Mihika Dave, Mahardhika Pratama, Shiqian Wu
2016 B conf
IJCNN
Rajasekar Venkatesan, Meng Joo Er, Shiqian Wu, Mahardhika Pratama
2016 J jnl
Neurocomputing
Mahardhika Pratama, Jie Lu, Sreenatha G. Anavatti, Edwin Lughofer, Chee Peng Lim
2016 J jnl
Inf. Sci.
Meng Joo Er, Yong Zhang, Ning Wang, Mahardhika Pratama
2016 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Jie Lu, Guangquan Zhang
2016 B conf
IJCNN
Mahardhika Pratama, Edwin Lughofer, Meng Joo Er, J. Wenny Rahayu, Tharam S. Dillon
2016 C conf
IECON
Yong Zhang, Meng Joo Er, Mahardhika Pratama
2016 J jnl
Neurocomputing
Mahardhika Pratama, Jie Lu, Edwin Lughofer, Guangquan Zhang, Sreenatha G. Anavatti
2016 B conf
IJCNN
Yong Zhang, Meng Joo Er, Rajasekar Venkatesan, Ning Wang, Mahardhika Pratama
2016 C conf
ICARCV
Sumana Biswas, Sreenatha G. Anavatti, Matthew A. Garratt, Mahardhika Pratama
2016 C conf
ISNN
Meng Joo Er, Fan Liu, Ning Wang, Yong Zhang, Mahardhika Pratama
2015 B conf
SMC
Mahardhika Pratama, Jie Lu, Guangquan Zhang
2015 B conf
FUZZ-IEEE
Mahardhika Pratama, Jie Lu, Guangquan Zhang
2015 J jnl
Evol. Syst.
Edwin Lughofer, Carlos Cernuda, Stefan Kindermann, Mahardhika Pratama
2015 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Sreenatha G. Anavatti, Jie Lu
2015 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Sreenatha G. Anavatti, Meng Joo Er, Edwin Lughofer
2014 B conf
FUZZ-IEEE
Mahardhika Pratama, Meng Joo Er, Sreenatha G. Anavatti, Edwin Lughofer, Ning Wang, Imam Arifin
2014 conf
EALS
Mahardhika Pratama, Jie Lu, Sreenatha G. Anavatti, José Antonio Iglesias
2014 conf
SETN
Mahardhika Pratama, Sreenatha G. Anavatti, Edwin Lughofer
2014
Mahardhika Pratama
2014 J jnl
IEEE Trans. Fuzzy Syst.
Mahardhika Pratama, Sreenatha G. Anavatti, Edwin Lughofer
2014 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Mahardhika Pratama, Sreenatha G. Anavatti, Plamen P. Angelov, Edwin Lughofer
2013 J jnl
Neurocomputing
Mahardhika Pratama, Meng Joo Er, Xiang Li, Richard Jayadi Oentaryo, Edwin Lughofer, Imam Arifin
2013 B conf
FUZZ-IEEE
Mahardhika Pratama, Sreenatha G. Anavatti, Edwin Lughofer
2013 conf
ICMLA (2)
Edwin Lughofer, Carlos Cernuda, Mahardhika Pratama
2013 conf
EAIS
Mahardhika Pratama, Sreenatha G. Anavatti, Matthew A. Garratt, Edwin Lughofer
2011 conf
ISNN (2)
Mahardhika Pratama, Meng Joo Er, Xiang Li, Linn San, J. O. Richard, Lain-Yin Zhai, Amin Jahromi Torabi, Imam Arifin
redb/extractors/pe_extractors/pe_signature.py
← Index redb/extractors/pe_extractors/pe_signature.py python
import inspect
import yara_x
from datetime import datetime, timezone
from signify.authenticode import SignedPEFile
from typing import Any, Dict, List, Tuple

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PECertificate, PESigner, PECodeSigningInfo


class PESignatureExtractor(PEExtractor):
    """
    RFC 3161 - Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)
    Section 2.4.2 defines the TSTInfo structure.
    https://tools.ietf.org/html/rfc3161#section-2.4.2

    Microsoft Authenticode Time Stamping Specification
    https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx
    """

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

    def tag(self):
        return [Tag.PE_CERTIFICATE.value, Tag.PE_SIGNER.value, Tag.PE_SIGNATURE.value]

    def _extract_certificate_info(self, certificate):
        self.log.debug(inspect.currentframe().f_code.co_name)

        # YARA-X returns datetime objects directly, not Unix timestamps
        not_before = certificate["not_before"]
        not_after = certificate["not_after"]

        # Handle both datetime objects and Unix timestamps for compatibility
        if isinstance(not_before, datetime):
            valid_from = not_before.strftime("%Y-%m-%d %H:%M:%S")
        else:
            valid_from = datetime.fromtimestamp(int(not_before), timezone.utc).strftime("%Y-%m-%d %H:%M:%S")

        if isinstance(not_after, datetime):
            valid_to = not_after.strftime("%Y-%m-%d %H:%M:%S")
        else:
            valid_to = datetime.fromtimestamp(int(not_after), timezone.utc).strftime("%Y-%m-%d %H:%M:%S")

        return PECertificate(
            certificate_serial_number=certificate["serial"],
            certificate_subject=certificate["subject"],
            certificate_issuer=certificate["issuer"],
            certificate_valid_from=valid_from,
            certificate_valid_to=valid_to,
            certificate_thumbprint=certificate["thumbprint"].upper(),
            certificate_algorithm=certificate["algorithm"],
        )

    def _extract_signer_info(self, signer):
        self.log.debug(inspect.currentframe().f_code.co_name)

        # YARA-X returns datetime objects directly, not Unix timestamps
        not_before = signer["not_before"]
        not_after = signer["not_after"]

        # Handle both datetime objects and Unix timestamps for compatibility
        if isinstance(not_before, datetime):
            valid_from = not_before.strftime("%Y-%m-%d %H:%M:%S")
        else:
            valid_from = datetime.fromtimestamp(int(not_before), timezone.utc).strftime("%Y-%m-%d %H:%M:%S")

        if isinstance(not_after, datetime):
            valid_to = not_after.strftime("%Y-%m-%d %H:%M:%S")
        else:
            valid_to = datetime.fromtimestamp(int(not_after), timezone.utc).strftime("%Y-%m-%d %H:%M:%S")

        return PESigner(
            signer_serial_number=signer["serial"],
            signer_subject=signer["subject"],
            signer_issuer=signer["issuer"],
            signer_valid_from=valid_from,
            signer_valid_to=valid_to,
            signer_thumbprint=signer["thumbprint"].upper(),
            signer_algorithm=signer["algorithm"],
        )

    def _extract_signature_info(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        pe_rules = """
            import "pe"
            rule is_pe {
                condition: 
                    pe.is_pe
            }
        """
        rule = yara_x.compile(pe_rules)
        results = rule.scan(self.binary)
        yara_output = results.module_outputs

        signature_info = yara_output["pe"]["signatures"][0]
        number_of_certificates = signature_info["number_of_certificates"]
        signature_verified = signature_info["verified"]
        self.code_signing_info = PECodeSigningInfo(
            _id=self.sha256,
            signature_verified=signature_verified,
            number_of_certificates=int(number_of_certificates),
        )

        keys = signature_info.keys()
        if "certificates" in keys:
            self.log.debug("Extracting PE Signing Certificates")
            certificates = signature_info["certificates"]
            certificates_list = []
            for cert in certificates:
                cert_info = self._extract_certificate_info(cert)
                certificates_list.append(cert_info)
            self.code_signing_info.x509_certificates = certificates_list

        if "signer_info" in keys:
            self.log.debug("Extracting PE Signing Signer Info")
            signers = signature_info["signer_info"]["chain"]
            signers_list = []
            for signer in signers:
                sig = self._extract_signer_info(signer)
                signers_list.append(sig)
            self.code_signing_info.signers = signers_list

        if "countersignatures" in keys:
            self.log.debug("Extracting PE Signing Countersignatures")
            countersignatures = signature_info["countersignatures"][0]["chain"]
            countersigners_list = []
            for csigner in countersignatures:
                csig = self._extract_signer_info(csigner)
                countersigners_list.append(csig)
            self.code_signing_info.countersigners = countersigners_list

        with open(self.filepath, "rb") as f:
            self.log.debug("Extracting PE Signing spcSpOpusInfo")
            sig_pefile = SignedPEFile(f)
            try:
                spc_opusinfo = {}
                for signed_data in sig_pefile.signed_datas:
                    spc_opusinfo["ProgramName"] = signed_data.signer_info.program_name
                    spc_opusinfo["MoreInfo"] = signed_data.signer_info.more_info
                    self.code_signing_info.spcSpOpusInfo = spc_opusinfo

                    if signed_data.signer_info.countersigner is not None:
                        stime = signed_data.signer_info.countersigner.signing_time
                        self.code_signing_info.date_signed = stime.strftime(
                            "%Y-%m-%d %H:%M:%S"
                        )
            except Exception as e:
                self.log.error(
                    f"Error while extracting spcSpOpusInfo or signing date: {e}"
                )

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            if self._is_signed():
                self._extract_signature_info()
                # self.export_to_elastic([self.code_signing_info])
                return self.code_signing_info
            return None
        except Exception as e:
            self.log.error(f"Error extracting PE Signature: {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.extract()
    #     elif exporter_type == "ClickHouseExporter":
    #         signing_info = self.extract()
    #         if signing_info is None:
    #             return None
                
    #         current_time = datetime.now(timezone.utc)
            
    #         # Prepare data for redb_pe_signatures table
    #         signatures_data = [[
    #             self.sha256,                                    # sha256
    #             self.md5,                                       # md5
    #             self.sha1,                                      # sha1
    #             signing_info.signature_verified,                # signature_verified
    #             datetime.strptime(signing_info.date_signed, "%Y-%m-%d %H:%M:%S") if signing_info.date_signed else None,  # date_signed
    #             signing_info.number_of_certificates,            # number_of_certificates
    #             signing_info.spcSpOpusInfo.get('ProgramName', None) if signing_info.spcSpOpusInfo else None,  # program_name
    #             signing_info.spcSpOpusInfo.get('MoreInfo', None) if signing_info.spcSpOpusInfo else None,    # more_info
    #             current_time                                    # analysis_date
    #         ]]

    #         certificates_data = []
            
    #         # Process signers
    #         if signing_info.signers:
    #             for signer in signing_info.signers:
    #                 certificates_data.append(self._prepare_certificate_data(signer, 'signer', current_time))
            
    #         # Process countersigners
    #         if signing_info.countersigners:
    #             for csigner in signing_info.countersigners:
    #                 certificates_data.append(self._prepare_certificate_data(csigner, 'countersigner', current_time))
            
    #         # Process x509 certificates
    #         if signing_info.x509_certificates:
    #             for cert in signing_info.x509_certificates:
    #                 certificates_data.append(self._prepare_certificate_data(cert, 'chain', current_time))
            
    #         return {
    #             'multi_table': True,
    #             'signatures': {
    #                 'table': 'redb_pe_signatures',
    #                 'data': signatures_data,
    #                 'column_names': [
    #                     'sha256', 'md5', 'sha1', 'signature_verified', 'date_signed',
    #                     'number_of_certificates', 'spcSpOpusInfo_program_name', 'spcSpOpusInfo_more_info', 'analysis_date'
    #                 ],
    #                 'column_type_names': [
    #                     'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
    #                     'Boolean', 'DateTime64(3, \'UTC\')', 'UInt8',
    #                     'Nullable(String)', 'Nullable(String)', 'DateTime64(3, \'UTC\')'
    #                 ]
    #             },
    #             'certificates': {
    #                 'table': 'redb_pe_certificates',
    #                 'data': certificates_data,
    #                 'column_names': [
    #                     'sha256', 'md5', 'sha1', 'certificate_type', 'certificate_algorithm',
    #                     'certificate_issuer', 'certificate_subject', 'certificate_serial_number',
    #                     'certificate_thumbprint', 'certificate_valid_from', 'certificate_valid_to',
    #                     'analysis_date'
    #                 ],
    #                 'column_type_names': [
    #                     'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
    #                     'Enum(\'signer\', \'countersigner\', \'chain\')', 'LowCardinality(String)',
    #                     'LowCardinality(String)', 'LowCardinality(String)', 'String',
    #                     'String', 'DateTime64(3, \'UTC\')', 'DateTime64(3, \'UTC\')',
    #                     'DateTime64(3, \'UTC\')'
    #                 ]
    #             }
    #         }

    # def _prepare_certificate_data(self, cert, cert_type: str, analysis_time: datetime) -> List:
    #     """Helper method to prepare certificate data for ClickHouse"""
    #     self.log.debug(inspect.currentframe().f_code.co_name)
    #     prefix = "certificate_" if hasattr(cert, "certificate_algorithm") else "signer_"
        
    #     # Get serial number and clean it up
    #     serial_number = getattr(cert, f"{prefix}serial_number")
    #     if serial_number:
    #         serial_number = serial_number.replace(':', '')
        
    #     return [
    #         self.sha256,                          # sha256
    #         self.md5,                             # md5
    #         self.sha1,                            # sha1
    #         cert_type,                            # certificate_type
    #         getattr(cert, f"{prefix}algorithm"),   # certificate_algorithm
    #         getattr(cert, f"{prefix}issuer"),     # certificate_issuer
    #         getattr(cert, f"{prefix}subject"),    # certificate_subject
    #         serial_number,                        # certificate_serial_number
    #         getattr(cert, f"{prefix}thumbprint"),  # certificate_thumbprint
    #         datetime.strptime(getattr(cert, f"{prefix}valid_from"), "%Y-%m-%d %H:%M:%S"),  # certificate_valid_from
    #         datetime.strptime(getattr(cert, f"{prefix}valid_to"), "%Y-%m-%d %H:%M:%S"),    # certificate_valid_to
    #         analysis_time                         # analysis_date
    #     ]
    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            signing_info = self.extract()
            if signing_info is None:
                return None
                
            current_time = datetime.now(timezone.utc)
            
            # Prepare data for redb_pe_signatures table
            signatures_data = [[
                self.sha256,                                    # sha256
                self.md5,                                       # md5
                self.sha1,                                      # sha1
                signing_info.signature_verified,                # signature_verified
                datetime.strptime(signing_info.date_signed, "%Y-%m-%d %H:%M:%S") if signing_info.date_signed else None,  # date_signed
                signing_info.number_of_certificates,            # number_of_certificates
                signing_info.spcSpOpusInfo.get('ProgramName', None) if signing_info.spcSpOpusInfo else None,  # program_name
                signing_info.spcSpOpusInfo.get('MoreInfo', None) if signing_info.spcSpOpusInfo else None,    # more_info
                current_time                                    # analysis_date
            ]]

            # Prepare data for redb_pe_certificates table
            certificates_data = []
            
            # Process signers
            if signing_info.signers:
                for signer in signing_info.signers:
                    certificates_data.append(self._prepare_certificate_data(signer, 'signer', current_time))
            
            # Process countersigners
            if signing_info.countersigners:
                for csigner in signing_info.countersigners:
                    certificates_data.append(self._prepare_certificate_data(csigner, 'countersigner', current_time))
            
            # Process x509 certificates
            if signing_info.x509_certificates:
                for cert in signing_info.x509_certificates:
                    certificates_data.append(self._prepare_certificate_data(cert, 'chain', current_time))
            
            return {
                'multi_table': True,
                'signatures': {
                    'table': 'redb_pe_signatures',
                    'data': signatures_data,
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'signature_verified', 'date_signed',
                        'number_of_certificates', 'spcSpOpusInfo_program_name', 'spcSpOpusInfo_more_info', 'analysis_date'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'Boolean', 'DateTime64(3, \'UTC\')', 'UInt8',
                        'Nullable(String)', 'Nullable(String)', 'DateTime64(3, \'UTC\')'
                    ]
                },
                'certificates': {
                    'table': 'redb_pe_certificates',
                    'data': certificates_data,
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'certificate_type', 'certificate_algorithm',
                        'certificate_issuer', 'certificate_subject', 'certificate_serial_number',
                        'certificate_thumbprint', 'certificate_valid_from', 'certificate_valid_to',
                        'analysis_date'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'Enum8(\'signer\' = 1, \'countersigner\' = 2, \'chain\' = 3)', 'LowCardinality(String)',
                        'LowCardinality(String)', 'LowCardinality(String)', 'String',
                        'String', 'DateTime64(3, \'UTC\')', 'DateTime64(3, \'UTC\')',
                        'DateTime64(3, \'UTC\')'
                    ]
                }
            }

    # def _prepare_certificate_data(self, cert, cert_type: str, analysis_time: datetime) -> List:
    #     """Helper method to prepare certificate data for ClickHouse"""
    #     self.log.debug(inspect.currentframe().f_code.co_name)
    #     prefix = "certificate_" if hasattr(cert, "certificate_algorithm") else "signer_"
        
    #     # Get serial number and clean it up - with strict handling
    #     serial_number = getattr(cert, f"{prefix}serial_number", "UNKNOWN")
    #     if not serial_number or not str(serial_number).strip():
    #         serial_number = "UNKNOWN"
    #     else:
    #         serial_number = serial_number.replace(':', '')
    #         if not serial_number.strip():  # Double check after cleaning
    #             serial_number = "UNKNOWN"
        
    #     return [
    #         self.sha256,                          # sha256
    #         self.md5,                             # md5
    #         self.sha1,                            # sha1
    #         cert_type,                            # certificate_type
    #         getattr(cert, f"{prefix}algorithm"),   # certificate_algorithm
    #         getattr(cert, f"{prefix}issuer"),     # certificate_issuer
    #         getattr(cert, f"{prefix}subject"),    # certificate_subject
    #         serial_number,                        # certificate_serial_number
    #         getattr(cert, f"{prefix}thumbprint"),  # certificate_thumbprint
    #         datetime.strptime(getattr(cert, f"{prefix}valid_from"), "%Y-%m-%d %H:%M:%S"),  # certificate_valid_from
    #         datetime.strptime(getattr(cert, f"{prefix}valid_to"), "%Y-%m-%d %H:%M:%S"),    # certificate_valid_to
    #         analysis_time                         # analysis_date
    #     ]

    def _prepare_certificate_data(self, cert, cert_type: str, analysis_time: datetime) -> List:
        """Helper method to prepare certificate data for ClickHouse"""
        self.log.debug(inspect.currentframe().f_code.co_name)
        prefix = "certificate_" if hasattr(cert, "certificate_algorithm") else "signer_"
        
        def clean_string(value, field_name):
            if value is None or (isinstance(value, str) and not value.strip()):
                self.log.warning(f"Empty or None value found for {field_name}")
                return "UNKNOWN"
            return str(value).strip()
        
        try:
            serial_number = getattr(cert, f"{prefix}serial_number", "UNKNOWN")
            serial_number = clean_string(serial_number, "serial_number")
            if serial_number != "UNKNOWN":
                serial_number = serial_number.replace(':', '')
        
            return [
                clean_string(self.sha256, "sha256"),
                clean_string(self.md5, "md5"),
                clean_string(self.sha1, "sha1"),
                cert_type,
                clean_string(getattr(cert, f"{prefix}algorithm"), "algorithm"),
                clean_string(getattr(cert, f"{prefix}issuer"), "issuer"),
                clean_string(getattr(cert, f"{prefix}subject"), "subject"),
                serial_number,
                clean_string(getattr(cert, f"{prefix}thumbprint"), "thumbprint"),
                datetime.strptime(getattr(cert, f"{prefix}valid_from"), "%Y-%m-%d %H:%M:%S"),
                datetime.strptime(getattr(cert, f"{prefix}valid_to"), "%Y-%m-%d %H:%M:%S"),
                analysis_time
            ]
        except Exception as e:
            self.log.error(f"Error preparing certificate data: {str(e)}")
            self.log.error(f"Certificate data that caused error: {cert}")
            raise

    def get_clickhouse_table(self) -> str:
        """Required by PEExtractor abstract base class"""
        return "redb_pe_signatures"  # Return the primary table

    def get_clickhouse_tables(self) -> Dict[str, str]:
        """Additional method for multi-table support"""
        return {
            'signatures': 'redb_pe_signatures',
            'certificates': 'redb_pe_certificates'
        }