Oussama Habachi

74 papers A 4B 14C 2Misc 2Journal 30Unranked 19
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Samar Chebbi, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi, Essaid Sabir
2025 J jnl
Comput. Networks
Samar Chebbi, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi, Essaid Sabir
2025 B conf
IWCMC
Karidja Dominique Christelle Adje, Oussama Habachi, Gérard Chalhoub, Asma Ben Letaifa, Majed Haddad
2025 A conf
MSWiM
Oussama Habachi
2025 conf
VTC2025-Spring
Ibtissem Oueslati, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi, Essaid Sabir
2025 J jnl
CoRR
Mariem Zayene, Oussama Habachi, Gérard Chalhoub
2024 conf
UNet
Samar Chebbi, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2024 Misc conf
SoftCOM
Samar Chebbi, Oussama Habachi, Essaid Sabir, Jean-Pierre Cances, Vahid Meghdadi
2024 B conf
WCNC
Ibtissem Oueslati, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2024 B conf
IWCMC
Ibrahim Sammour, Gérard Chalhoub, Oussama Habachi
2024 J jnl
Comput. Networks
Ibtissem Oueslati, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2024 J jnl
EURASIP J. Wirel. Commun. Netw.
Amani Benamor, Oussama Habachi, Inès Kammoun, Jean-Pierre Cances
2024 B conf
IWCMC
Amani Benamor, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2024 J jnl
Comput. Networks
Amani Benamor, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2024 ed.
UNet
Oussama Habachi, Gérard Chalhoub, Halima Elbiaze, Essaid Sabir
2023 B conf
WCNC
Amani Benamor, Oussama Habachi, Inès Kammoun, Jean-Pierre Cances
2023 conf
UNet
Ibtissem Oueslati, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi, Essaid Sabir
2023 J jnl
IEEE Access
Karidja Dominique Christelle Adje, Asma Ben Letaifa, Majed Haddad, Oussama Habachi
2023 conf
UNet
Karidja Dominique Christelle Adje, Oussama Habachi, Asma Ben Letaifa, Majed Haddad
2023 conf
MobiWac
Samar Chebbi, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2023 J jnl
IEEE Trans. Netw. Serv. Manag.
Piotr Wiecek, Oussama Habachi, Majed Haddad
2022 B conf
WiOpt
Sami Nadif, Essaid Sabir, Halima Elbiaze, Oussama Habachi, Abdelkrim Haqiq
2022 J jnl
CoRR
Majed Haddad, Piotr Wiecek, Oussama Habachi, Samir M. Perlaza, Shahid Mehraj Shah
2022 A conf
MSWiM
Majed Haddad, Piotr Wiecek, Oussama Habachi, Samir M. Perlaza, Shahid Mehraj Shah
2022 J jnl
IEEE Trans. Wirel. Commun.
Amani Benamor, Oussama Habachi, Inès Kammoun, Jean-Pierre Cances
2022 C conf
IPCCC
Amani Benamor, Oussama Habachi, Inès Kammoun, Jean-Pierre Cances
2021 J jnl
Sensors
Manel Kortas, Oussama Habachi, Ammar Bouallegue, Vahid Meghdadi, Tahar Ezzedine, Jean-Pierre Cances
2020 conf
ICC
Amani Benamor, Oussama Habachi, Inès Kammoun, Jean-Pierre Cances
2020 J jnl
IEEE Access
Manel Kortas, Oussama Habachi, Ammar Bouallegue, Vahid Meghdadi, Tahar Ezzedine, Jean-Pierre Cances
2020 ed.
UNet
Oussama Habachi, Vahid Meghdadi, Essaid Sabir, Jean-Pierre Cances
2019 J jnl
IEEE Access
Mariem Zayene, Oussama Habachi, Vahid Meghdadi, Tahar Ezzedine, Jean-Pierre Cances
2019 conf
UNet
Elahe Radmanesh, Mehdi Delrobaei, Oussama Habachi, Somayyeh Chamani, Yannis Pousset, Vahid Meghdadi
2019 Misc conf
SoftCOM
Manel Kortas, Oussama Habachi, Ammar Bouallegue, Vahid Meghdadi, Tahar Ezzedine, Jean-Pierre Cances
2019 conf
UNet
Nicolas Aragon, Jean-Pierre Cances, Imad El Qachchach, Philippe Gaborit, Oussama Habachi
2019 conf
UNet
Oussama Habachi, Mohamed-Ali Adjif, Jean-Pierre Cances
2019 J jnl
CoRR
Oussama Habachi, Mohamed-Ali Adjif, Jean-Pierre Cances
2019 conf
UNet
Mohamad Mostafa, Mohammad Saeed Dayari, Somayyeh Chamaani, Vahid Meghdadi, Oussama Habachi, Yannis Pousset
2019 conf
WCNC Workshops
Mohamed-Ali Adjif, Oussama Habachi, Jean-Pierre Cances
2018 C conf
WINCOM
Oussama Habachi, Vahid Meghdadi, Jean-Pierre Cances
2018 conf
INFOCOM Workshops
Majed Haddad, Piotr Wiecek, Oussama Habachi
2018 B conf
WCNC
Mariem Zayene, Oussama Habachi, Vahid Meghdadi, Tahar Ezzeddine, Jean-Pierre Cances
2018 B conf
WCNC
Imad El Qachchach, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2018 B conf
WCNC
Imad El Qachchach, Abdul-Karim Yazbek, Oussama Habachi, Jean-Pierre Cances, Vahid Meghdadi
2018 J jnl
Telecommun. Syst.
Oussama Habachi, Yezekael Hayel, Rachid El Azouzi
2017 J jnl
CoRR
Ahmad Abboud, Oussama Habachi, Ali H. Jaber, Jean-Pierre Cances, Vahid Meghdadi
2017 conf
UNet
Ahmad Abboud, Oussama Habachi, Ali H. Jaber, Jean-Pierre Cances, Vahid Meghdadi
2017 conf
IINTEC
Manel Kortas, Ammar Bouallegue, Tahar Ezzeddine, Vahid Meghdadi, Oussama Habachi, Jean-Pierre Cances
2017 conf
IINTEC
Mariem Zayene, Oussama Habachi, Vahid Meghdadi, Tahar Ezzeddine, Jean-Pierre Cances
2017 conf
ICC
Mariem Zayene, Oussama Habachi, Vahid Meghdadi, Tahar Ezzeddine, Jean-Pierre Cances
2017 B conf
PIMRC
Manel Kortas, Vahid Meghdadi, Ammar Bouallegue, Tahar Ezzeddine, Oussama Habachi, Jean-Pierre Cances
2017 J jnl
CoRR
Raja Naeem Akram, Konstantinos Markantonakis, Keith Mayes, Oussama Habachi, Damien Sauveron, Andreas Steyven, Serge Chaumette
2016 J jnl
IEEE Trans. Commun.
Majed Haddad, Piotr Wiecek, Oussama Habachi, Yezekael Hayel
2016 J jnl
CoRR
Oussama Habachi, Yezekael Hayel, Rachid El Azouzi
2015 J jnl
Int. J. Control
Konstantin Avrachenkov, Oussama Habachi, Alexei B. Piunovskiy, Yi Zhang
2015 J jnl
IEEE Trans. Veh. Technol.
Majed Haddad, Yezekael Hayel, Oussama Habachi
2015 J jnl
CoRR
Piotr Wiecek, Majed Haddad, Oussama Habachi, Yezekael Hayel
2015 B conf
Networking
Piotr Wiecek, Majed Haddad, Oussama Habachi, Yezekael Hayel
2014 B conf
WiOpt
Majed Haddad, Piotr Wiecek, Oussama Habachi, Yezekael Hayel
2014 J jnl
CoRR
Majed Haddad, Piotr Wiecek, Oussama Habachi, Yezekael Hayel
2014 J jnl
SIGMETRICS Perform. Evaluation Rev.
Majed Haddad, Oussama Habachi, Piotr Wiecek, Yezekael Hayel
2013 J jnl
CoRR
Majed Haddad, Piotr Wiecek, Oussama Habachi
2013 B conf
WCNC
Oussama Habachi
2013 J jnl
IEEE Trans. Wirel. Commun.
Oussama Habachi, Rachid El Azouzi, Yezekael Hayel
2013 A conf
ICME
Oussama Habachi, Nicholas Mastronarde, Hsien-Po Shiang, Mihaela van der Schaar, Yezekael Hayel
2013 J jnl
CoRR
Konstantin Avrachenkov, Oussama Habachi, Alexei B. Piunovskiy, Yi Zhang
2013 J jnl
IEEE Trans. Signal Process.
Oussama Habachi, Hsien-Po Shiang, Mihaela van der Schaar, Yezekael Hayel
2013 conf
VTC Fall
Yezekael Hayel, Majed Haddad, Oussama Habachi
2012 J jnl
IEEE J. Sel. Areas Commun.
Oussama Habachi, Yusuo Hu, Mihaela van der Schaar, Yezekael Hayel, Feng Wu
2012 B conf
GLOBECOM
Oussama Habachi, Yezekael Hayel, Rachid El Azouzi
2012 J jnl
IET Commun.
Oussama Habachi, Yezekael Hayel
2012
Oussama Habachi
2012 conf
ICC
Oussama Habachi, Yusuo Hu, Mihaela van der Schaar, Yezekael Hayel, Feng Wu
2011 conf
Wireless Days
Oussama Habachi, Rachid El Azouzi, Yezekael Hayel
2010 A conf
MSWiM
Oussama Habachi, Yezekael Hayel
tests/unit/test_apk_method_extractor.py
← Index tests/unit/test_apk_method_extractor.py python
"""
Unit tests for APK method-level content extraction, hashing, and similarity.

Tests SHA-256 normalization, ssdeep/TLSH computation, obfuscation detection,
and Dalvik-to-Java type conversion.
"""
import pytest

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


