Omar S. Harb

13 papers Journal 12Unranked 1
YearRankTypeTitle / Venue / Authors
2022 J jnl
Nucleic Acids Res.
Beatrice Amos, Cristina Aurrecoechea, Matthieu Barba, Ana Barreto, Evelina Y. Basenko, Wojciech Bazant, Robert Belnap, Ann S. Blevins, Ulrike Böhme, John Brestelli, Brian P. Brunk, Mark J. Caddick, Danielle Callan, Lahcen I. Campbell, Mikkel B. Christensen, George K. Christophides, Kathryn Crouch, Kristina Davis, Jeremy D. DeBarry, Ryan Doherty, Yikun Duan, Michael Dunn, Dave Falke, Steve Fisher, Paul Flicek, Brett Fox, Bindu Gajria, Gloria I. Giraldo-Calderón, Omar S. Harb, Elizabeth Harper, Christiane Hertz-Fowler, Mark J. Hickman, Connor Howington, Sufen Hu, Jay C. Humphrey, John Iodice, Andrew R. Jones, John Judkins, Sarah A. Kelly, Jessica C. Kissinger, Dae Kun Kwon, Kristopher Lamoureux, Daniel Lawson, Wei Li, Kallie Lies, Disha Lodha, Jamie Long, Robert M. MacCallum, Gareth Maslen, Mary Ann McDowell, Jaroslaw Nabrzyski, David S. Roos, Samuel S. C. Rund, Stephanie wever Schulman, Achchuthan Shanmugasundram, Vasily Sitnik, Drew Spruill, David Starns, Christian J. Stoeckert Jr., Sheena Shah Tomko, Haiming Wang, Susanne Warrenfeltz, Robert Wieck, Paul A. Wilkinson, Lin Xu, Jie Zheng
2017 J jnl
Nucleic Acids Res.
Cristina Aurrecoechea, Ana Barreto, Evelina Y. Basenko, John Brestelli, Brian P. Brunk, Shon Cade, Kathryn Crouch, Ryan Doherty, Dave Falke, Steve Fischer, Bindu Gajria, Omar S. Harb, Mark Heiges, Christiane Hertz-Fowler, Sufen Hu, John Iodice, Jessica C. Kissinger, Cris Lawrence, Wei Li, Deborah F. Pinney, Jane A. Pulman, David S. Roos, Achchuthan Shanmugasundram, Fatima Silva-Franco, Sascha Steinbiss, Christian J. Stoeckert Jr., Drew Spruill, Haiming Wang, Susanne Warrenfeltz, Jie Zheng
2015 J jnl
Bioinform.
Andrew S. Warren, Cristina Aurrecoechea, Brian P. Brunk, Prerak Desai, Scott J. Emrich, Gloria I. Giraldo-Calderón, Omar S. Harb, Deborah Hix, Daniel Lawson, Dustin Machi, Chunhong Mao, Michael McClelland, Eric K. Nordberg, Maulik Shukla, Leslie B. Vosshall, Alice R. Wattam, Rebecca Will, Hyun Seung Yoo, Bruno W. S. Sobral
2013 J jnl
Nucleic Acids Res.
Cristina Aurrecoechea, Ana Barreto, John Brestelli, Brian P. Brunk, Shon Cade, Ryan Doherty, Steve Fischer, Bindu Gajria, Xin Gao, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, Sufen Hu, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, Deborah F. Pinney, Brian Pitts, David S. Roos, Ganesh Srinivasamoorthy, Christian J. Stoeckert Jr., Haiming Wang, Susanne Warrenfeltz
2012 J jnl
Nucleic Acids Res.
Jason E. Stajich, Todd W. Harris, Brian P. Brunk, John Brestelli, Steve Fischer, Omar S. Harb, Jessica C. Kissinger, Wei Li, Vishal Nayak, Deborah F. Pinney, Christian J. Stoeckert Jr., David S. Roos
2012 J jnl
Nucleic Acids Res.
Flora J. Logan-Klumpler, Nishadi De Silva, Ulrike Böhme, Matthew B. Rogers, Giles Velarde, Jacqueline A. McQuillan, Tim Carver, Martin Aslett, Christian Olsen, Sandhya Subramanian, Isabelle Phan, Carol Farris, Siddhartha Mitra, Gowthaman Ramasamy, Haiming Wang, Adrian Tivey, Andrew Jackson, Robin Houston, Julian Parkhill, Matthew T. G. Holden, Omar S. Harb, Brian P. Brunk, Peter J. Myler, David S. Roos, Mark Carrington, Deborah F. Smith, Christiane Hertz-Fowler, Matthew Berriman
2011 J jnl
Nucleic Acids Res.
Cristina Aurrecoechea, Ana Barreto, John Brestelli, Brian P. Brunk, Elisabet V. Caler, Steve Fischer, Bindu Gajria, Xin Gao, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, Vishal Nayak, Cary Pennington, Deborah F. Pinney, Brian Pitts, David S. Roos, Ganesh Srinivasamoorthy, Christian J. Stoeckert Jr., Charles Treatman, Haiming Wang
2011 conf
ICBO
Jie Zheng, Omar S. Harb, Christian J. Stoeckert Jr.
2011 J jnl
Database J. Biol. Databases Curation
Steve Fischer, Cristina Aurrecoechea, Brian P. Brunk, Xin Gao, Omar S. Harb, Eileen T. Kraemer, Cary Pennington, Charles Treatman, Jessica C. Kissinger, David S. Roos, Christian J. Stoeckert Jr.
2010 J jnl
Nucleic Acids Res.
Cristina Aurrecoechea, John Brestelli, Brian P. Brunk, Steve Fischer, Bindu Gajria, Xin Gao, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, Frank Innamorato, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, John A. Miller, Vishal Nayak, Cary Pennington, Deborah F. Pinney, David S. Roos, Chris Ross, Ganesh Srinivasamoorthy, Christian J. Stoeckert Jr., Ryan Thibodeau, Charles Treatman, Haiming Wang
2010 J jnl
Nucleic Acids Res.
Martin Aslett, Cristina Aurrecoechea, Matthew Berriman, John Brestelli, Brian P. Brunk, Mark Carrington, Daniel P. Depledge, Steve Fischer, Bindu Gajria, Xin Gao, Malcolm J. Gardner, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, Christiane Hertz-Fowler, Robin Houston, Frank Innamorato, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, Flora J. Logan, John A. Miller, Siddhartha Mitra, Peter J. Myler, Vishal Nayak, Cary Pennington, Isabelle Phan, Deborah F. Pinney, Gowthaman Ramasamy, Matthew B. Rogers, David S. Roos, Chris Ross, Dhileep Sivam, Deborah F. Smith, Ganesh Srinivasamoorthy, Christian J. Stoeckert Jr., Sandhya Subramanian, Ryan Thibodeau, Adrian Tivey, Charles Treatman, Giles Velarde, Haiming Wang
2009 J jnl
Nucleic Acids Res.
Cristina Aurrecoechea, John Brestelli, Brian P. Brunk, Jane M. Carlton, Jennifer Dommer, Steve Fischer, Bindu Gajria, Xin Gao, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, Frank Innamorato, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, John A. Miller, Hilary G. Morrison, Vishal Nayak, Cary Pennington, Deborah F. Pinney, David S. Roos, Chris Ross, Christian J. Stoeckert Jr., Steven Sullivan, Charles Treatman, Haiming Wang
2009 J jnl
Nucleic Acids Res.
Cristina Aurrecoechea, John Brestelli, Brian P. Brunk, Jennifer Dommer, Steve Fischer, Bindu Gajria, Xin Gao, Alan R. Gingle, Gregory R. Grant, Omar S. Harb, Mark Heiges, Frank Innamorato, John Iodice, Jessica C. Kissinger, Eileen T. Kraemer, Wei Li, John A. Miller, Vishal Nayak, Cary Pennington, Deborah F. Pinney, David S. Roos, Chris Ross, Christian J. Stoeckert Jr., Charles Treatman, Haiming Wang
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