Kartik Muralidharan

25 papers B 2C 2Misc 2Unranked 19
YearRankTypeTitle / Venue / Authors
2025 conf
UbiComp Companion
Tanuja Jayas, Adarsh A, Vivek B. S., Shivam Gupta, Kartik Muralidharan, Arpan Pal, Jayavardhana Gubbi
2024 conf
EMBC
Adarsh A, R. Jhanavi, Tanuja Jayas, Amagond Biradar, Kartik Muralidharan, Arpan Pal, Jayavardhana Gubbi
2024 conf
UbiComp Companion
Tanuja Jayas, Adarsh A, R. Jhanavi, Bhartendu Kumar, Vivek B. S., Kartik Muralidharan, Arpan Pal, Jayavardhana Gubbi
2023 B conf
SMC
Tanuja Jayas, Adarsh A, Kartik Muralidharan, Jayavardhana Gubbi, Ramesh Kumar R., Arpan Pal
2022 conf
EMBC
Dibyanshu Jaiswal, Kayapanda M. Mandana, Ramesh Kumar Ramakrishnan, Kartik Muralidharan, Mithun Basaralu Sheshachala, Shakil Ahmad, Tanmay Acharia, Loknath Tiwari, Arpan Pal, Balakumar Kanagasabapathy
2022 conf
UbiComp/ISWC Adjunct
Adarsh A, Meghana S, Kartik Muralidharan, Jayavardhana Gubbi, Ramesh Kumar Ramakrishnan, Arpan Pal
2022 conf
BHI
Vivek B. S., Adarsh A, Jay Gubbi, Kartik Muralidharan, Ramesh Kumar Ramakrishnan, Arpan Pal
2022 conf
EMBC
Abhranila Das, Subhadeep Basu, Adarsh A, Jayavardhana Gubbi, Kartik Muralidharan, Meghana S, Mahendiran S, Amagond Biradar, Ullas Pradhan, Tapas Chakravarty, Ramesh Kumar Ramakrishnan, Arpan Pal
2021 conf
EMBC
Rahul Dasharath Gavas, Kartik Muralidharan, Ramesh Kumar Ramakrishnan, Ramesh Balaji, Harish Kumar, Srinivasa Raghavan Venkatachari
2021 conf
BodySys@MobiSys
Tanushree Banerjee, Kartik Muralidharan, Dibyanshu Jaiswal, Mithun Basaralu Sheshachala, Ramesh Kumar Ramakrishnan, Arpan Pal
2021 conf
EMBC
Akshaya Ramaswamy, Arpit Bal, Abhranila Das, Jayavardhana Gubbi, Kartik Muralidharan, Ramesh Kumar Ramakrishnan, Arpan Pal, Balamuralidhar Purushothaman
2019 conf
EMBC
Rahul D. Gavas, Deepan Das, Tanuka Bhattacharjee, Mithun B. Sheshachala, Lalit K. Hissaria, Ramu Reddy Vempada, Venkata Subramanian Viraraghavan, Anirban Dutta Choudhury, Kartik Muralidharan, Ramesh K. Ramakrishnan, P. Balamuralidhar, Arpan Pal
2018 conf
HCI (27)
Ramesh Balaji, Karan Bhavsar, Brojeshwar Bhowmick, Mithun B. Sheshachala, Kingshuk Chakravarty, Debatri Chatterjee, Avik Ghose, Puneet Gupta, Dibyanshu Jaiswal, Sanjay Kimbahune, Kartik Muralidharan, Arpan Pal, Aniruddha Sinha, Srinivasa Raghavan Venkatachari
2018 conf
UbiComp/ISWC Adjunct
Dibyanshu Jaiswal, Avik Ghose, Kartik Muralidharan
2014 Misc conf
HotMobile
Kartik Muralidharan, Azeem Javed Khan, Archan Misra, Rajesh Krishna Balan, Sharad Agarwal
2014 conf
PerCom Workshops
Kartik Muralidharan, Swapna Gottipati, Rajesh Krishna Balan
2014 conf
DEBS
Kartik Muralidharan, Srinivasan Seshan, Narayan Ramasubbu, Rajesh Krishna Balan
2014 conf
CODASPY
Chee Meng Tey, Payas Gupta, Kartik Muralidharan, Debin Gao
2014 Misc conf
COMSNETS
Swetha Gottipati, Jeena Sebastian, Luong Trung Tuan, Tan Kiat Wee, Joseph Chan Joo Keng, Kartik Muralidharan, Tadashi Okoshi, Youngki Lee, Archan Misra, Rajesh Krishna Balan
2014 conf
ICMU
Sougata Sen, Kartik Muralidharan
2014 C conf
MobiQuitous
Kartik Muralidharan, Swapna Gottipati, Narayan Ramasubbu, Jing Jiang, Rajesh Krishna Balan
2008 C conf
WOWMOM
Kartik Muralidharan, Karthikeyan Balaji Dhanapal, Atanu Roy Chowdhury
2008 conf
COMSWARE
Kartik Muralidharan, G. V. Karthik, Puneet Gupta, Atanu Roy Chowdhury
2006 conf
SEUS/WCCIA
Kartik Muralidharan, Puneet Gupta
2005 B conf
SECON
Mukundan Venkataraman, Kartik Muralidharan, Puneet Gupta
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