Hajime Ishihara

63 papers A* 1B 2C 1Journal 56Unranked 2
YearRankTypeTitle / Venue / Authors
2024 J jnl
Dagstuhl Reports
Ingo Blechschmidt, Hajime Ishihara, Peter M. Schuster, Gabriele Buriola
2023 J jnl
Bull. Symb. Log.
Makoto Fujiwara, Hajime Ishihara, Takako Nemoto, Nobu-Yuki Suzuki, Keita Yokoyama
2023 J jnl
J. Log. Comput.
Marlou M. Gijzen, Hajime Ishihara, Tatsuji Kawai
2021 J jnl
CoRR
Marlou M. Gijzen, Hajime Ishihara, Tatsuji Kawai
2021 J jnl
Dagstuhl Reports
Thierry Coquand, Hajime Ishihara, Sara Negri, Peter M. Schuster
2020 J jnl
Arch. Math. Log.
Hajime Ishihara, Takako Nemoto
2019 J jnl
Ann. Pure Appl. Log.
Ayana Hirata, Hajime Ishihara, Tatsuji Kawai, Takako Nemoto
2019 J jnl
Arch. Math. Log.
Josef Berger, Hajime Ishihara, Takayuki Kihara, Takako Nemoto
2018 J jnl
Arch. Math. Log.
Hajime Ishihara, Maria Emilia Maietti, Samuele Maschio, Thomas Streicher
2017 J jnl
Math. Struct. Comput. Sci.
Hajime Ishihara, Margarita V. Korovina, Arno Pauly, Monika Seisenberger, Dieter Spreen
2016 J jnl
Math. Log. Q.
Hajime Ishihara, Takako Nemoto
2016 J jnl
Math. Log. Q.
Hajime Ishihara, Helmut Schwichtenberg
2015 J jnl
Math. Struct. Comput. Sci.
Hajime Ishihara, Tatsuji Kawai
2015 J jnl
Math. Struct. Comput. Sci.
Peter Aczel, Hajime Ishihara, Takako Nemoto, Yasushi Sangu
2015 J jnl
Arch. Math. Log.
Makoto Fujiwara, Hajime Ishihara, Takako Nemoto
2014 J jnl
Log. Methods Comput. Sci.
Hajime Ishihara
2013 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara
2013 J jnl
Math. Log. Q.
Douglas S. Bridges, Hajime Ishihara, Maarten McKubre-Jordens
2012 J jnl
Ann. Pure Appl. Log.
Josef Berger, Hajime Ishihara, Erik Palmgren, Peter Schuster
2012 J jnl
Reports Math. Log.
Josef Berger, Hajime Ishihara, Peter Schuster
2012 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara
2012 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara
2011 J jnl
Arch. Math. Log.
Hajime Ishihara, Peter Schuster
2008 J jnl
IEICE Trans. Electron.
Yuichiro Murachi, Yuki Fukuyama, Ryo Yamamoto, Junichi Miyakoshi, Hiroshi Kawaguchi, Hajime Ishihara, Masayuki Miyama, Yoshio Matsuda, Masahiko Yoshimoto
2008 J jnl
J. Symb. Log.
Hajime Ishihara, Peter Schuster
2008 J jnl
Theor. Comput. Sci.
Douglas S. Bridges, Hajime Ishihara, Peter M. Schuster, Luminita Vîta
2008 J jnl
J. Univers. Comput. Sci.
Vasco Brattka, Hajime Ishihara, Matthias Schröder, Ning Zhong
2008 J jnl
Math. Log. Q.
Vasco Brattka, Hajime Ishihara, Matthias Schröder, Ning Zhong
2008 J jnl
Math. Log. Q.
Robin Havea, Hajime Ishihara, Luminita Vîta
2007 C conf
CiE
Hajime Ishihara
2006 J jnl
Stud Logica
Peter Aczel, Laura Crosilla, Hajime Ishihara, Erik Palmgren, Peter Schuster
2006 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara, Ray Mines, Peter Schuster, Luminita Vîta
2006 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara, Erik Palmgren
2006 J jnl
Notre Dame J. Formal Log.
Hajime Ishihara
2005 J jnl
Math. Log. Q.
Josef Berger, Hajime Ishihara
2005 conf
Spatial Representation
Douglas S. Bridges, Hajime Ishihara, Peter Schuster, Luminita Vîta
2005 ch.
From sets and types to topology and analysis
Hajime Ishihara
2005 J jnl
J. Univers. Comput. Sci.
Cristian S. Calude, Hajime Ishihara
2005 J jnl
J. Symb. Log.
Laura Crosilla, Hajime Ishihara, Peter Schuster
2005 J jnl
IEICE Trans. Electron.
Takuya Iida, Hajime Ishihara
2005 J jnl
Arch. Math. Log.
Douglas S. Bridges, Hajime Ishihara, Peter Schuster, Luminita Vîta
2004 J jnl
Math. Log. Q.
Hajime Ishihara, Peter Schuster
2002 J jnl
J. Symb. Log.
Hajime Ishihara, Satoru Yoshida
2002 B conf
CSL
Douglas S. Bridges, Hajime Ishihara, Peter Schuster
2002 J jnl
Theor. Comput. Sci.
Hajime Ishihara, Toshihiko Kurata
2002 B conf
WG
Hajime Ishihara, Bakhadyr Khoussainov
2002 A* conf
LICS
Hajime Ishihara, Bakhadyr Khoussainov, Sasha Rubin
2001 J jnl
Int. J. Found. Comput. Sci.
Cristian Calude, Hajime Ishihara, Takeshi Yamaguchi
2001 conf
DMTCS
Hajime Ishihara
2000 J jnl
J. Univers. Comput. Sci.
Hajime Ishihara
2000 J jnl
Math. Log. Q.
Hajime Ishihara
1999 J jnl
Comput. Complex.
Hajime Ishihara
1998 J jnl
Math. Log. Q.
Douglas S. Bridges, Hajime Ishihara
1998 J jnl
Inf. Comput.
Hajime Ishihara, Bakhadyr Khoussainov, Anil Nerode
1998 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara, Bakhadyr Khoussainov, Anil Nerode
1997 J jnl
J. Univers. Comput. Sci.
Hajime Ishihara, Bakhadyr Khoussainov
1997 J jnl
J. Univers. Comput. Sci.
Hajime Ishihara
1994 J jnl
Math. Log. Q.
Douglas S. Bridges, Hajime Ishihara
1994 J jnl
Math. Log. Q.
Douglas S. Bridges, Hajime Ishihara
1992 J jnl
J. Symb. Log.
Hajime Ishihara
1991 J jnl
Ann. Pure Appl. Log.
Hajime Ishihara
1991 J jnl
J. Symb. Log.
Hajime Ishihara
1990 J jnl
Math. Log. Q.
Hajime Ishihara
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