Raja Majid Mehmood

32 papers Journal 28Unranked 4
YearRankTypeTitle / Venue / Authors
2024 J jnl
IEEE Access
Mehmet Yilmaz, Erkut Yalçin, Saif Kifah, Fatih Demir, Abdulkadir Sengür, Rozerin Demir, Raja Majid Mehmood
2023 J jnl
Clust. Comput.
Puah Jia Hong, Muhammad Adeel Asghar, Amin Ullah, Mohammad Shorfuzzaman, Mehedi Masud, Raja Majid Mehmood
2023 J jnl
Clust. Comput.
Zijian Zhou, Muhammad Adeel Asghar, Daniyal Nazir, Kamran Siddique, Mohammad Shorfuzzaman, Raja Majid Mehmood
2023 J jnl
Softw. Pract. Exp.
Islam Zada, Sara Shahzad, Shaukat Ali, Raja Majid Mehmood
2022 J jnl
Multim. Syst.
Muhammad Adeel Asghar, Muhammad Jamil Khan, Muhammad Rizwan, Mohammad Shorfuzzaman, Raja Majid Mehmood
2022 J jnl
Sensors
Mehak Sheikh, Muhammad Adeel Asghar, Ruqia Bibi, Muhammad Noman Malik, Mohammad Shorfuzzaman, Raja Majid Mehmood, Sun-Hee Kim
2022 J jnl
IEEE Access
Ahmad Sajjad, Wasim Ahmad, Salman Hussain, Raja Majid Mehmood
2022 J jnl
IEEE Access
Berna Ari, Kamran Siddique, Ömer Faruk Alçin, Muzaffer Aslan, Abdulkadir Sengür, Raja Majid Mehmood
2021 J jnl
Sensors
Amin Ullah, Sadaqat ur Rehman, Shanshan Tu, Raja Majid Mehmood, Fawad, Muhammad Ehatisham-ul-Haq
2021 J jnl
CoRR
Muhammad Basit Umair, Zeshan Iqbal, Muhammad Bilal, Tarik Adnan Almohamad, Jamel Nebhen, Raja Majid Mehmood
2021 J jnl
IEEE Trans. Instrum. Meas.
Raja Majid Mehmood, Hyung-Jeong Yang, Sun-Hee Kim
2021 J jnl
Softw. Pract. Exp.
Muhammad Shahid Iqbal, Iftikhar Ahmad, Muhammad Asif, Sun-Hee Kim, Raja Majid Mehmood
2021 J jnl
Softw. Pract. Exp.
Muneer Ahmad, Iftikhar Ahmad, Muhammad Bilal, Alireza Jolfaei, Raja Majid Mehmood
2021 J jnl
IEEE Trans. Intell. Transp. Syst.
Abdullah Lakhan, Muneer Ahmad, Muhammad Bilal, Alireza Jolfaei, Raja Majid Mehmood
2021 J jnl
IEEE Access
Muhammad Adeel Asghar, Muhammad Jamil Khan, Humayun Shahid, Mohammad Shorfuzzaman, Neal Naixue Xiong, Raja Majid Mehmood
2020 J jnl
Sensors
Muhammad Saqib, Tarik Adnan Almohamad, Raja Majid Mehmood
2020 J jnl
Intell. Autom. Soft Comput.
Norjihan Binti Abdul Ghani, Muneer Ahmad, Zahra Mahmoud, Raja Majid Mehmood
2020 J jnl
IEEE Access
Zain-ul-Abdin, Tahir Mahmood, Mohammad Shorfuzzaman, Neal N. Xiong, Raja Majid Mehmood
2020 J jnl
Sensors
Muhammad Adeel Asghar, Muhammad Jamil Khan, Muhammad Rizwan, Raja Majid Mehmood, Sun-Hee Kim
2020 J jnl
CoRR
Amin Ullah, Syed Muhammad Anwar, Muhammad Bilal, Raja Majid Mehmood
2020 J jnl
Remote. Sens.
Amin Ullah, Syed Muhammad Anwar, Muhammad Bilal, Raja Majid Mehmood
2020 J jnl
IEEE Trans. Instrum. Meas.
Sun-Hee Kim, Hyung-Jeong Yang, Thi Anh Ngoc Nguyen, Raja Majid Mehmood, Seong-Whan Lee
2020 J jnl
IEEE Access
Madhumita Panda, Sujata Dash, Anand Nayyar, Muhammad Bilal, Raja Majid Mehmood
2019 J jnl
Int. J. Distributed Sens. Networks
Muhammad Saqib, Farrukh Zeeshan Khan, Muneer Ahmad, Raja Majid Mehmood
2017 J jnl
IEEE Access
Raja Majid Mehmood, Ruoyu Du, Hyo Jong Lee
2017 J jnl
Sensors
Raja Majid Mehmood, Hyo Jong Lee
2016 J jnl
Comput. Electr. Eng.
Raja Majid Mehmood, Hyo Jong Lee
2016 conf
ICME Workshops
Raja Majid Mehmood, Hyo Jong Lee
2016 conf
EMBC
Raja Majid Mehmood, Hyo Jong Lee
2015 conf
ICME Workshops
Yongbin Gao, Hyo Jong Lee, Raja Majid Mehmood
2015 conf
ICME Workshops
Raja Majid Mehmood, Hyo Jong Lee
2015 J jnl
Int. J. Distributed Sens. Networks
Raja Majid Mehmood, Hyo Jong Lee
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