Mahtab Mirmohseni

168 papers A* 1B 20C 1Journal 115Unranked 31
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Wirel. Commun.
Marziyeh Soltani, Mahtab Mirmohseni, Panos Papadimitratos
2026 J jnl
IEEE Trans. Inf. Theory
Masoud Kavian, Mohammad Mahdi Mojahedian, Mohammad Hossein Yassaee, Mahtab Mirmohseni, Mohammad Reza Aref
2025 J jnl
IEEE Trans. Cogn. Commun. Netw.
Hamid Amiriara, Mahtab Mirmohseni, Ahmed Elzanaty, Yi Ma, Rahim Tafazolli
2025 B conf
WCNC
Hamid Amiriara, Mahtab Mirmohseni, Ahmed Elzanaty, Yi Ma, Rahim Tafazolli
2025 J jnl
CoRR
Laura Crosara, Mahtab Mirmohseni, Stefano Tomasin
2025 J jnl
Int. J. Inf. Sec.
Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2025 conf
ICC
Moustafa Rahal, Ahmed Elzanaty, Mahtab Mirmohseni, Yi Ma
2025 J jnl
IEEE Trans. Commun.
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2025 conf
SPAWC
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2025 J jnl
CoRR
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2025 conf
SPAWC
Hamid Amiriara, Mahtab Mirmohseni, Rahim Tafazolli
2025 J jnl
CoRR
Hamid Amiriara, Mahtab Mirmohseni, Rahim Tafazolli
2025 J jnl
Ad Hoc Networks
Hamid Amiriara, Farid Ashtiani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Behrouz Maham
2025 J jnl
CoRR
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2025 J jnl
CoRR
Denis Kozlov, Mahtab Mirmohseni, Rahim Tafazolli
2024 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Sahar Shahbaz, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2024 J jnl
CoRR
Hamid Amiriara, Mahtab Mirmohseni, Farid Ashtiani, Masoumeh Nasiri-Kenari
2024 J jnl
IEEE Open J. Commun. Soc.
Hamid Amiriara, Mahtab Mirmohseni, Farid Ashtiani, Masoumeh Nasiri-Kenari, Behrouz Maham
2024 J jnl
IEEE Trans. Mob. Comput.
Kiarash Kazari, Farid Ashtiani, Mahtab Mirmohseni
2024 J jnl
CoRR
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2024 J jnl
IEEE Trans. Green Commun. Netw.
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Mohammad Reza Aref
2024 J jnl
CoRR
Aryan Abbasian, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2024 conf
GLOBECOM (Workshops)
Alireza Ghazavi Khorasgani, Mahtab Mirmohseni, Ahmed Elzanaty
2024 J jnl
CoRR
Alireza Ghazavi Khorasgani, Mahtab Mirmohseni, Ahmed Elzanaty
2024 J jnl
IEEE Open J. Commun. Soc.
Elmira Shahraki, Mahtab Mirmohseni, Hengameh Keshavarz
2024 B conf
ITW
Denis Kozlov, Mahtab Mirmohseni, Rahim Tafazolli
2024 J jnl
CoRR
Denis Kozlov, Mahtab Mirmohseni, Rahim Tafazolli
2024 B conf
ITW
Masoud Kavian, Mohammad Mahdi Mojahedian, Mohammad Hossein Yassaee, Mahtab Mirmohseni, Mohammad Reza Aref
2024 J jnl
CoRR
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Behrouz Maham, Umberto Spagnolini
2023 J jnl
IEEE Access
Ali Etemadi, Maryam Farahnak-Ghazani, Hamidreza Arjmandi, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2023 J jnl
IEEE Open J. Commun. Soc.
Ali H. Abdollahi Bafghi, Vahid Jamali, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2023 J jnl
IEEE Trans. Veh. Technol.
Hamid Amiriara, Farid Ashtiani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2023 J jnl
IEEE Internet Things J.
Ladan Khaloopour, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2023 conf
GLOBECOM (Workshops)
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2023 J jnl
CoRR
Marziyeh Soltani, Mahtab Mirmohseni, Rahim Tafazolli
2023 J jnl
CoRR
Masoud Kavian, Mohammad Mahdi Mojahedian, Mohammad Hossein Yassaee, Mahtab Mirmohseni, Mohammad Reza Aref
2022 conf
IWCIT
Sahar Shahbaz, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2022 J jnl
CoRR
Ali Etemadi, Maryam Farahnak-Ghazani, Hamidreza Arjmandi, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2022 J jnl
Entropy
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2022 B conf
ISIT
Amir Masoud Jafarpisheh, Mahtab Mirmohseni, Mohammad Ali Maddah-Ali
2022 J jnl
CoRR
Amir Masoud Jafarpisheh, Mahtab Mirmohseni, Mohammad Ali Maddah-Ali
2022 J jnl
CoRR
Hamid Amiriara, Farid Ashtiani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2022 J jnl
CoRR
Elmira Shahraki, Mahtab Mirmohseni, Hengameh Keshavarz
2022 J jnl
CoRR
Reza Abbasalipour, Mahtab Mirmohseni
2021 J jnl
CoRR
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Mohammad Reza Aref
2021 conf
IWCIT
Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2021 J jnl
CoRR
Maryam Farahnak-Ghazani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2021 B conf
ICCCN
Marziyeh Soltani, Mahtab Mirmohseni, Panos Papadimitratos
2021 J jnl
CoRR
Marziyeh Soltani, Mahtab Mirmohseni, Panos Papadimitratos
2021 J jnl
CoRR
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2021 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Maryam Farahnak-Ghazani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2021 J jnl
IEEE Trans. Green Commun. Netw.
Seyed Mohammad Mortazavi, Farid Ashtiani, Mahtab Mirmohseni
2021 J jnl
CoRR
Ali Khalesi, Mahtab Mirmohseni, Mohammad Ali Maddah-Ali
2021 J jnl
IEEE J. Sel. Areas Inf. Theory
Ali Khalesi, Mahtab Mirmohseni, Mohammad Ali Maddah-Ali
2020 conf
IWCIT
Ladan Khaloopour, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2020 J jnl
CoRR
Hamidreza Ehteram, Mohammad Ali Maddah-Ali, Mahtab Mirmohseni
2020 J jnl
IEEE Wirel. Commun. Lett.
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Farid Ashtiani, Masoumeh Nasiri-Kenari
2020 J jnl
CoRR
Maryam Farahnak-Ghazani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2020 J jnl
IEEE Trans. Commun.
Nastaran Abadi Khooshemehr, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2020 J jnl
CoRR
Farhad Mirkarimi, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2020 B conf
PIMRC
Milad Abolpour, Sonia Aïssa, Mahtab Mirmohseni, Mohammad Reza Aref
2020 J jnl
IEEE Wirel. Commun. Lett.
Sina Aeeneh, Nikola Zlatanov, Amin Gohari, Masoumeh Nasiri-Kenari, Mahtab Mirmohseni
2019 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Nafiseh Ghoroghchian, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2019 J jnl
CoRR
Ladan Khaloopour, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2019 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Ladan Khaloopour, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2019 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Ladan Khaloopour, Seyed Vahid Rouzegar, Alireza Azizi, Amir Hosseinian, Maryam Farahnak-Ghazani, Nahal Bagheri, Mahtab Mirmohseni, Hamidreza Arjmandi, Reza Mosayebi, Masoumeh Nasiri-Kenari
2019 J jnl
IEEE Trans. Veh. Technol.
Fatemeh Mokhtari, Mohammad Robat Mili, Farzad Eslami, Farid Ashtiani, Behrooz Makki, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Tommy Svensson
2019 J jnl
IEEE Trans. Commun.
Maryam Farahnak-Ghazani, Gholamali Aminian, Mahtab Mirmohseni, Amin Gohari, Masoumeh Nasiri-Kenari
2019 J jnl
CoRR
Milad Abolpour, Mahtab Mirmohseni, Mohammad Reza Aref
2019 conf
IWCIT
Milad Abolpour, Mahtab Mirmohseni, Mohammad Reza Aref
2019 J jnl
CoRR
Milad Abolpour, Mahtab Mirmohseni, Mohammad Reza Aref
2019 B conf
ITW
Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2019 J jnl
CoRR
Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2019 B conf
ISIT
Mohammad Hossein Mousavi, Mohammad Ali Maddah-Ali, Mahtab Mirmohseni
2019 J jnl
CoRR
Mohammad Hossein Mousavi, Mohammad Ali Maddah-Ali, Mahtab Mirmohseni
2019 conf
IWCIT
Fatemeh Mokhtari, Mahtab Mirmohseni, Farid Ashtiani, Masoumeh Nasiri-Kenari
2018 conf
IWCIT
Ladan Khaloopour, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2018 conf
IWCIT
Farzan Karami, Mahtab Mirmohseni, Farid Ashtiani
2018 J jnl
CoRR
Hamid G. Bafghi, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2018 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Hamid G. Bafghi, Amin Gohari, Mahtab Mirmohseni, Gholamali Aminian, Masoumeh Nasiri-Kenari
2018 conf
GLOBECOM Workshops
Shahab Jahanbazi, Mahtab Mirmohseni
2018 J jnl
Ad Hoc Networks
Mahmood Mohassel Feghhi, Aliazam Abbasfar, Mahtab Mirmohseni
2018 J jnl
IEEE Trans. Inf. Theory
Hamid Ghourchian, Gholamali Aminian, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2018 J jnl
IEEE Trans. Green Commun. Netw.
Milad Rezaee, Mahtab Mirmohseni, Vaneet Aggarwal, Mohammad Reza Aref
2018 conf
IWCIT
Mahtab Mirmohseni, Mohammad Ali Maddah-Ali
2018 conf
GLOBECOM Workshops
Farhad Nouri, Farid Ashtiani, Mahtab Mirmohseni
2018 conf
IWCIT
Javad Gholipour, Mahtab Mirmohseni, Babak Seyfe, Mohammad Reza Aref
2018 J jnl
IEEE Trans. Commun.
Reza Mosayebi, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2018 conf
IWCIT
Nastaran Abadi, Amin Aminzadeh Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2017 J jnl
J. Commun. Inf. Networks
Seyed Salman Sajjadi GhaemMaghami, Afrooz Haghbin, Mahtab Mirmohseni
2017 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Hamidreza Arjmandi, Mohammad Movahednasab, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Faramarz Fekri
2017 J jnl
CoRR
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Mohammad Reza Aref
2017 conf
IWCIT
Ali H. Abdollahi Bafghi, Mahtab Mirmohseni, Mohammad Reza Aref
2017 conf
ISCISC
Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2017 J jnl
IEEE Wirel. Commun. Lett.
Milad Rezaee, Mahtab Mirmohseni, Mohammad Reza Aref
2017 J jnl
CoRR
Milad Rezaee, Mahtab Mirmohseni, Mohammad Reza Aref
2017 J jnl
CoRR
Hamid Ghourchian, Gholamali Aminian, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2017 conf
IWCIT
Gholamali Aminian, Hamid Ghourchian, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2017 conf
ISCISC
Ali Soleimani, Mahtab Mirmohseni, Mohammad Reza Aref
2017 J jnl
Int. J. Commun. Syst.
Mahmood Mohassel Feghhi, Mahtab Mirmohseni, Aliazam Abbasfar
2017 J jnl
CoRR
Mahtab Mirmohseni, Mohammad Ali Maddah-Ali
2017 J jnl
IEEE Trans. Inf. Theory
Mahtab Mirmohseni, Panagiotis Papadimitratos
2016 B conf
PIMRC
Amir Mohammad Hatami, Mahtab Mirmohseni, Farid Ashtiani
2016 conf
IWCIT
Milad Rezaee, Mahtab Mirmohseni, Mohammad Reza Aref
2016 J jnl
CoRR
Hamid G. Bafghi, Babak Seyfe, Mahtab Mirmohseni, Mohammad Reza Aref
2016 J jnl
IEEE J. Sel. Areas Commun.
Milad Rezaee, Mahtab Mirmohseni, Mohammad Reza Aref
2016 B conf
PIMRC
Shirin Goshtasbpour, Farid Ashtiani, Mahtab Mirmohseni
2016 J jnl
CoRR
Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2016 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2016 J jnl
CoRR
Seyed Salman Sajjadi GhaemMaghami, Afrooz Haghbin, Mahtab Mirmohseni
2016 J jnl
Trans. Emerg. Telecommun. Technol.
Hamid G. Bafghi, Babak Seyfe, Mahtab Mirmohseni, Mohammad Reza Aref
2016 J jnl
CoRR
Milad Rezaee, Mahtab Mirmohseni, Vaneet Aggarwal, Mohammad Reza Aref
2016 J jnl
CoRR
Maryam Farahnak-Ghazani, Gholamali Aminian, Mahtab Mirmohseni, Amin Gohari, Masoumeh Nasiri-Kenari
2016 conf
IWCIT
Maryam Farahnak-Ghazani, Gholamali Aminian, Mahtab Mirmohseni, Amin Gohari, Masoumeh Nasiri-Kenari
2016 J jnl
CoRR
Amir Hossein Hadavi, Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2016 conf
IWCIT
Amir Hossein Hadavi, Narges Kazempour, Mahtab Mirmohseni, Mohammad Reza Aref
2016 J jnl
ISC Int. J. Inf. Secur.
Seyed Salman Sajjadi GhaemMaghami, Afrooz Haghbin, Mahtab Mirmohseni
2016 J jnl
CoRR
Reza Mosayebi, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2016 conf
IWCIT
Reza Mosayebi, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari
2015 J jnl
CoRR
Seyed Salman Sajjadi GhaemMaghami, Mahtab Mirmohseni, Afrooz Haghbin
2015 J jnl
CoRR
Milad Rezaee, Reza Kaboli, Mahtab Mirmohseni, Mohammad Reza Aref
2015 conf
ISWCS
Milad Rezaee, Reza Kaboli, Mahtab Mirmohseni, Mohammad Reza Aref
2015 J jnl
IET Commun.
Hamid G. Bafghi, Babak Seyfe, Mahtab Mirmohseni, Mohammad Reza Aref
2015 J jnl
CoRR
Hamidreza Arjmandi, Mohammad Movahednasab, Amin Gohari, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Faramarz Fekri
2015 J jnl
CoRR
Hamid G. Bafghi, Mahtab Mirmohseni, Babak Seyfe, Mohammad Reza Aref
2015 J jnl
CoRR
Gholamali Aminian, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Faramarz Fekri
2015 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Gholamali Aminian, Maryam Farahnak-Ghazani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Faramarz Fekri
2015 J jnl
CoRR
Gholamali Aminian, Maryam Farahnak-Ghazani, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Faramarz Fekri
2015 B conf
ISIT
Gholamali Aminian, Mahtab Mirmohseni, Masoumeh Nasiri-Kenari, Faramarz Fekri
2015 J jnl
IACR Cryptol. ePrint Arch.
Seyed Salman Sajjadi GhaemMaghami, Afrooz Haghbin, Mahtab Mirmohseni
2014 J jnl
CoRR
Mahtab Mirmohseni, Panagiotis Papadimitratos
2014 B conf
ISIT
Mahtab Mirmohseni, Panagiotis Papadimitratos
2014 conf
ICUMT
Pedram Kheirkhah Sangdeh, Mahtab Mirmohseni, Mohammad Ali Akhaee
2014 conf
IWCIT
Mahtab Mirmohseni, Panagiotis Papadimitratos
2014 conf
ICUMT
Pedram Kheirkhah Sangdeh, Mahtab Mirmohseni, Mohammad Ali Akhaee
2014 J jnl
CoRR
Mahmood Mohassel Feghhi, Aliazam Abbasfar, Mahtab Mirmohseni
2014 J jnl
IET Commun.
Mahmood Mohassel Feghhi, Aliazam Abbasfar, Mahtab Mirmohseni
2014 J jnl
CoRR
Mahmood Mohassel Feghhi, Mahtab Mirmohseni, Aliazam Abbasfar
2014 A* conf
INFOCOM
Mahtab Mirmohseni, Panagiotis Papadimitratos
2014 J jnl
IET Commun.
Nahid Ardalani, Mahtab Mirmohseni, Mohammad Reza Aref
2013 J jnl
CoRR
Mahtab Mirmohseni, Panagiotis Papadimitratos
2013 conf
IWCIT
Zahra Shakeri, Arman Fazeli Chaghooshi, Mahtab Mirmohseni, Mohammad Reza Aref
2013 J jnl
CoRR
Ali Bereyhi, Mohsen Bahrami, Mahtab Mirmohseni, Mohammad Reza Aref
2013 B conf
ISIT
Ali Bereyhi, Mohsen Bahrami, Mahtab Mirmohseni, Mohammad Reza Aref
2013 J jnl
IEEE Trans. Inf. Forensics Secur.
Sadaf Salehkalaibar, Mahtab Mirmohseni, Mohammad Reza Aref
2013 J jnl
CoRR
Mahmood Mohassel Feghhi, Aliazam Abbasfar, Mahtab Mirmohseni
2013 conf
IWCIT
Mahmood Mohassel Feghhi, Aliazam Abbasfar, Mahtab Mirmohseni
2013 J jnl
CoRR
Mahtab Mirmohseni, Panagiotis Papadimitratos
2013 J jnl
CoRR
Mohsen Bahrami, Ali Bereyhi, Mahtab Mirmohseni, Mohammad Reza Aref
2012 J jnl
CoRR
Hamid G. Bafghi, Babak Seyfe, Mahtab Mirmohseni, Mohammad Reza Aref
2012 J jnl
IEEE Trans. Inf. Theory
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2012 J jnl
CoRR
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2012 B conf
ITW
Hamid G. Bafghi, Babak Seyfe, Mahtab Mirmohseni, Mohammad Reza Aref
2012 J jnl
CoRR
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2012 J jnl
IET Commun.
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2011 J jnl
CoRR
Mohammad Ali Tebbi, Mahtab Mirmohseni, Mahmoud Ahmadian-Attari, Mohammad Reza Aref
2011 J jnl
CoRR
Mohammad Ali Tebbi, Mahtab Mirmohseni, Mahmoud Ahmadian-Attari, Mohammad Reza Aref
2011 J jnl
EURASIP J. Wirel. Commun. Netw.
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2011 J jnl
IEEE Commun. Lett.
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2010 C conf
ISITA
Bahareh Akhbari, Mahtab Mirmohseni, Mohammad Reza Aref
2010 B conf
ITW
Mahtab Mirmohseni, Bahareh Akhbari, Mohammad Reza Aref
2010 J jnl
IET Commun.
Bahareh Akhbari, Mahtab Mirmohseni, Mohammad Reza Aref
2010 J jnl
CoRR
Bahareh Akhbari, Mahtab Mirmohseni, Mohammad Reza Aref
2010 B conf
ISIT
Bahareh Akhbari, Mahtab Mirmohseni, Mohammad Reza Aref
2009 B conf
ISIT
Amir Salimi, Mahtab Mirmohseni, Mohammad Reza Aref
2009 B conf
ISIT
Bahareh Akhbari, Mahtab Mirmohseni, Mohammad Reza Aref
2009 B conf
ISIT
Reza Khosravi-Farsani, Bahareh Akhbari, Mahtab Mirmohseni, Mohammad Reza Aref
2009 B conf
ISIT
Reza Khosravi-Farsani, Mahtab Mirmohseni, Bahareh Akhbari, Hamed Firouzi, Mohammad Reza Aref
tests/unit/test_apk_strings_ioc.py
← Index tests/unit/test_apk_strings_ioc.py python
"""Tests for APK string extraction and IOC extraction integration.

Covers:
- APKCodeAnalyzer._extract_strings() — string extraction from DEX objects
- APKCodeAnalyzer._string_entropy() — Shannon entropy computation
- DecompileAPK strings export table schema
- IOCExtractorFromResults with APK-format analysis_results
- Worker IOC wiring for APK
"""
import os
import tempfile
from dataclasses import asdict
from unittest.mock import MagicMock, patch

