Jackson Wilke da Cruz Souza

13 papers Unranked 13
YearRankTypeTitle / Venue / Authors
2025 conf
STIL
Marquize Silva dos Santos, Roana Rodrigues, Jackson Wilke da Cruz Souza
2025 conf
STIL
Mateus Araújo Pereira, Jackson Wilke da Cruz Souza
2025 conf
STIL
Carlos Vitor Cardoso da Silva, Jackson Wilke da Cruz Souza, Paula Christina Figueira Cardoso
2024 conf
STIL
Paula C. F. Cardoso, Jackson Wilke da Cruz Souza, Roana Rodrigues, Ewerson Dantas, Larissa Jesus Santa Bárbara, Mateus Araújo Pereira, Naira Gama, Tobias J. A. Almeida, Gabriel Cruz
2024 conf
STIL
Iolanda Victoria Morais Ramos, Jackson Wilke da Cruz Souza
2024 conf
STIL
Naira Silva Gama, Jackson Wilke da Cruz Souza
2024 conf
STIL
Ewerson Dantas, Roana Rodrigues, Jackson Wilke da Cruz Souza
2024 conf
STIL
Larissa Jesus Santa Bárbara, Roana Rodrigues, Jackson Wilke da Cruz Souza
2024 conf
STIL
Mateus Araújo Pereira, Jackson Wilke da Cruz Souza
2023 conf
STIL
Roana Rodrigues, Jackson Wilke da Cruz Souza, Paula Christina Figueira Cardoso
2021 conf
STIL
Sabrina de Fátima Barbosa Taniwaki, Jackson Wilke da Cruz Souza
2017 conf
IberEval@SEPLN
Thiago Alexandre Salgueiro Pardo, Jorge Baptista, Magali Sanches Duran, Maria das Graças Volpe Nunes, Fernando Antônio Asevedo Nóbrega, Sandra Maria Aluísio, Ariani Di Felippo, Eloize Rossi Marques Seno, Raphael Rocha da Silva, Rafael Torres Anchiêta, Henrico Bertini Brum, Márcio de Souza Dias, Rafael de Sousa Oliveira Martins, Erick Galani Maziero, Jackson Wilke da Cruz Souza, Francielle Alves Vargas
2015 conf
LAW@NAACL-HLT
Roque Enrique López Condori, Thiago Alexandre Salgueiro Pardo, Lucas Avanço, Pedro Paulo Balage Filho, Alessandro Bokan, Paula Christina Figueira Cardoso, Márcio de Souza Dias, Fernando Antônio Asevedo Nóbrega, Marco Antonio Sobrevilla Cabezudo, Jackson Wilke da Cruz Souza, Andressa Zacarias, Eloize Rossi Marques Seno, Ariani Di Felippo
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}"