Kamrul Hasan

61 papers B 7Misc 6Journal 24Unranked 24
YearRankTypeTitle / Venue / Authors
2026 conf
CCNC
Ahad Bin Islam Shoeb, Kamrul Hasan, Liang Hong, Tariqul Islam, Imtiaz Ahmed, Zoheb Hasan, Sumit Chakravarty
2026 conf
CCNC
Feras Shoukeir, Liang Hong, Kamrul Hasan
2026 J jnl
CoRR
Pulock Das, Al Amin, Kamrul Hasan, Rohan Thompson, Azubike D. Okpalaeze, Liang Hong
2026 Misc conf
ICNC
Al Amin, Kamrul Hasan, Liang Hong, Sharif Ullah
2026 Misc conf
ICNC
Henry Onyeka, Emmanuel J. Samson, Liang Hong, Tariqul Islam, Imtiaz Ahmed, Kamrul Hasan
2026 J jnl
CoRR
Faisal Haque Bappy, Tahrim Hossain, Raiful Hasan, Kamrul Hasan, Mohamed Younis, Tariqul Islam
2025 Misc conf
ICNC
Al Amin, Kamrul Hasan, Sharif Ullah, Liang Hong
2025 J jnl
CoRR
Al Amin, Kamrul Hasan, Sharif Ullah, Liang Hong
2025 conf
CCNC
Faisal Haque Bappy, Joon S. Park, Kamrul Hasan, Tariqul Islam
2025 conf
MILCOM
Pulok Tarafder, Imtiaz Ahmed, Danda B. Rawat, Zoheb Hassan, Kamrul Hasan
2025 J jnl
CoRR
Pulok Tarafder, Imtiaz Ahmed, Danda B. Rawat, Md. Zoheb Hassan, Kamrul Hasan
2025 J jnl
J. Rail Transp. Plan. Manag.
Al Amin, Deo Chimba, Kamrul Hasan
2025 Misc conf
ICNC
Emmanuel J. Samson, Kamrul Hasan, Liang Hong, Imtiaz Ahmed, Henry Onyeka, Sachin Shetty
2025 J jnl
CoRR
Al Amin, Kamrul Hasan, Liang Hong, Sharif Ullah
2025 J jnl
CoRR
Henry Onyeka, Emmanuel J. Samson, Liang Hong, Md Tariqul Islam, Imtiaz Ahmed, Kamrul Hasan
2025 conf
CCNC
Al Amin, Kamrul Hasan, Sharif Ullah, M. Shamim Hossain
2025 J jnl
IEEE Trans. Consumer Electron.
Al Amin, Kamrul Hasan, M. Shamim Hossain
2024 B conf
GLOBECOM
Al Amin, Kamrul Hasan, Saleh Zein-Sabatto, Liang Hong, Sachin Shetty, Imtiaz Ahmed, Tariqul Islam
2024 J jnl
CoRR
Al Amin, Kamrul Hasan, Saleh Zein-Sabatto, Liang Hong, Sachin Shetty, Imtiaz Ahmed, Tariqul Islam
2024 conf
ICC
Tariqul Islam, Faisal Haque Bappy, Md Nafis Ul Haque Shifat, Farhan Ahmad, Kamrul Hasan, Tarannum Shaila Zaman
2024 J jnl
CoRR
Tariqul Islam, Faisal Haque Bappy, Md Nafis Ul Haque Shifat, Farhan Ahmad, Kamrul Hasan, Tarannum Shaila Zaman
2024 J jnl
CoRR
Al Amin, Kamrul Hasan, Saleh Zein-Sabatto, Deo Chimba, Imtiaz Ahmed, Tariqul Islam
2024 conf
VTC Fall
Sarah Tanzina, Imtiaz Ahmed, Md. Sahabul Alam, Lutfa Akter, Kamrul Hasan, Samia Tasnim
2024 J jnl
CoRR
Faisal Haque Bappy, Joon S. Park, Kamrul Hasan, Tariqul Islam
2024 J jnl
CoRR
Al Amin, Kamrul Hasan, Saleh Zein-Sabatto, Deo Chimba, Liang Hong, Imtiaz Ahmed, Tariqul Islam
2024 Misc conf
ICNC
Ekramul Haque, Kamrul Hasan, Imtiaz Ahmed, Md. Sahabul Alam, Tariqul Islam
2024 J jnl
CoRR
Ekramul Haque, Kamrul Hasan, Imtiaz Ahmed, Md. Sahabul Alam, Tariqul Islam
2024 B conf
GLOBECOM
Faisal Haque Bappy, Tariqul Islam, Kamrul Hasan, Joon S. Park, Carlos E. Caicedo
2024 J jnl
CoRR
Faisal Haque Bappy, Kamrul Hasan, Joon S. Park, Carlos E. Caicedo Bastidas, Tariqul Islam
2024 J jnl
IT Prof.
Imtiaz Ahmed, Md. Zoheb Hassan, Majumder Haider, Kamrul Hasan
2024 conf
EIT
Daryl Mupupuni, Anupama Guntu, Liang Hong, Kamrul Hasan, Leehyun Keel
2024 J jnl
CoRR
Daryl Mupupuni, Anupama Guntu, Liang Hong, Kamrul Hasan, Leehyun Keel
2024 J jnl
CoRR
Daryl Mupupuni, Anupama Guntu, Liang Hong, Kamrul Hasan, Leehyun Keel
2024 J jnl
CoRR
Faisal Haque Bappy, Kamrul Hasan, Md Sajidul Islam Sajid, Mir Mehedi Ahsan Pritom, Tariqul Islam
2024 B conf
GLOBECOM
Faisal Haque Bappy, Tariqul Islam, Kamrul Hasan, Md Sajidul Islam Sajid, Mir Mehedi Ahsan Pritom
2024 conf
CCNC
Ekramul Haque, Kamrul Hasan, Imtiaz Ahmed, Md. Sahabul Alam, Tariqul Islam
2024 conf
EIT
Anupama Guntu, Daryl Mupupuni, Liang Hong, Kamrul Hasan, Leehyun Keel
2024 J jnl
CoRR
Al Amin, Kamrul Hasan, Sharif Ullah, M. Shamim Hossain
2024 conf
ICDM (Workshops)
Maraz Mia, Mir Mehedi A. Pritom, Tariqul Islam, Kamrul Hasan
2024 J jnl
CoRR
Maraz Mia, Mir Mehedi A. Pritom, Tariqul Islam, Kamrul Hasan
2023 conf
GLOBECOM (Workshops)
Al Amin, Kamrul Hasan, Saleh Zein-Sabatto, Deo Chimba, Imtiaz Ahmed, Tariqul Islam
2023 B conf
WiMob
Imtiaz Ahmed, Md. Zoheb Hassan, Ahmed Rubaai, Kamrul Hasan, Cong Pu, Jeffrey H. Reed
2023 conf
LATINCOM
Arianna Halamandaris, Md. Sahabul Alam, Imtiaz Ahmed, Kamrul Hasan, Georges Kaddoum
2023 conf
CSCloud/EdgeCom
Mirza Kamrul Bashar Shuhan, Tariqul Islam, Enam A. Shuvo, Faisal H. Bappy, Kamrul Hasan, Carlos Caicedo
2023 J jnl
CoRR
Mirza Kamrul Bashar Shuhan, Tariqul Islam, Enam Ahmed Shuvo, Faisal Haque Bappy, Kamrul Hasan, Carlos Caicedo
2023 B conf
GLOBECOM
Faisal Haque Bappy, Saklain Zaman, Tariqul Islam, Redwan Ahmed Rizvee, Joon S. Park, Kamrul Hasan
2023 J jnl
CoRR
Faisal Haque Bappy, Saklain Zaman, Tariqul Islam, Redwan Ahmed Rizvee, Joon S. Park, Kamrul Hasan
2023 conf
LATINCOM
Kamrul Hasan, Varshini Guduru, Saleh Zein-Sabatto, Deo Chimba, Imtiaz Ahmed
2022 conf
CSCloud/EdgeCom
Tariqul Islam, Kamrul Hasan, Saheb Singh, Joon S. Park
2022 B conf
ICCCN
Kamrul Hasan, Sachin Shetty, Tariqul Islam, Imtiaz Ahmed
2021 conf
CSCloud/EdgeCom
Mahmudul Hassan Ashik, Tariqul Islam, Kamrul Hasan, Kiho Lim
2021 J jnl
EAI Endorsed Trans. Security Safety
Kamrul Hasan, Sachin Shetty, Sharif Ullah, Amin Hassanzadeh, Tariqul Islam
2020 Misc conf
ICNC
Sharif Ullah, Sachin Shelly, Amin Hassanzadeh, Anup Nayak, Kamrul Hasan
2019 conf
CIC
Kamrul Hasan, Sachin Shetty, Sharif Ullah
2019 conf
SecureComm (2)
Sharif Ullah, Sachin Shetty, Anup Nayak, Amin Hassanzadeh, Kamrul Hasan
2019 conf
MILCOM
Kamrul Hasan, Sachin Shetty, Amin Hassanzadeh, Sharif Ullah
2019 B conf
GLOBECOM
Kamrul Hasan, Sachin Shetty, Sharif Ullah, Amin Hassanzadeh, Ethan Hadar
2018 conf
CNS
Kamrul Hasan, Sachin Shetty, Amin Hassanzadeh, Malek Ben Salem, Jay Chen
2018 conf
SpringSim (CNS)
Kamrul Hasan, Sachin Shetty, John Sokolowski, Deepak K. Tosh
2018 conf
CCTA
Kamrul Hasan, Sachin Shetty, Amin Hassanzadeh, Malek Ben Salem, Jay Chen
2017 conf
CCNC
Kamrul Hasan, Sachin Shetty, Taiwo Oyedare
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()