import pytest

from redb.extractors.ioc_extractor.ioc_extractor import IOCExtractorFromResults
from redb.extractors.ioc_extractor.standalone_ioc_extractor import (
    IOCType,
    SourceType,
)

pytestmark = [pytest.mark.unit, pytest.mark.apk]


# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------

def _make_analyzer(min_instructions=1):
    """Create an APKCodeAnalyzer with mocked dependencies."""
    with patch(
        "redb.extractors.decompiler.apk.analyzer.JADXDecompiler"
    ), patch(
        "redb.extractors.decompiler.apk.analyzer.ApktoolDisassembler"
    ):
        from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer
        analyzer = APKCodeAnalyzer("/fake/path.apk")
        analyzer.min_instructions = min_instructions
        return analyzer


def _make_mock_dex(strings):
    """Create a mock DEX object that returns the given strings."""
    dex = MagicMock()
    dex.get_strings.return_value = strings
    return dex


def _create_fake_apk_file():
    """Create a temporary file to act as a fake APK."""
    fd, path = tempfile.mkstemp(suffix=".apk")
    os.write(fd, b"PK\x03\x04fake apk content for hashing")
    os.close(fd)
    return path


# ---------------------------------------------------------------------------
# Tests: _string_entropy
# ---------------------------------------------------------------------------

