Oleksandr Martynyuk

27 papers A 1Misc 1Journal 1Unranked 24
YearRankTypeTitle / Venue / Authors
2023 conf
IDAACS
Oleksandr Martynyuk, Oleksandr Drozd, Anatoliy Sachenko, Dmitry Martynyuk, Igor Mileiko, Igor Kopytchuk, Grygoriy Hladiy
2023 conf
EWDTS
Oleksandr Martynyuk, Oleksandr Drozd, Lyudmila Sugak, Sergiy Kravtsov, Dmitry Martynyuk, Igor Kovalev
2023 conf
DESSERT
Oleksandr Martynyuk, Oleksandr Drozd, Bui Van Thuong, Hanna Stepova, Lyudmila Sugak, Dmitry Martynyuk
2022 conf
IntelITSIS
Oleksandr Drozd, Illya Baskov, Oleksandr Martynyuk, Kostiantyn Zashcholkin, Myroslav Drozd
2022 conf
IntelITSIS
Oleksandr Martynyuk, Oleksandr Drozd, Anatoliy Sachenko, Kostiantyn Zashcholkin, Igor Mileiko
2021 conf
IntelITSIS
Sergii Surkov, Oleksandr Martynyuk
2021 conf
COLINS
Oleksandr Drozd, Kostiantyn Zashcholkin, Maciej Dobrowolski, Anatoliy Sachenko, Oleksandr Martynyuk, Olena Ivanova, Julia V. Drozd
2021 conf
EWDTS
Oleksandr Martynyuk, Oleksandr Drozd, Hanna Stepova, Bui Van Thuong, Dmitry Martynyuk, Lyudmila Sugak
2021 conf
IntelITSIS
Oleksandr Martynyuk, Lyudmila Sugak, Hanna Stepova, Viktor Antoniuk, Igor Mileiko
2021 conf
EWDTS
Oleksandr Drozd, Andrzej Rucinski, Kostiantyn Zashcholkin, Oleksandr Martynyuk, Julia V. Drozd
2021 conf
IDAACS
Oleksandr Martynyuk, Oleksandr Drozd, Anatoliy Sachenko, Hanna Stepova, Dmitry Martynyuk, Lyudmila Sugak, Iryna Turchenko
2020 conf
IntelITSIS
Oleksandr Drozd, Igor Kovalev, Oleksandr Martynyuk, Kostiantyn Zashcholkin, Julia V. Drozd
2020 A conf
ICST
Oleksandr Drozd, Oleksandr Martynyuk, Kostiantyn Zashcholkin, Mykola Kuznietsov, Julia V. Drozd, Anastasiya Troynina
2020 conf
ICTES
Oleksandr Martynyuk, Oleksandr Drozd, Hanna Stepova, Viktor Antonyuk, Dmitry Martynyuk
2020 conf
ICTES
Oleksandr Drozd, Kostiantyn Zashcholkin, Oleksandr Martynyuk, Olena Ivanova, Julia V. Drozd
2020 conf
EWDTS
Oleksandr Drozd, Kostiantyn Zashcholkin, Oleksandr Martynyuk, Julia V. Drozd, Yulian Sulima
2020 conf
DESSERT
Oleksandr Drozd, Vitaliy A. Romankevich, Mykola Kuznietsov, Myroslav Drozd, Oleksandr Martynyuk
2019 conf
ICTES
Oleksandr Drozd, Oleksandr Martynyuk, Kostiantyn Zashcholkin, Julia V. Drozd
2019 conf
IDAACS
Oleksandr Martynyuk, Oleksandr Drozd, Ahmesh Tamim, Bui Van Thuong, Anatoliy Sachenko, Halyna Mykhailova, Mykhaylo Dombrovskyi
2019 conf
IDAACS
Oleksandr Martynyuk, Oleksandr Drozd, Hanna Stepova, Dmitry Martynyuk
2019 conf
EWDTS
Oleksandr Martynyuk, Oleksandr Drozd, Hanna Suhak, Dmitry Martynyuk, Lyudmila Sugak
2019 conf
IDAACS
Oleksandr Drozd, Igor Kovalev, Miroslav Drozd, Oleksandr Martynyuk, Serhii Polozhaenko
2017 conf
IDAACS
Oleksandr Martynyuk, Anna Sugak, Dmitry Martynyuk, Oleksandr Drozd
2017 Misc conf
ICTERI
Oleksandr Drozd, Miroslav Drozd, Oleksandr Martynyuk, Mykola Kuznietsov
2015 conf
IDAACS
Sergii Surkov, Oleksandr Martynyuk
2015 conf
IDAACS
Anna Sugak, Oleksandr Martynyuk, Oleksandr Drozd
2015 J jnl
Int. J. Comput.
Anna Sugak, Oleksandr Martynyuk, Oleksandr Drozd
redb/extractors/decompiler/bninja/analysis/scores.py
← Index redb/extractors/decompiler/bninja/analysis/scores.py python
from collections import deque
from binaryninja import highlevelil
from binaryninja.enums import HighLevelILOperation


