Oliver Pohl

13 papers Journal 5Unranked 8
YearRankTypeTitle / Venue / Authors
2024 conf
ISGT EUROPE
Hinrikus Wolf, Luis Böttcher, Sarra Bouchkati, Philipp Lutat, Jens Breitung, Bastian Jung, Tina Möllemann, Viktor Todosijevic, Jan Schiefelbein-Lach, Oliver Pohl, Andreas Ulbig, Martin Grohe
2024 J jnl
CoRR
Hinrikus Wolf, Luis Böttcher, Sarra Bouchkati, Philipp Lutat, Jens Breitung, Bastian Jung, Tina Möllemann, Viktor Todosijevic, Jan Schiefelbein-Lach, Oliver Pohl, Andreas Ulbig, Martin Grohe
2022 conf
ISGT
Oliver Kraft, Oliver Pohl, Ulf Häger, Kai Heussen, Nils Müller, Zeeshan Afzal, Mathias Ekstedt, Hossein Farahmand, Dmytro Ivanko, Ankit Singh, Sasiphong Leksawat, Andreas Kubis
2022 J jnl
CoRR
Luis Böttcher, Hinrikus Wolf, Bastian Jung, Philipp Lutat, Marc Trageser, Oliver Pohl, Andreas Ulbig, Martin Grohe
2019 conf
DHd
Oliver Pohl, Michael Marx, Stefanie Franke, Farah Artika, Markus Schnöpf, Edin Mahmutovic
2019 conf
DHd
Oliver Pohl, Teodora Dogaru, Jonas Müller-Laackman
2018 conf
ISGT
Oliver Pohl, Stefan Dalhues, Christian Rehtanz
2017 J jnl
PLoS Comput. Biol.
Oliver Pohl, Marius Hintsche, Zahra Alirezaeizanjani, Maximilian Seyrich, Carsten Beta, Holger Stark
2017 conf
DHd
Oliver Pohl, Torsten Schrade
2016 conf
DH
Tobias Jocham, Michael Marx, Oliver Pohl, Markus Schnöpf
2014 J jnl
PLoS Comput. Biol.
Alessandro Attanasi, Andrea Cavagna, Lorenzo Del Castello, Irene Giardina, Stefania Melillo, Leonardo Parisi, Oliver Pohl, Bruno Rossaro, Edward Shen, Edmondo Silvestri, Massimiliano Viale
2014 conf
MTSR
Oliver Pohl
2012 J jnl
Inf. Wiss. Prax.
Violeta Sekulovic, Christiane Waldau, Oliver Pohl
tests/unit/test_decompile_strings.py
← Index tests/unit/test_decompile_strings.py python
"""Unit tests for bninja/analysis/strings.py — StringAnalysis."""
import pytest
import math
from unittest.mock import MagicMock


# StringAnalysis has no binaryninja imports, just collections and math
from redb.extractors.decompiler.bninja.analysis.strings import StringAnalysis


# ============================================================================
# Helper mocks
# ============================================================================

class MockStringEntry:
    """Mock for a Binary Ninja string reference."""
    def __init__(self, value, raw=None, start=0, length=0, type_name="Utf8String"):
        self.value = value
        self.raw = raw if raw is not None else (value.encode("utf-8") if isinstance(value, str) else value)
        self.start = start
        self.length = length if length else len(self.raw)
        self.type = MagicMock()
        self.type.name = type_name


class MockBinaryView:
    """Mock binary view with a strings list."""
    def __init__(self, strings=None):
        self.strings = strings or []


# ============================================================================
# 6a. StringAnalysis
# ============================================================================


class TestStringAnalysisEntropy:
    def setup_method(self):
        self.sa = StringAnalysis(bv=MockBinaryView(), functions=[])

    def test_entropy_empty_string(self):
        assert self.sa.entropy("") == 0.0

    def test_entropy_single_char(self):
        assert self.sa.entropy("aaaa") == 0.0

    def test_entropy_uniform_distribution(self):
        # "abcd" -> 4 unique chars, each p=1/4, entropy = log2(4) = 2.0
        result = self.sa.entropy("abcd")
        assert result == pytest.approx(2.0)

    def test_entropy_binary_string(self):
        # "ab" -> 2 unique chars, each p=1/2, entropy = log2(2) = 1.0
        result = self.sa.entropy("ab")
        assert result == pytest.approx(1.0)


class TestStringAnalysisAnalyze:
    def test_analyze_deduplication(self):
        """Duplicate (string, encoding) pairs -> only first kept."""
        entries = [
            MockStringEntry("hello", start=100, type_name="Utf8String"),
            MockStringEntry("hello", start=200, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        assert result[0]["string_offset"] == 100

    def test_analyze_sorted_by_address(self):
        """First occurrence (lowest offset) is the one kept."""
        entries = [
            MockStringEntry("world", start=500, type_name="Utf8String"),
            MockStringEntry("world", start=100, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        # The analyze() sorts by start, so 100 comes first
        assert result[0]["string_offset"] == 100

    def test_analyze_empty_bv(self):
        bv = MockBinaryView(strings=[])
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert result == []

    def test_analyze_output_schema(self):
        entries = [MockStringEntry("test_string", start=0, type_name="Utf8String")]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        r = result[0]
        required_keys = [
            "string",
            "string_raw",
            "string_encoding",
            "string_offset",
            "string_length",
            "string_raw_length",
            "string_entropy",
        ]
        for key in required_keys:
            assert key in r, f"Missing key: {key}"