class TestStringEntropy:
    """Tests for Shannon entropy computation."""

    def test_empty_string(self):
        analyzer = _make_analyzer()
        assert analyzer._string_entropy("") == 0.0

    def test_single_char(self):
        analyzer = _make_analyzer()
        assert analyzer._string_entropy("a") == 0.0

    def test_repeated_char(self):
        analyzer = _make_analyzer()
        assert analyzer._string_entropy("aaaa") == 0.0

    def test_two_equal_chars(self):
        analyzer = _make_analyzer()
        # "ab" -> entropy = 1.0
        assert abs(analyzer._string_entropy("ab") - 1.0) < 0.01

    def test_higher_entropy(self):
        analyzer = _make_analyzer()
        # More variety = higher entropy
        low = analyzer._string_entropy("aabb")
        high = analyzer._string_entropy("abcd")
        assert high > low

    def test_url_string_entropy(self):
        analyzer = _make_analyzer()
        entropy = analyzer._string_entropy("https://evil.com/payload")
        assert entropy > 2.0  # URLs have moderate entropy


# ---------------------------------------------------------------------------
# Tests: _extract_strings
# ---------------------------------------------------------------------------

class TestExtractStrings:
    """Tests for DEX string extraction."""

    def test_basic_extraction(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["hello", "world"])
        result = analyzer._extract_strings([dex])

        assert len(result) == 2
        assert result[0]["string"] == "hello"
        assert result[1]["string"] == "world"

    def test_string_fields_present(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["test_string"])
        result = analyzer._extract_strings([dex])

        entry = result[0]
        assert "string" in entry
        assert "string_encoding" in entry
        assert "string_offset" in entry
        assert "string_length" in entry
        assert "string_entropy" in entry
        assert entry["string_encoding"] == "UTF8"
        assert entry["string_length"] == len("test_string")

    def test_deduplication_across_dex(self):
        """Same string in multiple DEX files is only extracted once."""
        analyzer = _make_analyzer()
        dex1 = _make_mock_dex(["shared", "unique1"])
        dex2 = _make_mock_dex(["shared", "unique2"])
        result = analyzer._extract_strings([dex1, dex2])

        string_values = [s["string"] for s in result]
        assert string_values.count("shared") == 1
        assert "unique1" in string_values
        assert "unique2" in string_values
        assert len(result) == 3

    def test_empty_strings_filtered(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["", "valid", None, "also_valid"])
        result = analyzer._extract_strings([dex])

        string_values = [s["string"] for s in result]
        assert "" not in string_values
        assert None not in string_values
        assert "valid" in string_values
        assert "also_valid" in string_values

    def test_no_dex_files(self):
        analyzer = _make_analyzer()
        result = analyzer._extract_strings([])
        assert result == []

    def test_dex_get_strings_returns_none(self):
        analyzer = _make_analyzer()
        dex = MagicMock()
        dex.get_strings.return_value = None
        result = analyzer._extract_strings([dex])
        assert result == []

    def test_dex_get_strings_exception(self):
        analyzer = _make_analyzer()
        dex = MagicMock()
        dex.get_strings.side_effect = RuntimeError("corrupt DEX")
        result = analyzer._extract_strings([dex])
        assert result == []

    def test_entropy_computed(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["abcdefgh"])
        result = analyzer._extract_strings([dex])
        assert result[0]["string_entropy"] > 0.0

    def test_incremental_offsets(self):
        """String offsets are incremented sequentially."""
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["a", "b", "c"])
        result = analyzer._extract_strings([dex])

        offsets = [s["string_offset"] for s in result]
        assert offsets == [0, 1, 2]

    def test_url_strings_preserved(self):
        """URL strings are extracted without modification."""
        analyzer = _make_analyzer()
        dex = _make_mock_dex([
            "https://evil.com/payload",
            "http://c2.malware.org/gate",
        ])
        result = analyzer._extract_strings([dex])
        strings = [s["string"] for s in result]
        assert "https://evil.com/payload" in strings
        assert "http://c2.malware.org/gate" in strings


