Hannu Karvonen

27 papers A* 1B 1C 1Misc 2Journal 3Unranked 19
YearRankTypeTitle / Venue / Authors
2025 conf
HCI (11)
Hannu Karvonen, Kati Pihko, Eino Haakana, Tom Jakobsson, Sofia Wasastjerna
2023 B conf
PIMRC
Antti Anttonen, Aarne Mämmelä, Marko Höyhtyä, Fabrice Saffre, Hannu Karvonen
2023 conf
HCI (8)
Hannu Karvonen, Eija Honkavaara, Juha Röning, Vadym Kramar, Jukka Sassi
2022 conf
HCI (6)
Jari Laarni, Antti Väätänen, Hannu Karvonen, Toni Lastusilta, Fabrice Saffre
2021 conf
HCI (6)
Fabrice Saffre, Hanno Hildmann, Hannu Karvonen
2020 conf
IntelliSys (3)
Valtteri Vuorimaa, Eetu Heikkilä, Hannu Karvonen, Kari T. Koskinen, Jouko Laitinen
2020 conf
HCI (7)
Hannu Karvonen, Eetu Heikkilä, Mikael Wahlström
2018 conf
HWID
Hannu Karvonen, Eetu Heikkilä, Mikael Wahlström
2018 conf
HWID
Virpi Roto, Philippe A. Palanque, Hannu Karvonen
2018 conf
HWID
Pertti Saariluoma, Hannu Karvonen, Rebekah Rousi
2017 A* conf
CHI
Virpi Roto, Eija Kaasinen, Tomi Heimonen, Hannu Karvonen, Jussi P. P. Jokinen, Petri Mannonen, Hannu Nousu, Jaakko Hakulinen, Yichen Lu, Pertti O. Saariluoma, Tiina Kymäläinen, Tuuli Keskinen, Markku Turunen, Hanna Maria Kaarina Koskinen
2016 J jnl
Int. J. Hum. Comput. Stud.
Tuomo Kujala, Hannu Karvonen, Jakke Mäkelä
2016 conf
HCI (6)
Jari Laarni, Hannu Karvonen, Satu Pakarinen, Jari Torniainen
2015 J jnl
Behav. Inf. Technol.
Eija Kaasinen, Virpi Roto, Jaakko Hakulinen, Tomi Heimonen, Jussi P. P. Jokinen, Hannu Karvonen, Tuuli Keskinen, Hanna Koskinen, Yichen Lu, Pertti Saariluoma, Helena Tokkonen, Markku Turunen
2015 Misc conf
OZCHI
Jari Varsaluoma, Heli Väätäjä, Eija Kaasinen, Hannu Karvonen, Yichen Lu
2014 conf
HCI (17)
Hannu Karvonen, Hanna Koskinen, Helena Tokkonen, Jaakko Hakulinen
2014 Misc conf
NordiCHI
Eija Kaasinen, Heli Väätäjä, Hannu Karvonen, Yichen Lu
2013 conf
ECCE
Marja Liinasuo, Iina Aaltonen, Hannu Karvonen, Leena Norros, Beatriz Fuentes
2013 conf
ECCE
Hanna Koskinen, Hannu Karvonen, Helena Tokkonen
2012 conf
ECCE
Hannu Karvonen, Hanna Koskinen, Jaakko Haggrén
2012 conf
ECCE
Marja Liinasuo, Hannu Karvonen, Iina Aaltonen, Beatriz Fuentes, Alfonso Castro
2011 J jnl
Interact. Comput.
Hannu Karvonen, Iina Aaltonen, Mikael Wahlström, Leena Salo, Paula Savioja, Leena Norros
2011 conf
HCI (21)
Jari Laarni, Paula Savioja, Hannu Karvonen, Leena Norros
2010 C conf
ACHI
Hannu Karvonen, Pertti Saariluoma, Tuomo Kujala
2010 conf
ECCE
Hannu Karvonen
2010 conf
ECCE
Hannu Karvonen, Iina Aaltonen, Mikael Wahlström, Leena Salo, Paula Savioja, Leena Norros
2006 conf
ITSC
Hannu Karvonen, Tuomo Kujala, Pertti Saariluoma
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