James T. Klosowski

34 papers A* 1A 2B 1C 1Journal 16Unranked 9
YearRankTypeTitle / Venue / Authors
2022 J jnl
ACM SIGSPATIAL Special
Cheryl Brooks, Serkan Isci, Yaron Kanza, James T. Klosowski, Robert R. Woods Jr.
2022 conf
SIGSPATIAL/GIS
Krystian Czapiga, Serkan Isci, Yaron Kanza, James T. Klosowski, Velin Kounev, Gopal Meempat
2018 A* conf
AAAI
Raif M. Rustamov, James T. Klosowski
2018 J jnl
IEEE Trans. Vis. Comput. Graph.
Fabio Miranda, Lauro Didier Lins, James T. Klosowski, Cláudio T. Silva
2017 J jnl
CoRR
Raif M. Rustamov, James T. Klosowski
2013 ed.
ISVC (1)
George Bebis, Richard Boyle, Bahram Parvin, Darko Koracin, Baoxin Li, Fatih Porikli, Victor B. Zordan, James T. Klosowski, Sabine Coquillart, Xun Luo, Min Chen, David Gotz
2013 ed.
ISVC (2)
George Bebis, Richard Boyle, Bahram Parvin, Darko Koracin, Baoxin Li, Fatih Porikli, Victor B. Zordan, James T. Klosowski, Sabine Coquillart, Xun Luo, Min Chen, David Gotz
2013 B conf
ICIP
Shankar Krishnan, James T. Klosowski
2013 J jnl
IEEE Trans. Vis. Comput. Graph.
Lauro Didier Lins, James T. Klosowski, Carlos Eduardo Scheidegger
2013 J jnl
Comput. Graph. Forum
Nivan Ferreira, James T. Klosowski, Carlos Eduardo Scheidegger, Cláudio T. Silva
2012 J jnl
CoRR
Nivan Ferreira, James T. Klosowski, Carlos Eduardo Scheidegger, Cláudio T. Silva
2011 conf
Parallel Processing for Imaging Applications
James T. Klosowski, Shankar Krishnan
2008 ed.
ISVC (1)
George Bebis, Richard D. Boyle, Bahram Parvin, Darko Koracin, Paolo Remagnino, Fatih Murat Porikli, Jörg Peters, James T. Klosowski, Laura L. Arns, Yu Ka Chun, Theresa-Marie Rhyne, Laura Monroe
2008 ed.
ISVC (2)
George Bebis, Richard D. Boyle, Bahram Parvin, Darko Koracin, Paolo Remagnino, Fatih Murat Porikli, Jörg Peters, James T. Klosowski, Laura L. Arns, Yu Ka Chun, Theresa-Marie Rhyne, Laura Monroe
2007 conf
SIGGRAPH Courses
Wagner Toledo Corrêa, James T. Klosowski, Christopher J. Morris, Thomas M. Jackmann
2006 conf
EGPGV@EuroVis/EGVE
James T. Klosowski
2003 J jnl
Parallel Comput.
Wagner Toledo Corrêa, James T. Klosowski, Cláudio T. Silva
2003 J jnl
Comput. Graph.
Peter D. Kirchner, James T. Klosowski, Peter H. Hochschild, Richard A. Swetz
2003 conf
IEEE Symposium on Parallel and Large-Data Visualization and Graphics
Wagner Toledo Corrêa, James T. Klosowski, Cláudio T. Silva
2002 J jnl
ACM Trans. Graph.
Greg Humphreys, Mike Houston, Ren Ng, Randall Frank, Sean Ahern, Peter D. Kirchner, James T. Klosowski
2002 J jnl
IEEE Computer Graphics and Applications
James T. Klosowski, Peter D. Kirchner, Julia Valuyeva, Greg Abram, Christopher J. Morris, Robert H. Wolfe, Thomas Jackman
2002 C conf
EGPGV
Wagner Toledo Corrêa, James T. Klosowski, Cláudio T. Silva
2001 J jnl
IEEE Trans. Vis. Comput. Graph.
James T. Klosowski, Cláudio T. Silva
2000 J jnl
IEEE Trans. Vis. Comput. Graph.
James T. Klosowski, Cláudio T. Silva
2000 J jnl
Comput. Graph. Forum
Fausto Bernardini, James T. Klosowski, Jihad El-Sana
2000 conf
Eurographics (Tutorials)
Ioana M. Martin, James T. Klosowski, William P. Horn
2000 A conf
IEEE Visualization
Frank Suits, James T. Klosowski, William P. Horn, Gérard Lecina
2000 J jnl
IEEE Trans. Vis. Comput. Graph.
James T. Klosowski, Cláudio T. Silva
1999 J jnl
Comput. Graph. Forum
João Comba, James T. Klosowski, Nelson L. Max, Joseph S. B. Mitchell, Cláudio T. Silva, Peter L. Williams
1999 A conf
IEEE Visualization
James T. Klosowski, Cláudio T. Silva
1999 conf
Eurographics (Tutorials)
Yiorgos L. Chrysanthou, Daniel Cohen-Or, Gadi Fibich, Dan Halperin, Eyal Zadicario, Shuly Lev-Yehudi, Dirk Bartz, Michael Meißner, Tobias Hüttner, Jirí Bittner, Vlastimil Havran, Pavel Slavík, James T. Klosowski, Cláudio T. Silva
1998 J jnl
IEEE Trans. Vis. Comput. Graph.
James T. Klosowski, Martin Held, Joseph S. B. Mitchell, Henry Sowizral, Karel Zikan
1996 conf
SCG
Martin Held, James T. Klosowski, Joseph S. B. Mitchell
1996 conf
SIGGRAPH Visual Proceedings
Martin Held, James T. Klosowski, Joseph S. B. Mitchell
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