# ---------------------------------------------------------------------------
# Tests: strings in extract() integration
# ---------------------------------------------------------------------------

class TestExtractStringsIntegration:
    """Tests that strings are included in extract() results."""

    @patch("redb.extractors.decompiler.apk.analyzer.APKCodeAnalyzer._run_androguard")
    @patch("redb.extractors.decompiler.apk.analyzer.ApktoolDisassembler")
    @patch("redb.extractors.decompiler.apk.analyzer.JADXDecompiler")
    def test_extract_includes_strings(self, mock_jadx, mock_apktool, mock_androguard):
        from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer

        mock_dex = _make_mock_dex(["hello", "world"])
        mock_analysis = MagicMock()
        mock_analysis.get_methods.return_value = []
        mock_androguard.return_value = (MagicMock(), [mock_dex], mock_analysis)

        analyzer = APKCodeAnalyzer("/fake/path.apk", log=MagicMock())
        results = analyzer.extract()

        assert "strings" in results
        assert len(results["strings"]) == 2
        assert results["strings"][0]["string"] == "hello"
        analyzer.cleanup()

    @patch("redb.extractors.decompiler.apk.analyzer.APKCodeAnalyzer._run_androguard")
    @patch("redb.extractors.decompiler.apk.analyzer.ApktoolDisassembler")
    @patch("redb.extractors.decompiler.apk.analyzer.JADXDecompiler")
    def test_extract_strings_error_is_non_fatal(self, mock_jadx, mock_apktool, mock_androguard):
        from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer

        # Return a bad dex list that will cause _extract_strings to fail
        mock_analysis = MagicMock()
        mock_analysis.get_methods.return_value = []
        # dexs is not iterable — triggers the except block
        mock_androguard.return_value = (MagicMock(), 42, mock_analysis)

        analyzer = APKCodeAnalyzer("/fake/path.apk", log=MagicMock())
        results = analyzer.extract()

        # Should not crash, strings should be empty, error recorded
        assert results["strings"] == []
        assert any(
            e.get("error_location") == "strings"
            for e in results["analysis_errors"]
        )
        analyzer.cleanup()


