Ilkay Ulusoy

58 papers A* 2A 1B 2C 4Journal 24Unranked 24
YearRankTypeTitle / Venue / Authors
2024 J jnl
Neuromorph. Comput. Eng.
Ugurcan Çakal, Maryada, Chenxi Wu, Ilkay Ulusoy, Dylan Richard Muir
2024 conf
ECCV Workshops (18)
Gulin Tufekci Dogan, Ramazan Gokberk Cinbis, Ilkay Ulusoy
2023 A conf
WACV
Alper Kayabasi, Gülin Tüfekci, Ilkay Ulusoy
2023 J jnl
CoRR
Ugurcan Çakal, Ilkay Ulusoy, Dylan R. Muir
2022 conf
SIU
Gülin Tüfekci, Alper Kayabasi, Ilkay Ulusoy
2022 conf
ECCV Workshops (6)
Gülin Tüfekci, Alper Kayabasi, Erdem Akagündüz, Ilkay Ulusoy
2022 J jnl
CoRR
Gülin Tüfekci, Alper Kayabasi, Erdem Akagündüz, Ilkay Ulusoy
2022 J jnl
CoRR
Alper Kayabasi, Gülin Tüfekci, Ilkay Ulusoy
2022 conf
SIU
Ilkay Ulusoy, Botan Yildirim
2022 J jnl
IEEE Trans. Image Process.
Görkem Algan, Ilkay Ulusoy
2021 J jnl
Knowl. Based Syst.
Görkem Algan, Ilkay Ulusoy
2021 J jnl
CoRR
Görkem Algan, Ilkay Ulusoy
2020 J jnl
CoRR
Görkem Algan, Ilkay Ulusoy, Saban Gönül, Banu Turgut, Berker Bakbak
2020 J jnl
CoRR
Görkem Algan, Ilkay Ulusoy
2020 B conf
ICPR
Görkem Algan, Ilkay Ulusoy
2020 J jnl
CoRR
Görkem Algan, Ilkay Ulusoy
2019 conf
SIU
Haluk Barkin Evgin, Oguzhan Babacan, Ilkay Ulusoy, Yasemin Hosgören, Adnan Kusman, Damla Sayar, Bora Baskak, Halise Devrimci Özgüven
2019 J jnl
CoRR
Görkem Algan, Ilkay Ulusoy
2018 conf
SIU
Mehmet Sefik Guleryuz, Ilkay Ulusoy
2018 conf
SIU
Sajjad Baghaee, Ilkay Ulusoy
2017 J jnl
Ann. Oper. Res.
V. Rasoulzadeh, Ekin Can Erkus, T. A. Yogurt, Ilkay Ulusoy, S. Aykan Zergeroglu
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Mehmet Altan Toksöz, Ilkay Ulusoy
2017 conf
SIU
Mehmet Altan Toksöz, Ilkay Ulusoy
2016 J jnl
Pattern Recognit. Lett.
Burak Altinoklu, Ilkay Ulusoy, Sibel Tari
2016 J jnl
IET Comput. Vis.
Mehmet Altan Toksöz, Ilkay Ulusoy
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Mehmet Altan Toksöz, Ilkay Ulusoy
2015 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Çaglar Aytekin, Yousef Rezaeitabar, Sedat Dogru, Ilkay Ulusoy
2014 conf
ICT Innovations
Ilkay Ulusoy, Yousef Rezaeitabar, Nihan K. Çiçekli
2013 conf
ICME Workshops
Itir Onal, Karani Kardas, Yousef Rezaeitabar, Ulya Bayram, Murat Bal, Ilkay Ulusoy, Nihan Kesim Cicekli
2013 C conf
IGARSS
Kerem Sahin, Ilkay Ulusoy
2013 conf
SIU
Ulya Bayram, Ilkay Ulusoy, Nihan Kesim Cicekli
2013 conf
ICME Workshops
Karani Kardas, Ilkay Ulusoy, Nihan Kesim Cicekli
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Örsan Aytekin, Mehmet Koç, Ilkay Ulusoy
2013 J jnl
Multim. Tools Appl.
Mehmet C. Yilmaztürk, Ilkay Ulusoy, Nihan Kesim Cicekli
2012 C conf
IGARSS
Örsan Aytekin, Mehmet Koç, Ilkay Ulusoy
2012 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Yousef Rezaeitabar, Ilkay Ulusoy
2012 C conf
IGARSS
Örsan Aytekin, Mauro Dalla Mura, Ilkay Ulusoy, Jón Atli Benediktsson
2012 conf
SIU
Ismail Ozsarac, Ilkay Ulusoy
2011 J jnl
Comput. Animat. Virtual Worlds
Ilkay Ulusoy, Erdem Akagündüz, Murat Yirci
2011 J jnl
Pattern Recognit. Lett.
Örsan Aytekin, Ilkay Ulusoy
2011 C conf
IGARSS
Örsan Aytekin, Yousef Rezaeitabar, Ilkay Ulusoy
2010 conf
ISCIS
Mehmet C. Yilmaztürk, Ilkay Ulusoy, Nihan Kesim Cicekli
2010 conf
ISCIS
Gökhan Yaprakkaya, Nihan Kesim Cicekli, Ilkay Ulusoy
2010 ed.
SSPR/SPR
Edwin R. Hancock, Richard C. Wilson, Terry Windeatt, Ilkay Ulusoy, Francisco Escolano
2009 B conf
ICIP
Erdem Akagündüz, Omer Eskizara, Ilkay Ulusoy
2008 conf
IGARSS (3)
Erdem Akagündüz, Arzu Erener, Ilkay Ulusoy, H. Sebnem Düzgün
2007 A* conf
ICCV
Erdem Akagündüz, Ilkay Ulusoy
2007 J jnl
Pattern Recognit.
Ilkay Ulusoy, Edwin R. Hancock
2007 A* conf
CVPR
Erdem Akagündüz, Ilkay Ulusoy
2006 conf
Toward Category-Level Object Recognition
Ilkay Ulusoy, Christopher M. Bishop
2005 conf
TAINN
Ilkay Ulusoy
2005 conf
CVPR (2)
Ilkay Ulusoy, Christopher M. Bishop
2005 conf
MLCW
Mark Everingham, Andrew Zisserman, Christopher K. I. Williams, Luc Van Gool, Moray Allan, Christopher M. Bishop, Olivier Chapelle, Navneet Dalal, Thomas Deselaers, Gyuri Dorkó, Stefan Duffner, Jan Eichhorn, Jason D. R. Farquhar, Mario Fritz, Christophe Garcia, Tom Griffiths, Frédéric Jurie, Daniel Keysers, Markus Koskela, Jorma Laaksonen, Diane Larlus, Bastian Leibe, Hongying Meng, Hermann Ney, Bernt Schiele, Cordelia Schmid, Edgar Seemann, John Shawe-Taylor, Amos J. Storkey, Sándor Szedmák, Bill Triggs, Ilkay Ulusoy, Ville Viitaniemi, Jianguo Zhang
2004 conf
ISCIS
Ilkay Ulusoy, Ugur Halici, Kemal Leblebicioglu
2004 conf
Deterministic and Statistical Methods in Machine Learning
Christopher M. Bishop, Ilkay Ulusoy
2004 conf
ICPR (4)
Ilkay Ulusoy, Ugur Halici, Edwin R. Hancock
2004 J jnl
Biol. Cybern.
Ilkay Ulusoy, Ugur Halici, Erhan Nalçaci, Ilker Anaç, Kemal Leblebicioglu, Canan Basar-Ero
2002 conf
SSPR/SPR
Ilkay Ulusoy, Edwin R. Hancock, Ugur Halici
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()