Ilya Lebedev

27 papers B 3Misc 6Journal 2Unranked 16
YearRankTypeTitle / Venue / Authors
2026 J jnl
Soft Comput.
Konstantin Barkalov, Denis Karchkov, Evgeny Kozinov, Ilya Lebedev, Lubov Yamschikova, Nikolay O. Nikitin, Marina Usova
2021 J jnl
Entropy
Konstantin Barkalov, Ilya Lebedev, Evgeny Kozinov
2021 Misc conf
IDC
Babyr Rzayev, Ilya Lebedev
2020 conf
RuSCDays
Konstantin Barkalov, Ilya Lebedev, Vassili Toropov
2020 conf
ICR
Viktor Semenov, Mikhail E. Sukhoparov, Ilya Lebedev
2019 conf
WCGO
Konstantin Barkalov, Ilya Lebedev
2019 conf
ICR
Viktor Semenov, Mikhail E. Sukhoparov, Ilya Lebedev
2019 conf
RuSCDays
Konstantin Barkalov, Ilya Lebedev
2018 conf
LION
Victor Gergel, Konstantin Barkalov, Ilya Lebedev
2018 conf
NEW2AN
Viktor Semenov, Mikhail E. Sukhoparov, Ilya Lebedev
2018 conf
NEW2AN
Kseniya I. Salakhutdinova, Irina E. Krivtsova, Ilya Lebedev, Mikhail E. Sukhoparov
2018 conf
RuSCDays
Konstantin Barkalov, Vladislav Sovrasov, Ilya Lebedev
2017 Misc conf
FRUCT
Ilya Lebedev, Nurzhan Bazhayev, Mikhail E. Sukhoparov, Vadim Petrov, Andrei V. Gurtov
2017 conf
LION
Konstantin Barkalov, Ilya Lebedev
2017 B conf
PaCT
Alexander Sysoyev, Konstantin Barkalov, Vladislav Sovrasov, Ilya Lebedev, Victor Gergel
2017 conf
EUROCON
Talgat Manglayev, Refik Çaglar Kizilirmak, Yau Hee Kho, Nurzhan Bazhayev, Ilya Lebedev
2017 B conf
PaCT
Konstantin Barkalov, Ilya Lebedev
2017 conf
RuSCDays
Alexander Sysoyev, Konstantin Barkalov, Vladislav Sovrasov, Ilya Lebedev, Victor Gergel
2016 conf
NEW2AN
Igor A. Zikratov, Oleg Maslennikov, Ilya Lebedev, Aleksandr Ometov, Sergey Andreev
2016 Misc conf
FRUCT
Nurzhan Bazhayev, Ilya Lebedev, Irina E. Krivtsova, Igor A. Zikratov
2016 conf
LION
Konstantin Barkalov, Alexander Sysoyev, Ilya Lebedev, Vladislav Sovrasov
2016 conf
NEW2AN
Ilya Lebedev, Irina E. Krivtsova, Viktoriia M. Korzhuk, Nurzhan Bazhayev, Mikhail E. Sukhoparov, Sergey Pecherkin, Kseniya I. Salakhutdinova
2016 Misc conf
FRUCT
Ilya Lebedev, Viktoriia M. Korzhuk, Irina E. Krivtsova, Kseniya I. Salakhutdinova, Mikhail E. Sukhoparov, Daniil Tikhonov
2015 Misc conf
FRUCT
Alexandr Prozorov, Alexandr Tyukin, Ilya Lebedev, Andrew Priorov
2015 conf
NEW2AN
Ilya Lebedev, Viktoriia M. Korzhuk
2015 B conf
PaCT
Konstantin Barkalov, Victor Gergel, Ilya Lebedev
2014 Misc conf
FRUCT
Alexander Tyukin, Ilya Lebedev, Andrew Priorov
tests/unit/test_decompile_utils.py
← Index tests/unit/test_decompile_utils.py python
"""Unit tests for decompiler utility modules:
- bninja/utils/hashes.py
- bninja/utils/json_encoder.py
- bninja/analysis/low_level_normalization.py
"""
import hashlib
import json
import pytest