# ---------------------------------------------------------------------------
# Tests: DecompileAPK strings export table
# ---------------------------------------------------------------------------

class TestDecompileAPKStringsExport:
    """Tests for strings table in DecompileAPK.prepare_export_data()."""

    def _make_extractor_with_strings(self, strings_data):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        ext = DecompileAPK(apk_path, MagicMock())
        ext.analysis_results = {
            "sha256": "a" * 64,
            "sha1": "b" * 40,
            "md5": "c" * 32,
            "decompiled_content": [],
            "decompiled_refs": [],
            "smali_content": [],
            "smali_refs": [],
            "similarity_metrics": [],
            "strings": strings_data,
            "analysis_errors": [],
        }
        return ext, apk_path

    def test_strings_table_present(self):
        ext, path = self._make_extractor_with_strings([
            {"string": "hello", "string_encoding": "UTF8",
             "string_offset": 0, "string_length": 5, "string_entropy": 2.32}
        ])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "strings_raw" in export
        finally:
            os.unlink(path)

    def test_strings_table_schema(self):
        ext, path = self._make_extractor_with_strings([
            {"string": "hello", "string_encoding": "UTF8",
             "string_offset": 0, "string_length": 5, "string_entropy": 2.32}
        ])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sr = export["strings_raw"]
            assert sr["table"] == "code_binja_strings_raw"
            assert len(sr["column_names"]) == 8
            assert len(sr["column_type_names"]) == 8
            assert "sha256" in sr["column_names"]
            assert "string" in sr["column_names"]
            assert "string_raw" in sr["column_names"]
            assert "string_encoding" in sr["column_names"]
            assert "string_offset" in sr["column_names"]
            assert "string_length" in sr["column_names"]
            assert "string_raw_length" in sr["column_names"]
            assert "string_entropy" in sr["column_names"]
            assert len(sr["data"]) == 1
            assert len(sr["data"][0]) == 8
        finally:
            os.unlink(path)

    def test_strings_sha256_propagated(self):
        ext, path = self._make_extractor_with_strings([
            {"string": "test", "string_encoding": "UTF8",
             "string_offset": 0, "string_length": 4, "string_entropy": 2.0}
        ])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            row = export["strings_raw"]["data"][0]
            assert row[0] == "a" * 64  # sha256 is first column
        finally:
            os.unlink(path)

    def test_empty_strings_not_exported(self):
        ext, path = self._make_extractor_with_strings([])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "strings_raw" not in export
        finally:
            os.unlink(path)


