Hamid Behnam

36 papers Journal 32Unranked 4
YearRankTypeTitle / Venue / Authors
2025 J jnl
Comput. Biol. Medicine
Poorya MohammadiNasab, Atousa Khakbaz, Hamid Behnam, Ehsan Kozegar, Mohsen Soryani
2024 J jnl
Biomed. Signal Process. Control.
Ali Ahmad Rahmani, Ali Asghar Beheshti Shirazi, Hamid Behnam
2023 J jnl
Int. J. Imaging Syst. Technol.
Majid Vafaeezadeh, Hamid Behnam, Ali Hosseinsabet, Parisa Gifani
2022 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Majid Vafaeezadeh, Hamid Behnam, Ali Hosseinsabet, Parisa Gifani
2022 J jnl
IEEE Trans. Cogn. Dev. Syst.
Seyedeh Naghmeh Miri Ashtiani, Hamid Behnam, Mohammad Reza Daliri
2022 J jnl
Biomed. Signal Process. Control.
Maryam Hashemseresht, Sajjad Afrakhteh, Hamid Behnam
2021 J jnl
Comput. Biol. Medicine
Majid Vafaeezadeh, Hamid Behnam, Ali Hosseinsabet, Parisa Gifani
2021 J jnl
Int. J. Imaging Syst. Technol.
Mina Hosseinpour, Hamid Behnam, Maryam Shojaeifard
2021 J jnl
Comput. Biol. Medicine
Mohammad Jalali, Hamid Behnam, Maryam Shojaeifard
2021 J jnl
Comput. methods Biomech. Biomed. Eng. Imaging Vis.
Yasna Forghani, Hamid Behnam, Maryam Shojaeifard
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Talayeh Ghodsizad, Hamid Behnam, Emad Fatemizadeh, Taraneh Faghihi Langroudi, Fariba Bayat
2020 J jnl
Int. J. Imaging Syst. Technol.
Sajjad Afrakhteh, Hamid Behnam
2020 J jnl
Comput. methods Biomech. Biomed. Eng. Imaging Vis.
Samrand Sharifi, Hamid Behnam, Zahra Alizadeh Sani
2020 J jnl
Artif. Intell. Rev.
Ehsan Kozegar, Mohsen Soryani, Hamid Behnam, Masoumeh Salamati, Tao Tan
2020 J jnl
Biomed. Signal Process. Control.
Sajjad Afrakhteh, Hamid Behnam
2020 J jnl
IET Image Process.
Mahtab Faraji, Hamid Behnam, Mohammad Norizadeh Cherloo, Maryam Shojaeifard
2020 J jnl
Biomed. Signal Process. Control.
Mohammad Jalali, Hamid Behnam, Fateme Davoodi, Maryam Shojaeifard
2019 J jnl
Turkish J. Electr. Eng. Comput. Sci.
Samrand Sharifi, Hamid Behnam, Zahra Alizadeh Sani
2019 J jnl
Comput. Biol. Medicine
Farzad Azarmi, Seyedeh Naghmeh Miri Ashtiani, Ahmad Shalbaf, Hamid Behnam, Mohammad Reza Daliri
2019 J jnl
Sensors
Leila Mohammadi, Hamid Behnam, Jahan Tavakkoli, Mohammad R. N. Avanaki
2019 J jnl
Biomed. Signal Process. Control.
Mina Hosseinpour, Hamid Behnam, Maryam Shojaeifard
2018 J jnl
Biomed. Signal Process. Control.
Seyedeh Naghmeh Miri Ashtiani, Mohammad Reza Daliri, Hamid Behnam, Gholam-Ali Hossein-Zadeh, Masoud Mehrpour, Mohammad Reza Motamed, Fatemeh Fadaie
2018 J jnl
IEEE Trans. Medical Imaging
Ehsan Kozegar, Mohsen Soryani, Hamid Behnam, Masoumeh Salamati, Tao Tan
2016 J jnl
J. Medical Syst.
M. Mirsadeghi, Hamid Behnam, Reza Shalbaf, H. Jelveh Moghadam
2016 J jnl
Comput. Electr. Eng.
Parisa Gifani, Hamid Behnam, Farzan Haddadi, Zahra Alizadeh Sani, Peyman Gifani
2015 J jnl
J. Digit. Imaging
Zahra Alizadeh Sani, Ahmad Shalbaf, Hamid Behnam, Reza Shalbaf
2015 J jnl
J. Digit. Imaging
Ahmad Shalbaf, Hamid Behnam
2013 J jnl
J. Digit. Imaging
Ahmad Shalbaf, Hamid Behnam, Zahra Alizade-Sani, Maryam Shojaifard
2013 J jnl
J. Electronic Imaging
Mahdieh Karimi Lakhani, Hamid Behnam, Arash Karimi
2012 J jnl
J. Medical Syst.
Fahimeh Sadat Zakeri, Hamid Behnam, Nasrin Ahmadinejad
2012 J jnl
J. Medical Syst.
Ali Sheikhani, Hamid Behnam, Mohammad Reza Mohammadi, Maryam Noroozian, Mohammad Mohammadi
2012 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Ahmad Shalbaf, Hamid Behnam, Zahra Alizade-Sani, Maryam Shojaifard
2011 conf
DPM/SETOP
Masoumeh Safkhani, Nasour Bagheri, Somitra Kumar Sanadhya, Majid Naderi, Hamid Behnam
2008 conf
UKSim
Hamid Behnam, Ali Sheikhani, Mohammad Reza Mohammadi, Maryam Noroozian, Pari Golabi
2008 conf
UKSim
Hamid Behnam, Ali Sheikhani, Mohammad Reza Mohammadi, Maryam Noroozian, Pari Golabi
2005 conf
IEC (Prague)
Sepehr M. H. Jamarani, Mohammad Hassan Moradi, Hamid Behnam, G. A. Rezai Rad
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