Igor Burago

11 papers B 2Misc 5Journal 3Unranked 1
YearRankTypeTitle / Venue / Authors
2019 B conf
ISIT
Igor Burago, Marco Levorato
2019 J jnl
IEEE Trans. Smart Grid
Korosh Vatanparvar, Sina Faezi, Igor Burago, Marco Levorato, Mohammad Abdullah Al Faruque
2018 Misc conf
ITA
Igor Burago, Marco Levorato
2018 Misc conf
ACSSC
Igor Burago, Marco Levorato
2017 B conf
SECON
Igor Burago, Marco Levorato, Aakanksha Chowdhery
2017 Misc conf
CODES+ISSS
Korosh Vatanparvar, Sina Faezi, Igor Burago, Marco Levorato, Mohammad Abdullah Al Faruque
2017 Misc conf
ACSSC
Igor Burago, Davide Callegaro, Marco Levorato, Sameer Singh
2017 J jnl
CoRR
Igor Burago, Marco Levorato, Sameer Singh
2017 Misc conf
ITA
Igor Burago, Marco Levorato, Sameer Singh
2015 conf
AISec@CCS
Igor Burago, Daniel Lowd
2015 J jnl
IEEE Trans. Cogn. Commun. Netw.
Igor Burago, Marco Levorato
redb/extractors/decompiler/bninja/analysis/low_level_normalization.py
← Index redb/extractors/decompiler/bninja/analysis/low_level_normalization.py python
from binaryninja import (
    ILRegister, ILRegisterStack, ILFlag,
    ILIntrinsic, ILSemanticFlagGroup,
)

class LowLevelNormalization:
    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 hasattr(op, "operation"):
                self._collect_ops(op, ops)
            elif isinstance(op, (list, tuple)):
                for sub in op:
                    if hasattr(sub, "operation"):
                        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, ILRegister):
            return "REG"
        if isinstance(val, ILRegisterStack):
            return "REG_STACK"
        if isinstance(val, ILFlag):
            return "FLAG"
        if isinstance(val, ILSemanticFlagGroup):
            return "FLAG_GROUP"
        if isinstance(val, ILIntrinsic):
            return "INTRINSIC"
        if isinstance(val, bool):
            return "BOOL"
        if isinstance(val, int):
            return "CONST"
        return type(val).__name__.upper()

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

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