# ---------------------------------------------------------------------------
# Tests: IOCExtractorFromResults with APK format
# ---------------------------------------------------------------------------

class TestIOCExtractorAPKFormat:
    """Tests that IOCExtractorFromResults handles APK analysis_results."""

    def setup_method(self):
        self.log = MagicMock()

    def test_extract_iocs_from_apk_strings(self):
        """IOCs extracted from APK strings (same format as Binja)."""
        results = {
            "strings": [
                {"string": "https://evil.com/payload", "string_offset": 0},
                {"string": "Contact [email protected]", "string_offset": 1},
            ],
            "decompiled": [],
            "decompiled_content": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()

        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1
        assert any("evil.com" in i.ioc_value for i in url_iocs)

    def test_extract_iocs_from_apk_decompiled_content(self):
        """IOCs extracted from APK's decompiled_content key."""
        results = {
            "strings": [],
            "decompiled": [],  # Binja format — empty
            "decompiled_content": [  # APK format
                {
                    "decompiled_method": "connect('https://c2.malware.org/gate');",
                    "decompiled_method_hash": "hash123",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()

        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1

    def test_apk_library_methods_skipped(self):
        """LIBRARY methods in decompiled_content are skipped."""
        results = {
            "strings": [],
            "decompiled": [],
            "decompiled_content": [
                {
                    "decompiled_method": "https://should-skip.com",
                    "decompiled_method_hash": "lib_hash",
                    "method_type": "LIBRARY",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert len(iocs) == 0

    def test_combined_binja_and_apk_sources(self):
        """Both Binja and APK format decompiled entries are processed."""
        results = {
            "strings": [],
            "decompiled": [
                {
                    "decompiled_function": "call('https://binja.example.com');",
                    "decompiled_function_hash": "binja_hash",
                    "function_type": "USER",
                }
            ],
            "decompiled_content": [
                {
                    "decompiled_method": "send('https://apk.example.com');",
                    "decompiled_method_hash": "apk_hash",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()

        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        urls = [i.ioc_value for i in url_iocs]
        assert any("binja.example.com" in u for u in urls)
        assert any("apk.example.com" in u for u in urls)

    def test_apk_results_only(self):
        """Works when only APK keys are present (no 'decompiled' key)."""
        results = {
            "strings": [
                {"string": "https://evil.com", "string_offset": 0},
            ],
            "decompiled_content": [
                {
                    "decompiled_method": "x = 1",
                    "decompiled_method_hash": "h",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        # Should not crash, and should find URL from strings
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1

    def test_source_type_is_string_for_strings(self):
        results = {
            "strings": [
                {"string": "https://evil.com/test", "string_offset": 42},
            ],
            "decompiled_content": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert url_iocs[0].source_type == SourceType.STRING
        assert url_iocs[0].source_identifier == "42"

    def test_source_type_is_decompiled_for_methods(self):
        results = {
            "strings": [],
            "decompiled_content": [
                {
                    "decompiled_method": "https://evil.com/method",
                    "decompiled_method_hash": "myhash",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert url_iocs[0].source_type == SourceType.DECOMPILED_FUNCTION
        assert url_iocs[0].source_identifier == "myhash"


# ---------------------------------------------------------------------------
# Tests: Worker IOC wiring for APK
# ---------------------------------------------------------------------------

class TestWorkerAPKIOCWiring:
    """Tests that workers.py wires IOC extraction for APK."""

    def test_worker_source_contains_ioc_for_apk(self):
        """Verify workers.py source has IOC extraction in APK branch."""
        import inspect
        from redb import workers
        source = inspect.getsource(workers)
        # APK branch should import IOCExtractorFromResults
        assert "IOCExtractorFromResults" in source
        # Should be in the APK section (near DecompileAPK)
        apk_section = source[source.index("DecompileAPK("):]
        ioc_pos = apk_section.find("IOCExtractorFromResults")
        assert ioc_pos != -1, "IOCExtractorFromResults not found after DecompileAPK"