class ObfuscationScores:
    def __init__(self, hlil_function):
        self.function = hlil_function
        self._basic_blocks = list(hlil_function.basic_blocks) if hlil_function and hlil_function.basic_blocks else []
        self._block_count = len(self._basic_blocks)

    def flattened_score(self):
        """
        A heuristic for detecting control flow flattening from Tim Blazytko.
        Source: https://www.synthesis.to/2021/03/03/flattening_detection.html
        """
        if self._block_count == 0:
            return 0.0

        max_flattening_ratio = 0.0

        for basic_block in self._basic_blocks:
            dominated = get_dominated_by(basic_block)
            if not any(edge.source in dominated for edge in basic_block.incoming_edges):
                continue
            ratio = len(dominated) / self._block_count
            if ratio > max_flattening_ratio:
                max_flattening_ratio = ratio

        return max_flattening_ratio

    def MBA_score(self):
        """
        Score for MBA is obtained by the number of instructions that have at least one arithmetic operation and
        one logic operation DIVIDED by the number of instructions.
        """
        total = 0
        mba_count = 0

        for ins in self.function.instructions:
            total += 1
            if uses_mba(ins):
                mba_count += 1

        if total == 0:
            return 0.0

        return mba_count / total

def get_dominated_by(dominator):
    """
    Get the dominators that are dominated by the given dominator.
    (To recall the theory, a basic block B is called dominator for A if every path from START
    to A must include B)
    """
    result = set()
    worklist = deque([dominator])

    while worklist:
        block = worklist.popleft()
        if block in result:
            continue
        result.add(block)
        worklist.extend(block.dominator_tree_children)

    return result

_ARITHMETIC_OPS = frozenset({
    HighLevelILOperation.HLIL_ADD,
    HighLevelILOperation.HLIL_NEG,
    HighLevelILOperation.HLIL_SUB,
    HighLevelILOperation.HLIL_MUL,
    HighLevelILOperation.HLIL_DIVS,
    HighLevelILOperation.HLIL_MODS,
})

_LOGIC_OPS = frozenset({
    HighLevelILOperation.HLIL_NOT,
    HighLevelILOperation.HLIL_AND,
    HighLevelILOperation.HLIL_OR,
    HighLevelILOperation.HLIL_XOR,
    HighLevelILOperation.HLIL_LSR,
    HighLevelILOperation.HLIL_LSL,
})

_MBA_OPS = _ARITHMETIC_OPS | _LOGIC_OPS

def uses_mba(hlil_instruction):
    uses_logic = False
    uses_arithmetic = False
    stack = [hlil_instruction]

    while stack:
        instruction = stack.pop()

        if not isinstance(instruction, highlevelil.HighLevelILInstruction):
            continue

        op = instruction.operation

        if op not in _MBA_OPS:
            for operand in instruction.operands:
                if isinstance(operand, highlevelil.HighLevelILInstruction):
                    stack.append(operand)
            continue

        if op in _ARITHMETIC_OPS:
            uses_arithmetic = True
        else:
            uses_logic = True

        if uses_logic and uses_arithmetic:
            return True

        for operand in instruction.operands:
            if isinstance(operand, highlevelil.HighLevelILInstruction):
                stack.append(operand)

    return False