Vedran Ljubovic

12 papers Journal 2Unranked 10
YearRankTypeTitle / Venue / Authors
2023 conf
UMAP (Adjunct Publication)
Mubina Kamberovic, Senka Krivic, Amra Delic, Sándor Szedmák, Vedran Ljubovic
2022 conf
MIPRO
S. Celosmanovic, Vedran Ljubovic
2020 J jnl
IEEE Access
Vedran Ljubovic, Enil Pajic
2020 conf
MIPRO
Mirza Mesihovic, Vedran Ljubovic, Ibrahim Muharemovic
2019 conf
ICAT
Faruk Mustafic, Irfan Prazina, Vedran Ljubovic
2019 conf
MIPRO
Enil Pajic, Vedran Ljubovic
2019 conf
MIPRO
Ajdin Mujezinovic, Vedran Ljubovic
2015 J jnl
Comput. Graph. Forum
Vedran Ljubovic, Haris Supic
2014 conf
SCCG
Vedran Ljubovic, Haris Supic
2013 conf
ICAT
Vedran Ljubovic, Haris Supic
2009 conf
ICAT
Vedran Ljubovic, Haris Supic
2009 conf
ICAT
Vedran Ljubovic
redb/extractors/decompiler/bninja/analysis/medium_level_normalization.py
← Index redb/extractors/decompiler/bninja/analysis/medium_level_normalization.py python
from binaryninja import (
    MediumLevelILInstruction,
    Variable, SSAVariable,
    ILIntrinsic,
)


class MediumLevelNormalization:
    def __init__(self):
        return

    def _collect_ops(self, il, ops):
        if il is None:
            return
        ops.append(int(il.operation))
        operands = getattr(il, "operands", None)
        if not operands:
            return
        for op in operands:
            if isinstance(op, MediumLevelILInstruction):
                self._collect_ops(op, ops)
            elif isinstance(op, (list, tuple)):
                for sub in op:
                    if isinstance(sub, MediumLevelILInstruction):
                        self._collect_ops(sub, ops)

    def normalize_instruction_all_levels(self, instr_il):
        ops = []
        self._collect_ops(instr_il, ops)
        return ops

    def _leaf_type(self, val):
        if isinstance(val, SSAVariable):
            return "SSA_VAR"
        if isinstance(val, Variable):
            return "VAR"
        if isinstance(val, ILIntrinsic):
            return "INTRINSIC"
        if isinstance(val, bool):
            return "BOOL"
        if isinstance(val, float):
            return "FLOAT_CONST"
        if isinstance(val, int):
            return "CONST"
        if isinstance(val, str):
            return "STR"
        return type(val).__name__.upper()

    def _collect(self, il, out_op):
        if il is None:
            return
        out_op.append(int(il.operation))
        operands = getattr(il, "operands", None)
        if not operands:
            return
        for op in operands:
            if isinstance(op, MediumLevelILInstruction):
                self._collect(op, out_op)
            elif isinstance(op, (list, tuple)):
                for sub in op:
                    if isinstance(sub, MediumLevelILInstruction):
                        self._collect(sub, out_op)
                    else:
                        out_op.append(self._leaf_type(sub))
            else:
                out_op.append(self._leaf_type(op))

    def normalize_instr_with_operands(self, instr_il):
        ops = []
        self._collect(instr_il, ops)
        return ops