class TestHashingFunctions:
    """Tests for hashing utility functions."""

    def test_sha256_deterministic(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        h1 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        h2 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        assert h1 == h2

    def test_sha256_hex_length(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert len(compute_sha256("test")) == 64

    def test_sha256_different_inputs(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert compute_sha256("aaa") != compute_sha256("bbb")

    def test_ssdeep_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_ssdeep
        assert compute_ssdeep("short") is None

    def test_tlsh_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_tlsh
        assert compute_tlsh("x") is None


class TestObfuscationDetection:
    """Tests for obfuscation indicator detection."""

    def test_short_method_name_single_char(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("a", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_short_method_name_two_chars(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("ab", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_normal_method_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("onCreate", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is False

    def test_short_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/a;", "", 10)
        assert r["short_class_name"] is True

    def test_normal_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/example/MainActivity;", "", 10)
        assert r["short_class_name"] is False

    def test_string_encryption_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = (
            'const-string v0, "xyz"\n'
            'invoke-static {v0}, Lcom/Enc;->decrypt(Ljava/lang/String;)Ljava/lang/String;\n'
        )
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is True

    def test_no_string_encryption(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'const-string v0, "hello"\ninvoke-virtual {v0}, Ljava/lang/String;->length()I'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is False

    def test_reflection_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {v0, v1}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is True

    def test_no_reflection(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {p0}, Lcom/Foo;->bar()V'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is False

    def test_excessive_goto_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto :label"] * 10)
        # threshold = max(5, 20*0.15=3) = 5, 10 > 5
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True

    def test_no_excessive_goto(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "goto :label\nreturn-void"
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 100)
        assert r["excessive_goto_count"] is False

    def test_goto_16_counted(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto/16 :label"] * 10)
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True


class TestDalvikTypeConversion:
    """Tests for Dalvik-to-Java type conversion."""

    def test_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("V") == "void"

    def test_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("I") == "int"
        assert dalvik_type_to_java("Z") == "boolean"
        assert dalvik_type_to_java("J") == "long"
        assert dalvik_type_to_java("F") == "float"
        assert dalvik_type_to_java("D") == "double"
        assert dalvik_type_to_java("B") == "byte"
        assert dalvik_type_to_java("S") == "short"
        assert dalvik_type_to_java("C") == "char"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("Ljava/lang/String;") == "String"
        assert dalvik_type_to_java("Lcom/example/Foo;") == "Foo"

    def test_array_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("[I") == "int[]"
        assert dalvik_type_to_java("[Ljava/lang/String;") == "String[]"

    def test_empty_returns_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("") == "void"


class TestJavaPrototypeConversion:
    """Tests for method signature to Java prototype conversion."""

    def test_simple_method(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        assert dalvik_to_java_prototype("foo", "()V") == "void foo()"

    def test_method_with_params(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("bar", "(ILjava/lang/String;)Z")
        assert result == "boolean bar(int, String)"

    def test_method_returning_object(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("create", "()Lcom/example/Foo;")
        assert result == "Foo create()"

    def test_empty_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("m", "")
        assert "m()" in result


class TestDalvikParamParsing:
    """Tests for parsing Dalvik parameter descriptors."""

    def test_empty(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("") == []

    def test_single_primitive(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("I") == ["I"]

    def test_multiple_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("IZJ") == ["I", "Z", "J"]

    def test_single_object(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("Ljava/lang/String;") == ["Ljava/lang/String;"]

    def test_mixed(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("ILjava/lang/String;Z")
        assert result == ["I", "Ljava/lang/String;", "Z"]

    def test_arrays(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("[I[Ljava/lang/String;")
        assert result == ["[I", "[Ljava/lang/String;"]

    def test_two_objects(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("Landroid/os/Bundle;Ljava/lang/String;")
        assert len(result) == 2