Jakob Rehof

75 papers A* 13A 3B 11C 2Misc 3Journal 17Unranked 22
YearRankTypeTitle / Venue / Authors
2026 ch.
Let's Talk AI
Jakob Rehof, Barbara Steffen
2024 B ed.
FSCD
Jakob Rehof
2024 Misc conf
WSC
Jan Winkels, Felix Özkul, Robin Sutherland, Jannik Löhn, Sigrid Wenzel, Jakob Rehof
2023 J jnl
CoRR
Constantin Chaumet, Jakob Rehof, Thomas Schuster
2023 J jnl
CoRR
Constantin Chaumet, Jakob Rehof
2023 conf
TYPES
Andrej Dudenhefner, Christoph Stahl, Constantin Chaumet, Felix Laarmann, Jakob Rehof
2022 Misc conf
WSC
Alexander Mages, Carina Mieth, Jens Hetzler, Fadil Kallat, Jakob Rehof, Christian Riest, Tristan Schäfer
2022 C conf
WAFR
Tristan Schäfer, Jan Bessai, Constantin Chaumet, Jakob Rehof, Christian Riest
2022 J jnl
ACM J. Data Inf. Qual.
Sandra Geisler, Maria-Esther Vidal, Cinzia Cappiello, Bernadette Farias Lóscio, Avigdor Gal, Matthias Jarke, Maurizio Lenzerini, Paolo Missier, Boris Otto, Elda Paja, Barbara Pernici, Jakob Rehof
2022 B conf
FSCD
Jan Bessai, Lukasz Czajka, Felix Laarmann, Jakob Rehof
2021 J jnl
CoRR
Sandra Geisler, Maria-Esther Vidal, Cinzia Cappiello, Bernadette Farias Lóscio, Avigdor Gal, Matthias Jarke, Maurizio Lenzerini, Paolo Missier, Boris Otto, Elda Paja, Barbara Pernici, Jakob Rehof
2019 J jnl
Dagstuhl Reports
Cinzia Cappiello, Avigdor Gal, Matthias Jarke, Jakob Rehof
2019 J jnl
Proc. ACM Program. Lang.
Andrej Dudenhefner, Jakob Rehof
2019 Misc conf
WSC
Sigrid Wenzel, Jana Stolipin, Jakob Rehof, Jan Winkels
2019 J jnl
Fundam. Informaticae
Andrej Dudenhefner, Jakob Rehof
2018 conf
ISoLA (4)
Tristan Schäfer, Frederik Möller, Anja Burmann, Yevgen Pikus, Norbert Weißenberg, Marcus Hintze, Jakob Rehof
2018 conf
TYPES
Andrej Dudenhefner, Jakob Rehof
2018 conf
ISoLA (4)
Jan Winkels, Julian Graefenstein, Tristan Schäfer, David Scholz, Jakob Rehof, Michael Henke
2018 conf
Models, Mindsets, Meta
Jan Bessai, Jakob Rehof, Boris Düdder
2018 J jnl
Log. Methods Comput. Sci.
Jan Bessai, Tzu-Chun Chen, Andrej Dudenhefner, Boris Düdder, Ugo de'Liguoro, Jakob Rehof
2017 A* conf
POPL
Andrej Dudenhefner, Jakob Rehof
2017 conf
TYPES
Andrej Dudenhefner, Jakob Rehof
2017 J jnl
CoRR
Jan Bessai, Tzu-Chun Chen, Andrej Dudenhefner, Boris Düdder, Ugo de'Liguoro, Jakob Rehof
2017 J jnl
CoRR
Andrej Dudenhefner, Jakob Rehof
2017 J jnl
Log. Methods Comput. Sci.
Andrej Dudenhefner, Moritz Martens, Jakob Rehof
2017 B conf
FSCD
Andrej Dudenhefner, Jakob Rehof
2017 A* conf
LICS
Andrej Dudenhefner, Jakob Rehof
2016 conf
ISoLA (1)
George T. Heineman, Jan Bessai, Boris Düdder, Jakob Rehof
2016 conf
ISoLA (1)
Jan Bessai, Andrej Dudenhefner, Boris Düdder, Moritz Martens, Jakob Rehof
2016 conf
ISoLA (1)
Boris Düdder, George T. Heineman, Jakob Rehof
2016 conf
Semantics, Logics, and Calculi
Fritz Henglein, Jakob Rehof
2016 B conf
FSCD
Andrej Dudenhefner, Moritz Martens, Jakob Rehof
2016 J jnl
CoRR
Andrej Dudenhefner, Moritz Martens, Jakob Rehof
2015 book
Michael ten Hompel, Jakob Rehof, Oliver Wolf
2015 conf
FACS
Jan Bessai, Boris Düdder, George T. Heineman, Jakob Rehof
2015 conf
TLCA
Jan Bessai, Andrej Dudenhefner, Boris Düdder, Tzu-Chun Chen, Ugo de'Liguoro, Jakob Rehof
2015 B conf
SPLC
Jakob Rehof, George T. Heineman
2015 ed.
ITRS
Jakob Rehof
2015 conf
Software Engineering & Management
Boris Düdder, Moritz Martens, Jakob Rehof
2015 B conf
SPLC
Boris Düdder, Jakob Rehof, George T. Heineman
2015 B conf
SPLC
George T. Heineman, Armend Hoxha, Boris Düdder, Jakob Rehof
2014 conf
ISoLA (1)
Jan Bessai, Andrej Dudenhefner, Boris Düdder, Moritz Martens, Jakob Rehof
2014 J jnl
Dagstuhl Reports
Jakob Rehof, Moshe Y. Vardi
2014 A conf
ESOP
Boris Düdder, Moritz Martens, Jakob Rehof
2013 conf
TLCA
Boris Düdder, Moritz Martens, Jakob Rehof
2012 B conf
CSL
Boris Düdder, Moritz Martens, Jakob Rehof, Pawel Urzyczyn
2012 conf
Logic and Program Semantics
Jakob Rehof, Pawel Urzyczyn
2012 conf
ITRS
Boris Düdder, Oliver Garbe, Moritz Martens, Jakob Rehof, Pawel Urzyczyn
2011 conf
TLCA
Jakob Rehof, Pawel Urzyczyn
2010 conf
GI Jahrestagung (1)
Jakob Rehof, Bernhard Holtkamp
2008 A ed.
TACAS
C. R. Ramakrishnan, Jakob Rehof
2008 J jnl
Math. Struct. Comput. Sci.
Manuel Fähndrich, Jakob Rehof
2005 A conf
TACAS
Shaz Qadeer, Jakob Rehof
2004 C conf
ISoLA
Sriram K. Rajamani, Jakob Rehof
2004 conf
ISoLA (Preliminary proceedings)
Jakob Rehof, Sriram K. Rajamani
2004 A* conf
CAV
Cédric Fournet, C. A. R. Hoare, Sriram K. Rajamani, Jakob Rehof
2004 A* conf
POPL
Shaz Qadeer, Sriram K. Rajamani, Jakob Rehof
2004 A* conf
CAV
Tony Andrews, Shaz Qadeer, Sriram K. Rajamani, Jakob Rehof, Yichen Xie
2002 A* conf
CAV
Sriram K. Rajamani, Jakob Rehof
2002 A* conf
POPL
Sagar Chaki, Sriram K. Rajamani, Jakob Rehof
2001 B conf
SAS
Sriram K. Rajamani, Jakob Rehof
2001 B conf
SAS
Manuvir Das, Ben Liblit, Manuel Fähndrich, Jakob Rehof
2001 J jnl
ACM Trans. Program. Lang. Syst.
Todd B. Knoblock, Jakob Rehof
2001 A* conf
POPL
Jakob Rehof, Manuel Fähndrich
2000 A* conf
PLDI
Manuel Fähndrich, Jakob Rehof, Manuvir Das
2000 A* conf
POPL
Todd B. Knoblock, Jakob Rehof
1999 J jnl
Sci. Comput. Program.
Jakob Rehof, Torben Æ. Mogensen
1998 A* conf
ICALP
Fritz Henglein, Jakob Rehof
1998
The complexity of simple subtyping systems.
Jakob Rehof
1997 A* conf
POPL
Jakob Rehof
1997 A* conf
LICS
Fritz Henglein, Jakob Rehof
1996 J jnl
Inf. Process. Lett.
Jakob Rehof
1996 B conf
SAS
Jakob Rehof, Torben Æ. Mogensen
1995 conf
FPCA
Fritz Henglein, Jakob Rehof
1994 conf
TACS
Jakob Rehof, Morten Heine Sørensen
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