# ============================================================================
# 1a. hashes.py
# ============================================================================

from redb.extractors.decompiler.bninja.utils.hashes import (
    calculate_md5,
    calculate_sha256,
    calculate_tlsh,
)


class TestCalculateMD5:
    def test_calculate_md5_known_value(self):
        expected = hashlib.md5(b"test").hexdigest()
        assert calculate_md5("test") == expected

    def test_calculate_md5_empty(self):
        expected = hashlib.md5(b"").hexdigest()
        assert calculate_md5("") == expected


class TestCalculateSHA256:
    def test_calculate_sha256_known_value(self):
        expected = hashlib.sha256(b"hello world").hexdigest()
        assert calculate_sha256("hello world") == expected

    def test_calculate_sha256_empty_string(self):
        result = calculate_sha256("")
        assert len(result) == 64
        assert all(c in "0123456789abcdef" for c in result)


class TestCalculateTLSH:
    def test_calculate_tlsh_long_data(self):
        # TLSH requires >= 50 bytes
        data = "A" * 100
        result = calculate_tlsh(data)
        assert result is not None
        assert isinstance(result, str)

    def test_calculate_tlsh_short_data(self):
        data = "A" * 10
        result = calculate_tlsh(data)
        assert result is None

    def test_calculate_tlsh_deterministic(self):
        data = "x" * 200
        assert calculate_tlsh(data) == calculate_tlsh(data)



# ============================================================================
# 1b. json_encoder.py
# ============================================================================

from redb.extractors.decompiler.bninja.utils.json_encoder import BinaryNinjaEncoder


class TestBinaryNinjaEncoder:
    def test_encode_value_confidence_object(self):
        obj = type("VC", (), {"value": 42, "confidence": 255})()
        result = json.dumps(obj, cls=BinaryNinjaEncoder)
        assert json.loads(result) == 42

    def test_encode_str_fallback(self):
        obj = type("Obj", (), {"__str__": lambda self: "custom_repr"})()
        result = json.dumps(obj, cls=BinaryNinjaEncoder)
        assert json.loads(result) == "custom_repr"

    def test_encode_normal_types(self):
        data = {"a": 1, "b": [2, 3], "c": "hello"}
        result = json.dumps(data, cls=BinaryNinjaEncoder)
        assert json.loads(result) == data

    def test_encode_set_via_str(self):
        # Python sets have __str__, so BinaryNinjaEncoder converts them
        # to their string repr instead of raising TypeError.
        result = json.dumps(set([1, 2, 3]), cls=BinaryNinjaEncoder)
        parsed = json.loads(result)
        assert isinstance(parsed, str)
        assert "1" in parsed


# ============================================================================
# 1c. low_level_normalization.py
# ============================================================================

from redb.extractors.decompiler.bninja.analysis.low_level_normalization import (
    LowLevelNormalization,
)


class MockIL:
    """Mock IL node for normalization tests."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class TestLowLevelNormalization:
    def setup_method(self):
        self.normalizer = LowLevelNormalization()

    def test_normalize_single_instruction(self):
        node = MockIL(operation=5)
        result = self.normalizer.normalize_instruction_all_levels(node)
        assert result == [5]

    def test_normalize_nested_operands(self):
        child1 = MockIL(operation=10)
        child2 = MockIL(operation=20)
        root = MockIL(operation=1, operands=[child1, child2])
        result = self.normalizer.normalize_instruction_all_levels(root)
        assert result == [1, 10, 20]

    def test_normalize_empty_operands(self):
        node = MockIL(operation=42, operands=[])
        result = self.normalizer.normalize_instruction_all_levels(node)
        assert result == [42]

    def test_normalize_list_operands(self):
        # Simulates phi-node style list operands
        inner = MockIL(operation=99)
        node = MockIL(operation=7, operands=[[inner]])
        result = self.normalizer.normalize_instruction_all_levels(node)
        assert result == [7, 99]

    def test_normalize_none_input(self):
        result = self.normalizer.normalize_instruction_all_levels(None)
        assert result == []