M. P. S. Bhatia

35 papers A 3B 1Journal 23Unranked 8
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Sens. Networks
Sakshi, M. P. S. Bhatia, Pinaki Chakraborty
2025 J jnl
Multim. Tools Appl.
Muzafar Mehraj Misgar, M. P. S. Bhatia
2024 J jnl
ACM Trans. Asian Low Resour. Lang. Inf. Process.
Ravleen Kaur, M. P. S. Bhatia, Akshi Kumar
2024 J jnl
Expert Syst. Appl.
Rajeev Kumar, M. P. S. Bhatia
2024 J jnl
Expert Syst. J. Knowl. Eng.
Anshika Arora, Pinaki Chakraborty, M. P. S. Bhatia, Akshi Kumar
2024 J jnl
Comput. Intell.
Sakshi, M. P. S. Bhatia, Pinaki Chakraborty
2024 J jnl
Biomed. Signal Process. Control.
Muzafar Mehraj Misgar, M. P. S. Bhatia
2024 J jnl
Multim. Tools Appl.
Muzafar Mehraj Misgar, M. P. S. Bhatia
2023 J jnl
Multim. Tools Appl.
Shefali Arora, Ruchi Mittal, Harshita Kukreja, M. P. S. Bhatia
2022 J jnl
Vis. Comput.
Shefali Arora, M. P. S. Bhatia, Vipul Mittal
2022 J jnl
Inf. Secur. J. A Glob. Perspect.
Shefali Arora, M. P. S. Bhatia
2022 J jnl
Multim. Syst.
Saurabh Raj Sangwan, M. P. S. Bhatia
2022 J jnl
ACM Trans. Asian Low Resour. Lang. Inf. Process.
Saurabh Raj Sangwan, M. P. S. Bhatia
2022 J jnl
Multim. Tools Appl.
Akshi Kumar, M. P. S. Bhatia, Saurabh Raj Sangwan
2020 J jnl
Int. J. Syst. Assur. Eng. Manag.
Shefali Arora, M. P. S. Bhatia
2020 conf
BigMM
Swaraj Kumar, Sandipan Dutta, Shaurya Chaturvedi, M. P. S. Bhatia
2019 J jnl
Int. J. Mach. Learn. Cybern.
Parneeta Sidhu, M. P. S. Bhatia
2019 B conf
IJCNN
Sandipan Dutta, Shaurya Chaturvedi, Swaraj Kumar, M. P. S. Bhatia
2018 conf
ICCCNT
Shefali Arora, M. P. S. Bhatia
2018 J jnl
J. Intell. Fuzzy Syst.
M. P. S. Bhatia, Pravin Veenu a Chandra
2018 J jnl
Int. J. Mach. Learn. Cybern.
Parneeta Sidhu, M. P. S. Bhatia
2016 J jnl
Int. J. Rough Sets Data Anal.
Rhythm Walia, M. P. S. Bhatia
2015 J jnl
Cybern. Syst.
Pooja Wadhwa, M. P. S. Bhatia
2015 J jnl
Int. J. Mach. Learn. Cybern.
Parneeta Sidhu, M. P. S. Bhatia
2015 conf
ICCCT
Ritesh Srivastava, Horesh Kumar, M. P. S. Bhatia, Shruti Jain
2015 conf
ReTIS
Parneeta Sidhu, M. P. S. Bhatia, Abhishek Ravi, Kirti Jherwal
2014 J jnl
Int. J. Virtual Communities Soc. Netw.
Pooja Wadhwa, M. P. S. Bhatia
2013 conf
ADBIS (2)
Parneeta Sidhu, M. P. S. Bhatia
2012 conf
ACITY (3)
Sunil Kr. Singh, R. K. Singh, M. P. S. Bhatia, Saurabh P. Singh
2010 J jnl
CoRR
Parneeta Dhaliwal, M. P. S. Bhatia, Priti Bansal
2010 A conf
ESA
Sunil Kr. Singh, R. K. Singh, M. P. S. Bhatia
2008 conf
BCBGC
Nidhi Arora, M. P. S. Bhatia
2007 A conf
RE
M. P. S. Bhatia, Abha Vasal
2003 conf
CAiSE Short Paper Proceedings
Naveen Prakash, M. P. S. Bhatia
2002 A conf
CAiSE
Naveen Prakash, M. P. S. Bhatia
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}"