Rafael de Carvalho Miranda

22 papers Misc 4Journal 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Oper. Res.
Aneirson Francisco da Silva, Rafael de Carvalho Miranda, Fernando Augusto Silva Marins, Erica Ximenes Dias
2025 J jnl
J. Oper. Res. Soc.
João Victor Soares do Amaral, Rafael de Carvalho Miranda, José Arnaldo Barra Montevechi, Carlos Henrique dos Santos, Flávio de Oliveira Brito
2025 J jnl
J. Simulation
Ricardo Henrique Batista, Rafael de Carvalho Miranda, André Luiz Medeiros, João Victor Soares do Amaral, Aneirson Francisco da Silva
2025 J jnl
Complex Syst. Model. Simul.
Mariane Gonçalves de Alcantara, Aneirson Francisco da Silva, Fernando Augusto Silva Marins, Rafael de Carvalho Miranda
2024 J jnl
Eur. J. Oper. Res.
Aneirson Francisco da Silva, Rafael de Carvalho Miranda, Fernando Augusto Silva Marins, Erica Ximenes Dias
2024 J jnl
Appl. Soft Comput.
João Victor Soares do Amaral, José Arnaldo Barra Montevechi, Rafael de Carvalho Miranda, Carlos Henrique dos Santos
2024 J jnl
Eng. Appl. Artif. Intell.
André Aoun Montevechi, Rafael de Carvalho Miranda, André Luiz Medeiros, José Arnaldo Barra Montevechi
2024 J jnl
Int. J. Prod. Res.
Carlos Henrique dos Santos, Afonso Teberga Campos, José Arnaldo Barra Montevechi, Rafael de Carvalho Miranda, Antonio Fernando Branco Costa
2024 Misc conf
WSC
Carlos Henrique dos Santos, José Arnaldo Barra Montevechi, Afonso Teberga Campos, Rafael de Carvalho Miranda, José Antonio de Queiroz, João Victor Soares do Amaral
2023 Misc conf
WSC
José Arnaldo Barra Montevechi, João Victor Soares do Amaral, Rafael de Carvalho Miranda, Carlos Henrique dos Santos, Flavio Oliveira de Brito, Michael E. F. H. S. Machado
2022 J jnl
Int. J. Prod. Res.
Carlos Henrique dos Santos, José Arnaldo Barra Montevechi, José Antonio de Queiroz, Rafael de Carvalho Miranda, Fabiano Leal
2022 J jnl
Expert Syst. J. Knowl. Eng.
Aneirson Francisco da Silva, Fernando Augusto Silva Marins, Erica Ximenes Dias, Rafael de Carvalho Miranda
2022 J jnl
Simul. Model. Pract. Theory
João Victor Soares do Amaral, José Arnaldo Barra Montevechi, Rafael de Carvalho Miranda, Wilson Trigueiro de Sousa Junior
2021 J jnl
Simul.
Tábata Fernandes Pereira, José Arnaldo Barra Montevechi, Fabiano Leal, Rafael de Carvalho Miranda, Anna Paula Galvão Scheidegger
2020 J jnl
Expert Syst. Appl.
Fernando Augusto Silva Marins, Aneirson Francisco da Silva, Rafael de Carvalho Miranda, José Arnaldo Barra Montevechi
2020 J jnl
Expert Syst. Appl.
Wilson Trigueiro de Sousa Junior, José Arnaldo Barra Montevechi, Rafael de Carvalho Miranda, Mona Liza Moura de Oliveira, Afonso Teberga Campos
2019 J jnl
Comput. Ind. Eng.
Wilson Trigueiro de Sousa Junior, José Arnaldo Barra Montevechi, Rafael de Carvalho Miranda, Afonso Teberga Campos
2017 J jnl
J. Simulation
José Arnaldo Barra Montevechi, Rafael Florencio da Silva Costa, Alexandre Ferreira de Pinho, Rafael de Carvalho Miranda
2017 J jnl
Eur. J. Oper. Res.
Rafael de Carvalho Miranda, José Arnaldo Barra Montevechi, Aneirson Francisco da Silva, Fernando Augusto Silva Marins
2015 Misc conf
WSC
José Arnaldo Barra Montevechi, Tábata Fernandes Pereira, Carlos Eduardo Sanches da Silva, Rafael de Carvalho Miranda, Anna Paula G. Scheidegger
2015 J jnl
Int. Trans. Oper. Res.
Tábata Fernandes Pereira, José Arnaldo Barra Montevechi, Rafael de Carvalho Miranda, Jonathan Daniel Friend
2013 Misc conf
WSC
José Arnaldo Barra Montevechi, Fabiano Leal, Rafael de Carvalho Miranda, Tábata Fernandes Pereira
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